您的位置:首页 > 移动开发 > Android开发

【Android Activity相关】任务栈、启动模式相关问题总结

2017-12-14 16:09 363 查看

1.

任务栈




    任务栈在android当中真的是非常非常重要的概念。“栈”顾名思义是一个先进后出的容器,“任务栈”是用来存储Activity的,当我们打开一个新的Activity或者退出一个Activity,都会在“任务栈”中添加或删除这个Activity,所以一个“任务栈”其实是包含了一个Activity的集合,Android系统可以通过任务栈有序地管理每一个Activity。
    在Android系统中,退出一个应用程序,必须要把“任务栈”中的Activity都清除出栈,才能安全地完全地退出程序。当按下back键的时候,栈内Activity会一个一个地出栈,并且调用其onDestroy方法。如果任务栈中没有Activity,就把这个任务栈销毁。另外,一个App默认只有一个任务栈,以App包名来命名。

2.

启动模式

    (1)standard:标准模式。在这种模式下,每次启动Activity都会重新创建一个新的Activity实例,并将其压入栈顶,不管这个Activity是否存在。 在这种模式下,每创建一个Activity都会走一遍相应的生命周期方法。这其实是非常消耗资源的,所以Android系统才会提供如下复用模式。
    (2)singleTop:栈顶复用模式。启动Activity时,如果这个Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建。但是当Activity不是位于栈顶,那么该Activity还是不会被复用,于是就有了接下来的栈内复用模式。
    (3)singleTask:栈内复用模式。它其实是一个单例模式,启动Activity时,首先要检测这个Activity指定的任务栈是否存在,否则创建任务栈。如果任务栈中已经存在这个Activity,那么这个Activity会被调到栈顶,并将这个Activity以上的Activity全部弹出。这时会回调一个onNewIntent方法.
    (4)singleInstance:在这种模式中,启动的Activity只有一个实例,并且独享它的任务栈。这种模式在Android当中应用比较少。
~~~~~~~~~~~~~~~~~~~~~~~华丽丽的分割线~~~~~~~~~~~~~~~~~~~~~~~~~
今天在开发过程中,碰到了这样一个现象:“我在旅游商家app中启动一个二维码扫描的Activity,当我在二维码扫描Activity中点击返回键时,居然返回到了携程旅行app”。经验反复debug才定位到问题。原来,二维码扫描Activity的注册居然是这样:
<activity
android:name="ctrip.android.qrcode.QRScanActivity"
android:configChanges="locale|fontScale|orientation|keyboardHidden|screenSize"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:taskAffinity="ctrip.android.view" />它的taskAffinity属性值居然为携程旅行app的包名。在把这个值修改为旅行商家app的包名后,就能正常返回了。正好今天开发量不是特别重,下午挑了个时间好好研究了一下。

TaskAffinity

主角出现了。TaskAffinity就是指定任务栈的,并且只有在singleTask时才生效。

总结

1.TaskAffinity的作用是指定任务栈,并且只有在singleTask时才有效。
2.正常情况下,启动Activity都会加到当前的任务栈中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: