Activity的启动模式
Activity有4中启动模式,standard、singleTop、singleTask、singleInstance,可以通过AndroidManifest里面activity标签下的launchMode来设置,或者在代码中通过Intent的Flag参数来设置。
standard
standard是默认的启动方式,每次启动Activity都会创建一个新的实例。
生命周期如下:
onPause -> launchmode.SingleTopActivity
onCreate -> launchmode.StandardActivity
onStart -> launchmode.StandardActivity
onResume -> launchmode.StandardActivity
onStop -> launchmode.SingleTopActivity
singleTop
singleTop,栈顶复用,启动时,如果被启动的activity正好处于栈顶,则不会调用onCreate,而是调用onNewIntent去
1、要启动的Activity正好在栈顶:
onPause -> launchmode.SingleTopActivity
onNewIntent -> launchmode.SingleTopActivity
onResume -> launchmode.SingleTopActivity
2、不在栈顶(跟standard一样):
onPause -> launchmode.SingleTaskActivity
onCreate -> launchmode.SingleTopActivity
onStart -> launchmode.SingleTopActivity
onResume -> launchmode.SingleTopActivity
onStop -> launchmode.SingleTaskActivity
singleTask
singleTask模式下,每次启动activity会检查Activity栈内是否有当前activity的实例存在,如果有,则将实例置为栈顶(不创建实例,只调用onNewIntent,然后restart,),并清空实例上方的所有其他activity,确保只有一个实例存在。
当前activity在栈顶时,再启动不会创建实例,而是调用onNewIntent
onPause -> launchmode.SingleTaskActivity
onNewIntent -> launchmode.SingleTaskActivity
onResume -> launchmode.SingleTaskActivity
不在栈顶时(会干掉原本在它上方的所有Activity,所以会看到onDestroy的调用,很强势啊):
onPause -> launchmode.StandardActivity
onNewIntent -> launchmode.SingleTaskActivity
onRestart -> launchmode.SingleTaskActivity
onStart -> launchmode.SingleTaskActivity
onResume -> launchmode.SingleTaskActivity
onStop -> launchmode.StandardActivity
onDestroy -> launchmode.StandardActivity
singleInstance
singleInstance,保证整个设备只有一个Activity实例。启动时如果当前activity不在栈中,则另起一个任务栈,将这个activity放入其中。此时如果再启动其他启动模式的Activity,则仍旧在原来的栈去创建或启动新的实例,所以任务栈的数量 = singleInstance Activity实例数量+1,1为默认的栈
第一次启动时生命周期也和standard一样
onPause -> launchmode.SingleTopActivity
onCreate -> launchmode.SingleInstanceActivity
onStart -> launchmode.SingleInstanceActivity
onResume -> launchmode.SingleInstanceActivity
onStop -> launchmode.SingleTopActivity
如果当前activity已经被创建过一次,则再次启动不会再次创建实例,只会调用onNewIntent和onRestart:
onNewIntent -> launchmode.SingleInstanceActivity
onRestart -> launchmode.SingleInstanceActivity
onStart -> launchmode.SingleInstanceActivity
onResume -> launchmode.SingleInstanceActivity
点HOME键,再从最近任务返回时的生命周期(跟启动模式无关)
onPause -> launchmode.SingleInstanceActivity
onStop -> launchmode.SingleInstanceActivity
onRestart -> launchmode.SingleInstanceActivity
onStart -> launchmode.SingleInstanceActivity
onResume -> launchmode.SingleInstanceActivity
onNewIntent传递参数
场景:再Service或者Receiver里面收到数据时,将数据更新到Activity,这个时候,可以将Activity的启动模式设置为singleTask或者SingleTop,然后在service/Receiver里将数据放入Intent,然后startActivity(Intent),这样在onNewIntent里就会拿到数据。
@Override
protected void onNewIntent(Intent intent) {
String msg = intent.getStringExtra("data");
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
}
excludeFromRecents
通过在AndroidManifest里面设置Activity的excludeFromRecents
为true,让程序不出现在最近任务列表里,只有在启动的Activity设置才有效。