Activtiy的启动涉及AMS,ActivityThread,Instrumentation,首先由Instrumentation通过Binder通知AMS,在AMS的内部有一个ActivityStack管理栈内的Activty,AMS通过ActivityThread同步Activity的状态完成生命周期方法的调用;
当启动一个新的activity的时候,会先调用当前栈顶的activity的onPause(),然后在调用新的activity,最后stop旧activity;
注意在onPause中不可以做耗时操作,会影响新activity的显示
启动模式
Task任务栈
activity可以理解为Application中的一个页面,是App层面的,task是操作系统层面存放activity的一个栈,在安卓手机的menu按键下出来的后台界面里的就是一个task任务栈;
-
Standard:
每次都会新建一个activity实例,当从非Activity的context启动activity时,需要带new_task的flag;当启动一个带有affinity的activity,如果这个activity已经有实例存在该task,则不会重新创建;
-
SingleTop:
如果栈定存在这个activity实例,就不会创建,会调用onNewIntent(),并且,onStart()和onResume()也不会调用,如果栈顶不存在(有实例不在顶部或者没有实例)就会新建一个activity,调用create,start,resume;
SingleTask:
当前任务栈中只能存在一个实例,如果有就不新建实例,将当前实例上的activity抛出(clearTop)
,并回调onNewIntent(),
SingleInstance:
当前activity的实例独享这个任务栈
使用场景
LaunchMode | 使用场景 |
---|---|
singleTop | 登录页面,通知的内容显示页面 |
singleTask | MainActivity页面,webview页面,扫一扫页面,支付页面 |
singleInstance | 锁屏页,电话通话页面,闹钟响铃页面 |
Flags
除了在manifest中配置Activity的启动模式,还可以在代码中通过intent指定Flag,代码中的优先级大于manifest,这样的原因是manifest只有Activity的开发者能设置,可是如果使用者需要设置就无法改变manifest,使用只能通过intent配置,下面介绍几个常见的Flag;
-
FLAG_ACTIVITY_NEW_TASK:指定singleTask启动模式
-
FLAG_ACTIVITY_SINGLE_TOP:指定singleTop启动模式
-
FLAG_ACTIVITY_CLEAR_TOP:清除在task中上面的activity