一、介绍
二、MainActivity启动流程
startActivityAsUser
---> startActivityMayWait (ActivityStackSupervisor.java)
---> startActivityLocked
---> startActivityUncheckedLocked
5、frameworks/base/services/java/com/android/server/am/ActivityStack.java
--->startActivityLocked (ActivityStack.java)
6、frameworks/base/services/java/com/android/server/am/ActivityStackSupervisor.java
--->resumeTopActivitiesLocked (ActivityStackSupervisor.java)
7、frameworks/base/services/java/com/android/server/am/ActivityStack.java
--->resumeTopActivityLocked (ActivityStack.java)
---> pauseBackStacks(userLeaving);
8、frameworks/base/core/java/android/app/ApplicationThreadNative.java
---> prev.app.thread.schedulePauseActivity
使用Binder通信:
SCHEDULE_PAUSE_ACTIVITY_TRANSACTION 9、frameworks/base/core/java/android/app/ActivityThread.java
启动函数:
schedulePauseActivity
sendMessage发送PAUSE_ACTIVITY
调用函数:handlePauseActivity
handlePauseActivity
--->performUserLeavingActivity 发送一个用户离开事件通知。
--->performPauseActivity 调用当前Acitvity的onPause函数
--->QueuedWork.waitToFinish(); 确保当前Activity下的写入磁盘之类操作完成
--->ActivityManagerNative.getDefault().activityPaused(token);
通知ActivityManagerService,当前的Activity已经Paused可以启动新apk的MainActivity了。
10、frameworks/base/core/java/android/app/ActivityManagerNative.java
activityPaused
使用Binder通信机制:
ACTIVITY_PAUSED_TRANSACTION
11、frameworks/base/services/java/com/android/server/am/ActivityManagerService.java
Binder启动函数:
activityPaused
--->stack.activityPausedLocked(token, false); 12、frameworks/base/services/java/com/android/server/am/ActivityStack.java activityPausedLocked
--->completePauseLocked();
--->mStackSupervisor.resumeTopActivitiesLocked 13、
frameworks/base/services/java/com/android/server/am/ActivityStackSupervisor.java
resumeTopActivitiesLocked ---> stack.resumeTopActivityLocked 14、frameworks/base/services/java/com/android/server/am/ActivityStack.java
resumeTopActivityLocked
---> startSpecificActivityLocked(next, true, true);
15、frameworks/base/services/java/com/android/server/am/ActivityStackSupervisor.java
startSpecificActivityLocked
--->realStartActivityLocked 如果准备启动的这个应用程序进程是已经启动了的,那么直接启动这个应用程序的Activity。
--->mService.startProcessLocked 如果没有,就先创建该应用程序进程,然后再启动它。
16、frameworks/base/services/java/com/android/server/am/ActivityManagerService.java
--->startProcessLocked
--->startProcessLocked
--->Process.start("android.app.ActivityThread",
17、frameworks/base/core/java/android/app/ActivityThread.java
---> main
--->ActivityThread thread = new ActivityThread();
---> thread.attach(false); attach--->
IActivityManager mgr = ActivityManagerNative.getDefault();
mgr.attachApplication(mAppThread);
18、frameworks/base/core/java/android/app/ActivityManagerNative.java
attachApplication
--->Binder通信到ActivityManagerServic
---> attachApplication
19、frameworks/base/services/java/com/android/server/am/ActivityManagerService.java
attachApplication
---> mStackSupervisor.attachApplicationLocked
20、frameworks/base/services/java/com/android/server/am/ActivityStackSupervisor.java
attachApplicationLocked
----> realStartActivityLocked 开始启动用户点击应用程序的Activity。
---->app.thread.scheduleLaunchActivity
21、frameworks/base/core/java/android/app/ActivityThread.java
scheduleLaunchActivity
---->sendMessage(H.LAUNCH_ACTIVITY, r);
22、 frameworks/base/core/java/android/app/ActivityThread.java
case LAUNCH_ACTIVITY: {
、、、、、、
handleLaunchActivity(r, null);
、、、、、、
break;
}
handleLaunchActivity
---> performLaunchActivity 启动点击应用程序的Activity
---> handleResumeActivity 将该Activity设置为Resume激活状态。 performLaunchActivity
----> mInstrumentation.callActivityOnCreate 进而启动调用Activity的OnCreate函数
handleResumeActivity
----> 调用刚刚启动Activity的Resume函数
ActivityManagerNative.getDefault().activityResumed(token);
三、启动同一进程子Activity
在该应用程序的MainActivity中启动位于同一个进程中的子Activity
基本步骤和启动MainActivity差不多,差别在:
1、通过Activity.startActivity()发送请求启动子Activity命令。
2、直接启动子Activity
frameworks/base/services/java/com/android/server/am/ActivityStackSupervisor.java void startSpecificActivityLocked(ActivityRecord r,
boolean andResume, boolean checkConfig) {
、、、、、、、、
if(、、、){
、、、、、、、、
realStartActivityLocked(r, app, andResume, checkConfig);
}else(、、、、){
、、、、、、、、
mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
、、、、、、、、
}
}
因为在之前启动MainActivity的时候,已经使用了函数startProcessLocked来创建了进程,所以在这次启动子Activity的时候就直接使用函数:realStartActivityLocked。
其他步骤,参考启动MainActivity的步骤。 三、启动不是同一进程子Activity
在该应用程序的MainActivity中启动不是同一个进程中的子Activity 基本步骤和启动同一个进程的子Activity差别不大。也是在函数通过Activity.startActivity()来启动。
在startSpecificActivityLocked调用的函数
---> mService.startProcessLocked 这个步骤和启动MainActivity相比,Android系统不需要创建新任务。
frameworks/base/services/java/com/android/server/am/ActivityStack.java
--->startActivityLocked(ActivityRecord r, boolean newTask,
boolean doResume, boolean keepCurTransition, Bundle options)
newTask该标志位可以判断是Mainactivity还是新进程的子Activity