Android Activity起動プロセスソース解析
7628 ワード
Android Launcher起動アプリケーションフローソース解析では、アプリケーションアイコン
明示的に起動しても暗黙的に起動しても
ソースの場所:frameworks/base/core/java/android/app/ActivityThread.java ActivityThread#handleLaunchActivity()
注釈はちょっとドラマチックで、今日のポイントはすべてこの方法の中にあります.まず
ActivityThread#performLaunchActivity()
ソースの場所:frameworks/base/core/java/android/app/Activity.java Activity#performStart()
真相はすでに叫び出した~、フォロー.
ソースの場所:frameworks/base/core/java/android/app/Instrumentation.java Instrumentation#callActivityOnStart()
ははは~また一つの方法を見つけた
ソースの場所:frameworks/base/core/java/android/app/ActivityThread.java ActivityThread#handleResumeActivity() ActivityThread#ActivityClientRecord()
中にはいろいろな状態が効いていて、何も言えませんでした.直接フォローする.
ソースの場所:frameworks/base/core/java/android/app/Activity.java Activity#performResume()
ここには2つの分岐がある.
この2つの方法は上述したように分析されたので,これ以上述べない.
ブランチ2:ソースコード位置:frameworks/base/core/java/android/app/Instrumentation.java Instrumentation#callActivityOnStart()
ダイレクトコール
終わりました.このブログの終わりは前のどのブログよりも速く、理解しやすいです.このすべての前提は、私の元のブログAndroid Launcherを読んでアプリケーションプロセスのソースコード解析を開始することです.
その他のFrameworkソース解析は、Frameworkソース解析シリーズ[ディレクトリ]に移動してください.
startActivity()
をクリックすることから、Application
とMainActivity
に説明されているonCreate()
の方法が呼び出されます.中間の流れにはいくつかの高エネルギーがあり、高エネルギー部分は2編の博文が共有している場所で、迂回することはできません.本明細書では、Activity#onCreate()
からActivity#onResume()
までの流れについて主に説明する.遡及したい学生は、Android Launcherがアプリケーションプロセスのソースコード解析を開始した後、このブログを振り返ることをお勧めします.くどくど言わないで明示的に起動しても暗黙的に起動しても
Activity
に入ります.ソースの場所: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);
...
}
...
}
注釈はちょっとドラマチックで、今日のポイントはすべてこの方法の中にあります.まず
ActivityThread#handleLaunchActivity()
を見てみましょう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;
}
performLaunchActivity()
行のコードの役割はmInstrumentation.callActivityOnCreate
を呼び出すことであり、Android Launcherでアプリケーションプロセスを開始するソースコード解析が紹介されているので、ここでは省略します.Activity#onCreate()
を直接見ると、この方法の名前はとても魅力的ですね~フォローします.ソースの場所: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.performStart()
.本当に簡単ですね~今Activity#onStart()
の中のActivityThread#performLaunchActivity()
に戻って、フォローします.ソースの場所: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);
...
}
ここには2つの分岐がある.
handleResumeActivity(r.token, false, r.isForward, !r.activity.mFinished && !r.startsNotResumed)
を実行する前に、onResume()
およびonRestart()
を実行する必要がある.例えば、前のonStart()
から戻ってきたときは、ここがポイントではありませんが、少し見ています.2.直接実行Activity
ブランチ1:Activity#performRestart() final void performRestart() {
...
mInstrumentation.callActivityOnRestart(this);
performStart();
}
この2つの方法は上述したように分析されたので,これ以上述べない.
ブランチ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; ifinal ActivityMonitor am = mActivityMonitors.get(i);
am.match(activity, activity, activity.getIntent());
}
}
}
}
ダイレクトコール
onResume()
.終わりました.このブログの終わりは前のどのブログよりも速く、理解しやすいです.このすべての前提は、私の元のブログAndroid Launcherを読んでアプリケーションプロセスのソースコード解析を開始することです.
その他のFrameworkソース解析は、Frameworkソース解析シリーズ[ディレクトリ]に移動してください.