Activity的启动流程分析

Activity启动分为很多种情况,这里说的是打开新的应用程序第一个Activity的流程。 

1. AcitivityManager产生新进程,新进程从android.app.ActivityThread.main开始运行。这里就是一般意义上的程序入口点,类似于C的main函数。

ActivityManagerService.java 

1  private final void startProcessLocked(ProcessRecord app, String hostingType, String hostingNameStr) {
2        // Process里面通知Zygote服务,Zygote真正产生新的进程(准确说是复制一个)
4        int pid = Process.start("android.app.ActivityThread",
6                     mSimpleProcessManagement ? app.processName : null, uid, uid,
7   }

 2.ActivityThread的main函数中将Looper准备起来,prepareMainLooper标志着这是应用程序主线程的Looper对象。

ActivityThread.java  

1 public static final void main(String[] args) {
2     Looper.prepareMainLooper();
3     ActivityThread thread = new ActivityThread();
4     thread.attach(false);
5     // 这里闭合消息循环 
6     Looper.loop();
7 }

 3. 接下来调用attach,参数为false,表明这不是系统进程,是给普通应用程序用使用的进程。

ActivityThread.java   

 1 private final void attach(boolean system) {
 2              ViewRoot.addFirstDrawHandler(new Runnable() {
 4                 public void run() {
 5                     ensureJitEnabled();
 6                 }
 7             });
 8             RuntimeInit.setApplicationObject(mAppThread.asBinder());
 9             IActivityManager mgr = ActivityManagerNative.getDefault();
10             mgr.attachApplication(mAppThread);
11     }

    mAppThread是ApplicationThread对象,是提供给ActivityManagerService控制ActivityThread的回调接口。

 1 private final class ApplicationThread extends ApplicationThreadNative {
 2 
 3   public final void schedulePauseActivity(IBinder token, boolean finished,boolean userLeaving, int  configChanges){
 4 
 5             queueOrSendMessage(finished ? H.PAUSE_ACTIVITY_FINISHING : H.PAUSE_ACTIVITY,
 6                     token, (userLeaving ? 1 : 0),  configChanges);
 7         }
 8 
 9   public final void scheduleStopActivity(IBinder token, boolean showWindow, int configChanges) {
10            queueOrSendMessage(showWindow ? H.STOP_ACTIVITY_SHOW : H.STOP_ACTIVITY_HIDE,
11                 token, 0, configChanges);
12         }
13 
14   .........
15 
16 }

    ActivityManagerService要Pause当前Activity,就会调用schedulePauseActivity想本地的消息循环中加入一个H.PAUSE_ACTIVITY的消息,然后立即返回以避免ActivityManagerService的阻塞。

 4.现在又回到了ActivityManagerService中

ActivityManagerService.java   

 1  // ActivityManagerService中XXXLocked函数才是真正干活的地方,XXX只是个套
 2 
 3     public final void attachApplication(IApplicationThread thread) {
 4         int callingPid = Binder.getCallingPid();
 5         attachApplicationLocked(thread, callingPid);
 6     }
 7 
 8  
 9 
10     private final boolean attachApplicationLocked(IApplicationThread thread, int pid) {
11 
12         // 这里取出对应该Pid的ProcessRecord对象,如果取不出来,你就等着out吧
13 
14         app = mPidsSelfLocked.get(pid)
15 
16         // 为ProcessRecord对象补充信息
17 
18         app.thread = thread;
19         app.curAdj = app.setAdj = -100;
20         app.curSchedGroup = Process.THREAD_GROUP_DEFAULT;
21         app.setSchedGroup = Process.THREAD_GROUP_BG_NONINTERACTIVE;
22         app.forcingToForeground = null;
23         app.foregroundServices = false;
24         app.debugging = false;
25         // 清除timeout监测 
26         mHandler.removeMessages(PROC_START_TIMEOUT_MSG, app);
27 
28  
29 
30         // 回调之前的ActivityThread,让它记住自己在ActivityManagerService中的相关信息,传这么大坨东西,真给力
31 
32         thread.bindApplication(processName, app.instrumentationInfo != null
33                     ? app.instrumentationInfo : app.info, providers,
34                     app.instrumentationClass, app.instrumentationProfileFile,
35                     app.instrumentationArguments, app.instrumentationWatcher, testMode, 
36                     isRestrictedBackupMode || !normalMode,
37                     mConfiguration, getCommonServicesLocked());
38 
39        // topRunningActivityLocked的意思没看太明白
40 
41        HistoryRecord hr = topRunningActivityLocked(null);
42 
43        // 启动Activity
44 
45        realStartActivityLocked(hr, app, true, true);
46 
47     }
48 
49  
50 
51     private final boolean realStartActivityLocked(HistoryRecord r,
52             ProcessRecord app, boolean andResume, boolean checkConfig){
53 
54         // 这里又跑到ActivityThread中去了
55 
56        app.thread.scheduleLaunchActivity(new Intent(r.intent), r, System.identityHashCode(r),
57                     r.info, r.icicle, results, newIntents, !andResume, isNextTransitionForward());
58 
59     }
60 
61  

 

5.ActivityThread开始调度用户的Activity启动了

ActivityThread.java

 1 private final void handleLaunchActivity(ActivityRecord r, Intent customIntent) {
 2        Activity a = performLaunchActivity(r, customIntent);
 3 
 4        ......
 5 
 6 }
 7 
 8 private final void performLaunchActivity(ActivityRecord r, Intent customIntent) {
 9 
10        java.lang.ClassLoader cl = r.packageInfo.getClassLoader();
11        // 产生Activity 
12        activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);
13 
14        // 将新生的Activity与当前应用关联
15 
16        activity.attach(appContext, this, getInstrumentation(), r.token,
17                        r.ident, app, r.intent, r.activityInfo, title, r.parent,
18                         r.embeddedID, r.lastNonConfigurationInstance,
19                         r.lastNonConfigurationChildInstances, config);
20 
21       .....
22 
23 }

 6.Acivity与当前App关联,直到这里,平时应用所见的Activity才真正被构建

