android:launchMode、Intent.FLAG_ACTIVITY_NEW_TASK、android:taskAffinity和近期任务列表关系

本文探讨了Android中四种Activity启动模式(standard、singleTop、singleTask、singleInstance)结合Intent.FLAG_ACTIVITY_NEW_TASK标志及不同taskAffinity设置下,对任务栈和RecentsActivity的影响。

本文总结了android:launchMode、Intent.FLAG_ACTIVITY_NEW_TASK、android:taskAffinity和近期任务列表RecentsActivity关系

实验辅助工具:通过adb shell dumpsys activity 命令观察 activity所属task栈的id(在输出中搜索Running activities,带#号的就是该activity所属task栈的id)

手机版本:官方模拟器api25

现有MainActivity,和将要跳转的Main2Activity

MainActivity manifest中属性如下

 <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
复制代码

1.android:launchMode="standard" 和android:launchMode="singleTop"结论

当启动Main2Activity 的intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)时,MainActivity和Main2Activity的taskId是一样的。

当启动 Main2Activity 的 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) && android:taskAffinity=“不同于当前包名的包名”时,MainActivity和Main2Activity的taskId不一致且近期任务列表RecentsActivity中存在2个任务选项卡。

2.android:launchMode="singleTask"结论

当启动Main2Activity 的intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)时,MainActivity和Main2Activity的taskId是一样的。

当 Main2Activity 的 android:taskAffinity=“不同于当前包名的包名”时,MainActivity和Main2Activity的taskId不一致且近期任务列表RecentsActivity中存在2个任务选项卡。

3.android:launchMode="singleInstance"结论

因为是Main2Activity 的android:launchMode="singleInstance",独享一个taskId,讨论Intent.FLAG_ACTIVITY_NEW_TASK就没有意义,肯定MainActivity和Main2Activity是不一样的

当 Main2Activity 的 android:taskAffinity=“不同于当前包名的包名”时,MainActivity和Main2Activity的taskId不一致且近期任务列表RecentsActivity中存在2个任务选项卡。

4.为什么要搞出2个任务选项卡

有时候我们需要在近期任务列表RecentsActivity中存在多个任务卡,比如一个任务卡看消息,一个任务卡写作,对用户比较友好,用户很方便切换。如果想搞出2个任务选项卡,必须要加的条件就是android:taskAffinity=“不同于当前包名的包名”,至于生不生效就看该Main2Activity的启动模式了,如果是android:launchMode="singleTask"和android:launchMode="singleInstance"加上android:taskAffinity=“不同于当前包名的包名”就直接生效,如果是android:launchMode="standard" 和android:launchMode="singleTop"除了得加上android:taskAffinity=“不同于当前包名的包名”以外还有加上Intent.FLAG_ACTIVITY_NEW_TASK。

package person.tools.treasurebox.customview.view import android.content.Intent import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import person.tools.treasurebox.databinding.ActivityCustomViewTestBinding class Test2Activity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) initView() } private fun initView() { val mViewBinding: ActivityCustomViewTestBinding = ActivityCustomViewTestBinding.inflate(layoutInflater) setContentView(mViewBinding.getRoot()) mViewBinding.cardMarkerView.setOnClickListener { val intent1 = Intent(this, Test3Activity::class.java) intent1.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) startActivity(intent1) finish() } mViewBinding.tvMarkerView.text = "222222" } }package person.tools.treasurebox.customview.view import android.content.Intent import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import person.tools.treasurebox.databinding.ActivityCustomViewTestBinding class Test3Activity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) initView() } private fun initView() { val mViewBinding: ActivityCustomViewTestBinding = ActivityCustomViewTestBinding.inflate(layoutInflater) setContentView(mViewBinding.getRoot()) mViewBinding.cardMarkerView.setOnClickListener { val intent2 = Intent(this, Test4Activity::class.java) intent2.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) startActivity(intent2) finish() } mViewBinding.tvMarkerView.text = "333333" } }package person.tools.treasurebox.customview.view import android.content.Intent import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import person.tools.treasurebox.databinding.ActivityCustomViewTestBinding class Test4Activity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) initView() } private fun initView() { val mViewBinding: ActivityCustomViewTestBinding = ActivityCustomViewTestBinding.inflate(layoutInflater) setContentView(mViewBinding.getRoot()) mViewBinding.cardMarkerView.setOnClickListener { } mViewBinding.tvMarkerView.text = "4444444444444444" } } 帮我分析从CustomViewMainActivity点击跳转到Test1Activity,再到Test2Activity,再到Test3Activity,再到Test4Activity。在Test4Activity点击后退,有时候为什么回到的不是CustomViewMainActivity
最新发布
11-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值