【问题标题】:Clearing Intent when DO NOT KEEP ACTIVITY is ON当 DO NOT KEEP ACTIVITY 为 ON 时清除 Intent
【发布时间】:2015-09-18 06:44:34
【问题描述】:

我有一个 Activity,它会在 Intent 有数据时自动重定向到另一个 Activity。一个简单的sn-p如下

@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 取回其 Caller 设置的原始值,并继续进行重定向。

所以我想我可以在使用后删除 Intent。参考Clearing intent,表示要清除intent(或intent的extra),使用

        intent.removeExtra("MyKey");

这似乎只在正常情况下有效,但在开启“不保持活动”时无效。

因此我的问题是,有没有办法确保 Intent 在进入活动时只使用一次并被清除?即当用户返回活动(按下后退按钮)时,无论它是恢复还是重新启动(即 DO NOT KEEP ACTIVITY 处于打开状态),都应清除意图(或额外的)。

谢谢!!

【问题讨论】:

    标签: android android-intent


    【解决方案1】:

    我想问题是当调用意图时,它总是通过“MyKey”传递,而当启用不保留时,意图往往会用相同的数据再次调用,因此转换总是发生。 一种解决方案可能是使用共享首选项或一些持久性存储,如文件和 SQLlite,但这些会非常慢,因为它涉及磁盘操作,并且当应用程序来回切换到此意图时当然效率低下.

    【讨论】:

    • 很好的解释,谢谢!投票给你的答案。是的,这就是我目前使用的解决方法,即 sharedPreferences。真的很想看看是否有任何聪明的解决方法可以让意图使用一次并被清除。
    • 只是需要澄清一点.. 即使在应用程序被终止后或仅当此特定意图被清除时,您也想跟踪这一点?
    • 虽然 SharedPreferences 是一种巧妙的解决方法!由于它们在应用程序范围内保存在内存中,因此性能与意图数据几乎相同。一旦应用程序在被杀死或重新启动后启动,它们就会从磁盘中读取,因此应用程序启动时间可能会慢一些,差异非常小。有一个SharedPreferences 问题,请查看answer 了解详情。
    • 谢谢穆巴希尔。我想要的是,如果用户回到活动,即使活动重新启动,它也不会再次自动重定向(就像在 DONT KEEP ACTIVITY 的情况下一样)。 Shared Preference 不适合我的情况,但它是我目前最好的解决方法。
    【解决方案2】:

    如果您需要这种类型的导航,最安全的方法是覆盖另一个 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);
    }
    

    这应该做你想做的事,即使启用了“不要保持活动”。

    【讨论】:

    • 谢谢大卫。如果共享偏好方法不能满足我的需要,这听起来像是一个很好的“hack”选项。需要解释我的代码审查员并说服他们:P
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多