編輯:關於Android編程
在 Android Launcher啟動應用程序流程源碼解析一文中從點擊應用程序圖標startActivity()開始,一直講解到Application和MainActivity的onCreate()方法被調用。中間流程有些高能,高能部分是兩篇博文共有的地方,沒辦法繞開。本文主要講述從Activity#onCreate()到Activity#onResume()的流程。不啰嗦了,Here we go~
無論顯式還是隱式啟動Activity,都會進入到ActivityThread#handleLaunchActivity()
源碼位置:frameworks/base/core/java/android/app/ActivityThread.java
ActivityThread#handleLaunchActivity()
private final void handleLaunchActivity(ActivityClientRecord r, Intent customIntent) { ...... // 加載activity,然後調用onCreate,onStart方法 Activity a = performLaunchActivity(r, customIntent); if (a != null) { // 調用onResume方法 handleResumeActivity(r.token, false, r.isForward, !r.activity.mFinished && !r.startsNotResumed); ... } ... }
注釋有點劇透,,今天的重點全在這個方法裡。首先看下performLaunchActivity()
ActivityThread#performLaunchActivity()
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) { ... Activity activity = null; try { java.lang.ClassLoader cl = r.packageInfo.getClassLoader(); activity = mInstrumentation.newActivity( cl, component.getClassName(), r.intent); ... } ... try { Application app = r.packageInfo.makeApplication(false, mInstrumentation); if (activity != null) { ... activity.attach(...) ... if (r.isPersistable()) { mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState); } else { mInstrumentation.callActivityOnCreate(activity, r.state); } ... if (!r.activity.mFinished) { activity.performStart(); r.stopped = false; } ... return activity; }
mInstrumentation.callActivityOnCreate這行代碼的作用就是調用Activity#onCreate(),直接看activity.performStart(),這個方法的名字十分吸引人吶~跟進。
源碼位置:frameworks/base/core/java/android/app/Activity.java
Activity#performStart()
final void performStart() { mActivityTransitionState.setEnterActivityOptions(this, getActivityOptions()); mFragments.noteStateNotSaved(); mCalled = false; mFragments.execPendingActions(); mInstrumentation.callActivityOnStart(this); if (!mCalled) { throw new SuperNotCalledException( "Activity " + mComponent.toShortString() + " did not call through to super.onStart()"); } mFragments.dispatchStart(); mFragments.reportLoaderStart(); mActivityTransitionState.enterReady(this); }
真相已經呼之欲出了~,跟進。
源碼位置:frameworks/base/core/java/android/app/Instrumentation.java
Instrumentation#callActivityOnStart()
public void callActivityOnStart(Activity activity) { activity.onStart(); }
哈哈~又找到一個方法Activity#onStart()。真是輕而易舉~
現在回到ActivityThread#performLaunchActivity()中的handleResumeActivity(r.token, false, r.isForward, !r.activity.mFinished && !r.startsNotResumed),跟進。
源碼位置:frameworks/base/core/java/android/app/ActivityThread.java
ActivityThread#handleResumeActivity()
ActivityThread#ActivityClientRecord()
final void handleResumeActivity(IBinder token, boolean clearHide, boolean isForward, boolean reallyResume) { ... ActivityClientRecord r = performResumeActivity(token, clearHide); ... } public final ActivityClientRecord performResumeActivity(IBinder token, boolean clearHide) { ... r.activity.performResume(); ... }
中間都是各種狀態效驗,沒撒好說的。直接跟進。
源碼位置:frameworks/base/core/java/android/app/Activity.java
Activity#performResume()
final void performResume() { performRestart(); ... mInstrumentation.callActivityOnResume(this); ... }
在這裡有兩個分支
1. 在執行onResume()前需要先執行onRestart()和onStart()。例如從上個Activity返回的時候,這裡不作為重點,但也會稍微看下。
2. 直接執行onResume()
分支1:
Activity#performRestart()
final void performRestart() { ... mInstrumentation.callActivityOnRestart(this); performStart(); }
這兩個方法在上文都分析過了,不再贅述。
分支2:
源碼位置:frameworks/base/core/java/android/app/Instrumentation.java
Instrumentation#callActivityOnStart()
public void callActivityOnResume(Activity activity) { activity.mResumed = true; activity.onResume(); if (mActivityMonitors != null) { synchronized (mSync) { final int N = mActivityMonitors.size(); for (int i=0; i直接調用Activity#OnResume()。
寫這篇文章,做份備忘,簡單滴展示一個帶進度條的Webview示例,進度條位於Webview上面.示例圖如下:主Activity代碼:復制代碼 代碼如下:package c
概述:BitMap代表一張位圖,擴展名可以是.bmp或者.dib。位圖是Windows標准格式圖形文件,它將圖像定義為由點(像素)組成,每個點可以由多種色彩表示,包括2、
如果自定義的類型需要通過Intent或IPC進行傳遞,就需要對數據進行序列化處理。 下面是Android官網上的一個例子 public class MyP
新版手機QQ有一個洗功能就是QQ錢包,可以發紅包,如果我們想要使用qq錢包的功能的話,一般很多時候都要求我們綁定銀行卡的。那麼新版手機QQ怎麼綁定和解除銀行