Activity启动模式

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设置才有效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值