开发艺术探索—Activity的生命周期和启动模式

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

你可能感兴趣的:(开发艺术探索—Activity的生命周期和启动模式)