1 问题背景
最近Android端的测试同学提了一个Bug,说从页面1拉起了页面2,再从页面2重新拉起了页面1,这时在页面1点击返回键,无法回到上一个页面(即页面2),而是回到了首页。作为一名Android开发,第一反应肯定是Activity的launchMode有问题。看了一下AndroidManifest.xml,页面1-Activity1的launchMode="singleTask",页面2-Activity2的launchMode="standard"。由于之前在任务栈中已经存在了页面1-Activity1,所以当页面2-Activity2重新拉起页面1-Activity1时,页面1-Activity1会将任务栈中在它之前的所有Activity清除,此时页面2-Activity2被执行销毁,从而导致任务栈中只有页面1-Activity1,点击返回键就回不到页面2-Activity2了。
当时问了一下模块负责人,负责人说也是有些场景的问题,页面1-Activity1的launchMode设置为"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,标记Activity1的launchMode="singleTop",再启动Activity1。当Activity1拉起了Activity2,Activity2再重新拉起Activity1,由于此时Activity1的launchMode="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();
}
问题解决,打回给测试验证!
参考: