这篇文章就要想讲一讲Activity的启动过程,首先声明一点,关于Activity的启动过程,我研究得不是很深入,也是参考了网上有资料,然后看了一下Android底层的源码。
我们都知道,要启动一个Activity是很容易的,Context#startActivity(Intent)就行了,这个Activity就显示出来了。但是它内部是如何调用这些Activity的生命周期函数的?如果创建Activity对象的?
研究这些很有意义,当以后遇到复杂一点的关于Activity的问题,如果有这方面的经验,那是多么的重要。
1,启动
当我们启动一个Acitvity时,LogCat会打出一句话:
I/ActivityManager(2233): Starting: Intent { cmp=com.toshiba.ebook.bookplace/.activity.OobeWiFiSetActivity } from pid 2342
这表示这个Activity开始启动了,这句话是在哪里打出来的?是在ActivityStack#startActivityLocked中输出的,路径是 frameworks\base\services\java\com\android\server\am,
2,显示
当Activity显示时,就是在调用onResume之后,它会显示一句:
I/ActivityManager(2233): Displayed com.toshiba.ebook.bookplace/.activity.OobeWiFiSetActivity: +500ms
这句话是在ActivityRecord#windowsVisible中输出的,路径是:frameworks\base\services\java\com\android\server\am
windowsVisible方法会中WindowManagerService中调用 (7994行)
public void windowsVisible() { StringBuilder sb = service.mStringBuilder; sb.setLength(0); sb.append("Displayed "); sb.append(shortComponentName); sb.append(": "); TimeUtils.formatDuration(thisTime, sb); if (thisTime != totalTime) { sb.append(" (total "); TimeUtils.formatDuration(totalTime, sb); sb.append(")"); } Log.i(ActivityManagerService.TAG, sb.toString()); ... }
**android.process.acore进程 1,Acticity.startActivityForResult() 2,Instrumention.execStartActivity(); 3,ActivityManagerNative.getDefault().startActivity() 3.1 ActivityManagerNative.getDefault()返回的是ActivityManagerProxy的实例, 它只是一个代理类,这个代理类实际上代理的是IBinder b = ServiceManager.getService("activity"); 3.2 这个Service是什么时候添加进来的呢? 在SystemServer.java的run()中有调用 ActivityManagerService.setSystemProcess(); ServiceManager.addService("activity", m); 这里还会添加许多系统关键服务。(TODO:查看在SystemServer的Log输出) **system_process进程 4,ActivityManagerNative |--ActivityManagerService 在ActivityManagerNative的onTransact方法中最终提供了服务: case START_ACTIVITY_TRANSACTION: ActivityManagerService.startActivity(); --startActivityLocked(IApplicationThread caller, Intent intent, String resolvedType, Uri[] grantedUriPermissions, int grantedMode, ActivityInfo aInfo, IBinder resultTo, String resultWho, int requestCode, int callingPid, int callingUid, boolean onlyIfNeeded, boolean componentSpecified) --startActivityUncheckedLocked(r, sourceRecord, grantedUriPermissions, grantedMode, onlyIfNeeded, true) //在这个方法里面检查权限,解析intent中的Flag. --startActivityLocked(HistoryRecord r, boolean newTask) --resumeTopActivityLocked(HistoryRecord prev) --startSpecificActivityLocked(HistoryRecord r,boolean andResume, boolean checkConfig) --startProcessLocked(String processName,ApplicationInfo info,boolean knownToBeDead,int intentFlags,String hostingType,ComponentName,hostingName) --startProcessLocked(ProcessRecord app,String hostingType, String hostingNameStr) //在这里启动一个进程用来host这个应用 int pid = Process.start("android.app.ActivityThread", mSimpleProcessManagement ? app.processName : null, uid, uid, gids, debugFlags, null); 5,ActivityManagerService.java --startSpecificActivityLocked(HistoryRecord r,boolean andResume, boolean checkConfig) --realStartActivityLocked(HistoryRecord r,ProcessRecord app, boolean andResume, boolean checkConfig) --app.thread.scheduleLaunchActivity //scheduleLaunchActivity()@IApplicationThread.java --scheduleLaunchActivity()@ActivityThread.java //这里实际是ApplicationThreadNative提供的服务 --handleMessage()@H$ActivityThread.java --handleLaunchActivity()@ActivityThread.java --Activity performLaunchActivity(ActivityRecord r, Intent customIntent)@ActivityThread.java //这时真正的Activity对象被构造出来 --mInstrumentation.newActivity() //通过反射构造出Activity对象 --activity.attach() //初始化Activity,生成一个window对象,设置各种状态等等 --mInstrumentation.callActivityOnCreate(activity, r.state); //调用Activity的onCreate()方法 到这里,我们自己写的activity的onCreate()方法已经被系统调用了,接下来依次回调生命周期方法: --activity.performStart(); --mInstrumentation.callActivityOnStart(this); --mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state); --mInstrumentation.callActivityOnPostCreate(activity, r.state); --mActivities.put(r.token, r); //将这个activity入栈 然后就要调用onResume()方法了: --handleResumeActivity(IBinder token, boolean clearHide, boolean isForward) --performResumeActivity(token, clearHide); --r.activity.performResume(); //开始调用Activity的生命周期方法 --performRestart()@Activity.java; --mInstrumentation.callActivityOnRestart(this); --mInstrumentation.callActivityOnStart(this); --mInstrumentation.callActivityOnResume(this); onResume()已经调用完毕,一个activity的逻辑处理结束了,但是这时候屏幕上还不会显示任何东西,因为View还没有添加进去 --r.window.getDecorView(); //开始把DecorView添加进Window --wm.addView(decor, l); 至此一个Activity启动结束。