Android中启动模式为singleTask的Activity如何回到启动自己的Activity(回到上一个页面)

1 问题背景

最近Android端的测试同学提了一个Bug,说从页面1拉起了页面2,再从页面2重新拉起了页面1,这时在页面1点击返回键,无法回到上一个页面(即页面2),而是回到了首页。作为一名Android开发,第一反应肯定是Activity的launchMode有问题。看了一下AndroidManifest.xml,页面1-Activity1launchMode="singleTask"页面2-Activity2launchMode="standard"。由于之前在任务栈中已经存在了页面1-Activity1,所以当页面2-Activity2重新拉起页面1-Activity1时,页面1-Activity1会将任务栈中在它之前的所有Activity清除,此时页面2-Activity2被执行销毁,从而导致任务栈中只有页面1-Activity1,点击返回键就回不到页面2-Activity2了。

当时问了一下模块负责人,负责人说也是有些场景的问题,页面1-Activity1launchMode设置为"singleTask",改了会影响到别的功能。 那要不找产品经理改改需求?比如说不要求回到上一页了。模块负责人说,算了,你跟产品经理扯皮的时间可能都能改好了,还不一定能说服对方。那就先自己捣鼓一下看看怎么解决吧。

2 解决方案

通过Intent.addFlags(int flags) 方法,可以在启动Activity的时候动态设置启动模式launchMode,例如,设置Intent.FLAG_ACTIVITY_NEW_TASK,效果相当于launchMode="singleTask";设置Intent. FLAG_ACTIVITY_CLEAR_TOP,效果相当于launchMode="singleTop"

因此在该Bug的场景下,首先利用EventBus的全局事件总线,通过EventBus.getDefault().post(Event event)方法发送事件,通知任务栈中已有的Activity1调用finish( )方法销毁自身,然后设置Intent. FLAG_ACTIVITY_CLEAR_TOP,标记Activity1launchMode="singleTop",再启动Activity1。当Activity1拉起了Activity2Activity2再重新拉起Activity1,由于此时Activity1launchMode="singleTop",因此不会把任务栈顶的Activity2销毁,而是重新创建一个Activity1,此时按下返回键,就可以回到Activity2,满足产品的需求设计。

//Activity1.java

public static void start(Context context) {
        EventBus.getDefault().post(new Event());
        Intent intent = new Intent(context, Activity1.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        context.startActivity(intent);
}

@Subscribe(threadMode = ThreadMode.MAIN)
public void onFinishEvent(Event event) {
        finish();
}

问题解决,打回给测试验证!

 

参考:

编辑于 2024-11-08 21:34
目录