链接: Activity启动流程.
Android 8.0 Activity启动流程
1、Activity--------> startActivity() +4840
|
|
2、Activity--------> startActivityForResult() +4479
|
|
3、Activity--------> startActivityForResult() +4521
|
|
4、Instrumentation--------> execStartActivity() +1748
|
|
int result = ()
.startActivity(whoThread, (), intent,
(()),
token, target, requestCode, 0, null, options);
|
|
5、ActivityManager--------> getService() +4218
|
public static IActivityManager getService() {
return ();
}
private static final Singleton<IActivityManager> IActivityManagerSingleton =
new Singleton<IActivityManager>() {
@Override
protected IActivityManager create() {
final IBinder b = (Context.ACTIVITY_SERVICE);
final IActivityManager am = (b);
return am;
}
};
()获得的是(obj)
获取可以在./LINUX/android/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/core/java/android/app/ +36
public static asInterface( obj)
{
if ((obj==null)) {
return null;
}
iin = (DESCRIPTOR);
if (((iin!=null)&&(iin instanceof ))) {
return (()iin);
}
return new (obj);
}
|
(IActivityManager是ActivityManagerService的存根,ActivityManagerService还
包含一个代理服务类ActivityManagerProxy(Android 5.0之前的流程)ActivityManagerProxy--------> startActivity())
|
|以上都是在同一个进程中进行通信,下面流程就涉及到跨进程通信
|
|
6、ActivityManagerService--------> startActivity() +4604
|
|
7、ActivityManagerService--------> startActivityAsUser() +4617
|
|
8、ActivityStarter--------> startActivityMayWait() +712
|
|
9、ActivityStackSupervisor--------> resolveIntent() +1312
|
|
10、ActivityStackSupervisor--------> resolveIntent() +1317
|
ResolveInfo resolveIntent(Intent intent, String resolvedType, int userId, int flags) {
synchronized (mService) {
return ().resolveIntent(intent, resolvedType,
PackageManager.MATCH_INSTANT | PackageManager.MATCH_DEFAULT_ONLY | flags
| ActivityManagerService.STOCK_PM_FLAGS, userId);
}
}
()得到的是PackageManagerInternal,PackageManagerInternal是一个抽象类,具体实现是在PackageMangerService的PackageManagerInternalImpl内部类中
|
|PackageManagerService(PackageManagerInternalImpl)----->resolveIntent() +25798
|在queryIntentActivitiesInternal()方法中进行扫描app,注册组件;涉及到Activity优先级方面的问题在chooseBestActivity()方法
|
执行完上面的PackageManagerService流程之后,返回ActivityStarter----> startActivityMayWait () +712后续流程往下
|走
|
11、ActivityStarter--------> startActivityMayWait() +829
|
|验证intent、Class、Permission等
|保存将要启动的Activity的Record
|
|
12、ActivityStarter--------> startActivityLocked() +283
|
|
13、ActivityStarter--------> startActivity() +581
|
|
14、ActivityStarter--------> startActivity() +1006
|
|
15、ActivityStarter--------> startActivityUnchecked() +1254
|
|在computeLaunchingTaskFlags()方法中
|检查将要启动的Activity的launchMode和启动Flag
|根据launcheMode和Flag配置task
||
|
16、ActivityStackSupervisor--------> resumeFocusedStackTopActivityLocked()+2109
|
|
17、ActivityStack--------> resumeTopActivityUncheckedLocked() +2267
|
|
18、ActivityStack--------> resumeTopActivityInnerLocked() +2434
|
|查找要进入暂停的Activity
|
|
19、ActivityStack--------> startPausingLocked () +1359
|
if ( != null && != null) {
if (DEBUG_PAUSE)
(TAG_PAUSE, "Enqueueing pending pause: " + prev);
try {
(EventLogTags.AM_PAUSE_ACTIVITY,
, (prev),
);
(prev, false);
(, ,
userLeaving, , pauseImmediately);
} catch (Exception e) {
// Ignore exception, if process died other code will cleanup.
(TAG, "Exception thrown during pause", e);
mPausingActivity = null;
mLastPausedActivity = null;
mLastNoHistoryActivity = null;
}
} else {
mPausingActivity = null;
mLastPausedActivity = null;
mLastNoHistoryActivity = null;
}
指的是IApplicationThread
ActivityThread的内部类ApplicationThread实现的相关方法
|
|通过ipc告诉要暂停的Activity进入暂停
|
|
20、ActivityThread--------> schedulePauseActivity () +713
|
|通过查找PAUSE_ACTIVITY_FINISHING查看sendMessage后续消息通讯流程
|
|
21、ActivityThread--------> handleMessage() +1612
|
|
22、ActivityThread--------> handlePauseActivity() +3829
|
|1、正式让之前的Activity暂停
|2、告诉AMS已经暂停完成
|
|
23、ActivityThread--------> performPauseActivity () +3855
|
|
24、ActivityThread--------> performPauseActivity () +3881
|
|
25、ActivityThread--------> performPauseActivityIfNeeded() +3904
|
|
26、Instrumentation--------> callActivityOnPause () +1409
|
|
27、Activity--------> performPause () +7187
|
|
28、Activity--------> onPause () +1675
|
|此时之前的Activity已经执行完onPause暂停操作
|
执行完onPause操作,我们返回到handlePauseActivity()操作的后续流程
|
|
29、ActivityThread--------> handlePauseActivity() +3839
|
执行().activityPaused(token)语句,就是告诉AMS已经执行完暂停操作
|
|
30、ActivityManagerService--------> activityPaused() +7610
|
|
31、ActivityStack--------> activityPausedLocked() +1425
|
|
32、ActivityStack--------> completePauseLocked() +1498
|
|
33、ActivityStackSuperVisor--------> resumeFocusedStackTopActivityLocked()+2109
|
|
34、ActivityStack--------> resumeTopActivityUncheckedLocked() +2267
|
|
35、ActivityStack--------> resumeTopActivityInnerLocked() +2754
|
|验证是否该启动的Activity所在进程和app是否存在,若存在,直接启动
|否则,准备创建该进程
|
|
36、ActivityStackSuperVisor--------> startSpecificActivityLocked() +1606
|
|该进程不存在,创建进程
|
|
37、ActivityManagerService--------> startProcessLocked() +3707
|
|
38、ActivityManagerService--------> startProcessLocked() +3821
|
|
39、ActivityManagerService--------> startProcessLocked() +3999
|
|通过(“”)启动进程
|
|
40、ActivityThread--------> main() +6505
|
|
41、ActivityThread--------> attach() +6354
|
|
42、ActivityManagerService--------> attachApplication() +7347
|
| IActivityManager是ActivityManagerService的存根
|
|
43、ActivityManagerService--------> attachApplicationLocked () +7280
|
|
44、ActivityStackSuperVisor--------> attachApplicationLocked() +990
|
|准备启动应用,先查找MainActivity
|
|
45、ActivityStackSuperVisor--------> realStartActivityLocked() +1473
|
|IPC通知ActivityThread
|
|
46、ActivityThread--------> scheduleLaunchActivity() +791
|
查找LAUNCH_ACTIVITY继续后续消息通信流程
|
|
47、ActivityThread----------> handleMessage() +1592
|
|
48、ActivityThread----------> handleLaunchActivity() +2859
|
|
49、ActivityThread----------> performLaunchActivity() +2672
|
|
50、Instrumentation----------> newActivity() +1175
|
public Activity newActivity(ClassLoader cl, String className,
Intent intent)
throws InstantiationException, IllegalAccessException,
ClassNotFoundException {
return (Activity)(className).newInstance();
}
通过反射机制来获取类名,(Activity)(className).newInstance()获取就是要启动的Activity的类名
其中一些主要的类:
1、ActivityManagerService: ActivityManagerNative
ActivityManagerService(以后简称AMS):AMS是Android中最核心的服务,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块相类似,它在Android中非常重要。
2、ActivityStackSupervisor : 管理整个手机任务栈
它是栈的大管家。ActivityStackSupervisor在AMS中的构造方法中被创建。
3、ActivityStack: Activity的栈(任务栈)
它是一个管理类,用来管理系统所有Activity的各种状态。
4、PackageManagerService: 完成组件在清单里的扫描和注册
它负责系统中Package的管理,应用程序的安装、卸载、信息查询等。定义了服务端和客户端通信的业务函数,还定义了内部类Stub,该类从Binder派生并实现了IPackageManager接口。因此PackageManagerService将作为服务端参与Binder通信。
5、ActivityThread: 安卓java应用层的入口函数类
ActivitiyThread是应用程序概念空间的一个概念,他建立了应用进程运行的框架,并提供了一个IActivityThread接口作为与 Activity Manager Service的通讯接口.通过该接口AMS可以将Activity的状态变化传递到客户端的Activity对象。
ActiveThread是每一个应用程序所在进程的主线程,循环的消息处理
ActiveThread与AcitivityManagerService的通信是属于进程间通信,使用binder机制
有关ActivityThread相关知识点可以参考: ActivityThread
启动大致流程总结:
当创建一个activity,那这个activity一些相关信息就会传递到远程服务类ActivityManagerService,由ActivityManagerService发起ActivityStackSupervisor的管理,ActivityStackSupervisor会对当前的activity进行判断,判断该activity是新启一个任务还是放到旧的任务栈中,该activity是放到ActivityStack任务栈中,因为新加了一个activity,那么之前那些的activity就要进入pause状态,就需要查找哪个activity被pause,找到之后通知ActivityStackSupervisor即将被pause的activity的ActivityThread执行暂停操作,执行完暂停操作由ActivityThread回馈给ActivityManagerService, 告诉ActivityManagerService该activity已经执行完暂停操作了。由ActivityManagerService开始邀请ActivityStackSupervisor继续新的activity的复活或启动任务,然后ActivityStackSupervisor会找到ActivityStack,找到有焦点的activity并且找到顶部的activity,由顶部的activity来判断该activity应用进程是否存在,如果不存在,启动任务和进程,启动进程就会找到ActivityStackSupervisor的realStartActivity,并且通过(“”)启动进程,然后通过Zygote程序来fork出一个进程出来,再有底层反馈回来,去启动我们新的应用程序ActivityThread的main函数,启动完成之后通过attachApplication来启动一个application对象,把application进行绑定,继续通过连接ActivityManagerService来启动MainActivity,最终由ActivityMangerService发挥进程找到ActivityThread,调用scheduleLaunchActivity()来启动activity。
假如启动Activity A之后启动Activity B,流程为 :
1)Activity A先执行onPause() 操作
2)Activity B依次执行 onCreate()、onstart()、onResume()操作
3)Activity A执行onStop() 操作