Activity的启动模式以及任务栈

https://github.com/NieJianJian/AndroidNotes,内容将持续更新,欢迎star。


1. Activity的启动模式

Activity的启动模式有四种,分别是:standard、singleTop、singleTask、singleInstance。它们的使用方法是在AndroidManifest中设置Activity的android:launchMode属性:

<activity android:name=".MainActivity" android:launchMode="singleTask" />

还可以通过Intent中设置标识位来为Activity指定启动模式:

Intent intent = new Intent(this, SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

当以上两种方式同时存在的时候,以第二种方式为准。

1.1 四种启动模式介绍
  • standard

    标准模式。每次都会创建新的实例,谁启动了这个Activity,那么这个Activity就运行在启动它的那个Activity所在的栈中。

  • singleTop

    栈顶复用模式。在启动时判断要启动的Activity是否已经位于栈顶,如果是则不会创建新的Activity实例,同时它的onNewIntent方法会被回调;如果要启动的Activity已经存在与栈中,但不是位于栈顶,同样需要创建新的Activity实例。栈顶复用的生命周期调用链如下:

    onPause -> onNewIntent -> onResume
    
  • singleTask

    栈内复用模式。只要启动的Activity在栈内存在,那么多次启动该Activity都不会创建新的实例,不管是不是位于栈顶。和singleTop一样会调用onNewIntent方法。singltTask还有一个特殊的属性,会将栈内位于该启动Activity之上的Activity全部销毁。

    上述的情况是同一个APP中启动这个singleTask的Activity,如果其他程序启动这个singleTask模式的Activity,那么会创建一个新的任务栈。

    如果启动模式为singleTask的Activity已经在一个后台任务栈中,那么启动后,后台的这个任务栈将被一起切换到前台。

  • singleInstance

    单实例模式。会创建一个新的任务栈存放要启动的Activity,而且该任务栈中只存在这一个Activity。假设应用A的任务栈中创建了MainActivity的实例,且启动模式为singleInstance,如果应用B也要启动MainActivity,则不需要创建,两个应用共享该Activity实例。

1.2 使用场景:
  • standard:默认的启动模式,如果不指定Activity的启动模式,则使用这种方式启动Activity。
  • singleTop:常用于详情页,比如微信接收到10条通知栏消息,我们不可能创建10个实例,所以采用singleTop
  • singleTask:常用于Home主页面,不管在哪个页面返回到主页面,都cleanTop清除掉主页面之上的页面。也可用于退出整个应用:在要退出的Activity中转到启动模式为singleTask的主Activity,从而将主Activity之上的Activity都清除掉,然后重写主Activity的onNewIntent方法,然后调用finish()。
  • singleInstance:常见于闹钟页面、来电页面。
1.3 其他
  1. 用ApplicationContext去启动Activity会报错,错误如下:

    android.util.AndroidRuntimeException: Calling startActivity
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值