Actiivty.java 

 1 final void attach(Context context, ActivityThread aThread, Instrumentation instr, IBinder token, int ident,
 2     Application application, Intent intent, ActivityInfo info,  CharSequence title, Activity parent, String id,
 3     Object lastNonConfigurationInstance, HashMap<String,Object> lastNonConfigurationChildInstances,
 4             Configuration config) {
 5 
 6        // 记录传入ContexImpl实例,这就是平时所见的Activity Context 
 7        attachBaseContext(context);
 8        // 创建与Activity关联的Window,可以简单理解为显示窗口 
 9        mWindow = PolicyManager.makeNewWindow(this);
10 
11        mUiThread = Thread.currentThread();
12 
13        mMainThread = aThread;
14        mInstrumentation = instr;
15        mToken = token;
16        mIdent = ident;
17        mApplication = application;
18        mIntent = intent;
19        mComponent = intent.getComponent();
20        mActivityInfo = info;
21        mTitle = title;
22        mParent = parent;
23        mEmbeddedID = id;
24       // 构建WindowManager的代理LocalWindowManager 
25        mWindow.setWindowManager(null, mToken, mComponent.flattenToString());
26        if (mParent != null) {
27             // 难道说整个Activity栈中的Activity都有同一个Container 
28             mWindow.setContainer(mParent.getWindow());
29        }
30        mWindowManager = mWindow.getWindowManager();
31 
32     }

 7.ActivityThread

ActivityThread.java

 1 private final void performLaunchActivity(ActivityRecord r, Intent customIntent) {
 2 
 3        ......
 4 
 5        // 回调Activity::onCreate
 6 
 7        mInstrumentation.callActivityOnCreate(activity, r.state);
 8 
 9         // 记录新产生的Activity 
10        mActivities.put(r.token, r);
11 
12 }
13 
14 private final void handleLaunchActivity(ActivityRecord r, Intent customIntent) {
15 
16        ......
17 
18        handleResumeActivity(r.token, false, r.isForward);
19 
20 }
21 
22  final void handleResumeActivity(IBinder token, boolean clearHide, boolean isForward) {
23 
24        ActivityRecord r = performResumeActivity(token, clearHide);
25 
26  
27 
28 }
29 
30 public final ActivityRecord performResumeActivity(IBinder token, boolean clearHide) {
31 
32         if (r.pendingIntents != null) {
33               deliverNewIntents(r, r.pendingIntents);
34               r.pendingIntents = null;
35        }
36        if (r.pendingResults != null) {
37               deliverResults(r, r.pendingResults);
38               r.pendingResults = null;
39        }
40        //回调Activity::onResume 
41        r.activity.performResume();
42 
43 }

      到这里,Activity从产生到初始化的过程就全部结束了。之后就是等待用户界面的消息,根据消息进行相应的处理。整个过程中,在ActivityManagerServer、ActivityThread的互相协作下构建出Activity,并在相应的时机回调Activity的相应接口,完成Activity的初始化。

posted @ 2014-08-08 14:43  mjsky  阅读(752)  评论(0编辑  收藏  举报