我有一个Activity,当intent有数据时会自动重定向到另一个活动。一个简单的片段如下
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_layout);
Intent intent = getIntent();
String mykey = intent.getStringExtra("MyKey");
if (mykey != null) {
intent.removeExtra("MyKey");
Intent sendingIntent = new Intent(this, targetActivity.class);
sendingIntent.putExtra("Next Key", mykey);
startActivity(sendingIntent);
}
}
我把它放在onCreate()
中,这样如果它再次返回到此活动(例如用户从targetActivity按下后退按钮),则不会调用它,也不会再次自动重定向到targetActivity。
但是,如果DO NOT KEEP ACTIVITY被打开(对于活动被杀死的测试场景),则始终调用onCreate。并且Intent返回其调用者设置的原始值,并且重定向继续发生。
所以我想我可以在使用后删除意图。参考Clearing intent,声明要清除意图(或额外的意图),请使用
intent.removeExtra("MyKey");
这似乎只在正常情况下有效,但在没有保持活动开启时则不行。
因此,我的问题是,有没有办法确保Intent仅在进入活动时使用一次,并被清除?即,当用户返回活动(按下后退按钮)时,无论是恢复还是重新启动(即,不保持活动已打开),应清除意图(或额外的)。
谢谢!
答案 0 :(得分:0)
我猜问题是当调用intent时它总是以“MyKey”传递,并且当Do not keep被启用时,意图往往会再次调用相同的数据,因此转换总是会发生。 一个解决方案可能是使用共享首选项或某些持久性存储,如File和SQLlite ,但这些将非常慢,因为它涉及磁盘操作,当然,当应用程序来回转换此意图时,效率很低
答案 1 :(得分:0)
如果你需要这种类型的导航,最安全的方法是覆盖另一个Activity中的BACK按钮,这样按下它就不会执行标准行为(即:调用finish()
然后从堆栈中删除该Activity并将用户放回到您的调度程序Activity中,但是这样做:
@Override
public void onBackPressed() {
// Instead of just calling finish(), we want to explicitly
// redirect back to dispatcher activity and make sure that it doesn't redirect back here
Intent intent = new Intent(this, DispatcherActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
这应该做你想做的事情,即使"不要保持活动"已启用。