Android开发:从Activity回栈恢复指定Activity B的问题咨询
如何从Activity D返回并恢复原有Activity B实例(保留初始Bundle数据)
不用费劲在C、D之间传递初始数据!我之前也踩过这个坑,其实只要调整Intent的Flag组合,就能直接恢复原来的Activity B实例,保住它从A传过来的初始Bundle数据。
为什么只用FLAG_ACTIVITY_CLEAR_TOP会重建B?
默认情况下,当你只设置Intent.FLAG_ACTIVITY_CLEAR_TOP时,系统确实会把B上面的C、D从栈中清除,但如果Activity B的启动模式不是singleTop,系统会销毁现有的B实例,重新创建一个新的——这就是初始数据丢失的原因,新实例拿不到A当初传的Bundle。
解决方案:组合两个Flag
只需要把Intent.FLAG_ACTIVITY_CLEAR_TOP和Intent.FLAG_ACTIVITY_SINGLE_TOP一起使用,就能让系统复用已有的B实例,而不是重建:
Intent intent = new Intent(this, ActivityB.class); // 组合两个Flag:清除B之上的所有Activity,同时复用已有的B实例 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(intent); finish(); // 可选,如果你要关闭当前的Activity D
这样操作后,栈结构会变成Activity A -> Activity B,而且B是原来的实例,从A传过来的初始Bundle数据完全保留。
额外处理:如果需要从D传递新数据到B
如果还需要把D中的一些新数据传给B,可以在Intent中携带,然后在B的onNewIntent()方法中接收——因为实例没有重建,onCreate()不会再次执行,但系统会调用onNewIntent():
@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); // 获取从D传递过来的新数据 String newData = intent.getStringExtra("key_from_d"); // 可选:更新当前Activity的Intent为新的Intent,后续getIntent()会拿到这个新的 setIntent(intent); }
可选:通过Manifest配置启动模式
如果你希望Activity B默认就有这种复用行为,也可以在AndroidManifest.xml中给B设置launchMode="singleTop":
<activity android:name=".ActivityB" android:launchMode="singleTop"> </activity>
不过更推荐显式添加Flag,这样不会影响其他启动B的场景。
内容的提问来源于stack exchange,提问作者ghita
相关产品推荐
相关产品推荐

