【问题标题】:Android Activity Intent remains after shutdownAndroid Activity Intent 在关机后仍然存在
【发布时间】:2012-07-27 01:03:33
【问题描述】:

SETUP 一个 Activity,SingleTop,接收来自通知的意图。意图被活动消耗。用户点击返回按钮结束活动。 onDestory 被调用并且 isFinishing() 返回 true。长按 Home 键调出最近的应用程序。启动之前关闭的应用程序。

当用户在活动上按下主页键后调用 onStop 时,onNewIntent 也会发生类似的情况。

问题在活动完成后重新创建活动时,使用通知中的相同意图。我不想要这个。有没有办法告诉系统我们已经使用了该通知,因此停止将其提供给活动?解决问题?有什么建议吗?

我的尝试

  1. 我试图从意图中删除额外内容。不工作。 Clearning Activity's intent data randomly comes back, why?
  2. 我尝试使用 saveInstanceState() 来保留意图的时间戳。然而,当 Activity 被销毁时,onIstanceState(Bundle) 会被移除(onCreate 中为 null)。
  3. 我尝试在活动中将 Intent 设置为 null,但这不起作用

这个问题和这个问题很相似:http://grokbase.com/t/gg/android-developers/119jyzf492/getintent-removeextra-in-activity-doesnt-work-for-android-launchmode-“singletask”

【问题讨论】:

    标签: android android-intent android-activity notifications destroy


    【解决方案1】:

    这是一个 WORK AROUND - 而不是 IMO 的解决方案。

    问题

    请记住,问题在于 onCreate() 和 onNewIntent() 无论如何都保持给活动相同的意图(没有什么是粘性的)。最严重的违规者是 onCreate(),因为 Bundle savedInstanceState 始终为空。

    解决方法

    我创建了一个可序列化的(让调用是 sFOO)类,它包含意图动作和来自意图附加的时间戳。在 onCreate() 期间,我加载了这个序列化类 (sFOO)。在 onStart() 期间,我将 sFOO 与正在处理的意图进行比较。如果一切都是新的,我知道需要处理意图并更新 sFoo 然后保存。如果不是,我无视意图。

    您需要代码吗?

    在 onStart() 中

    Intent activityIntent = this.getIntent();       
        if (activityIntent != null)
        {                         
            if (activityIntent.getAction() != null)
            {                       
                boolean newIntent = false;
                
                //Is the intent action being processes same as previous? 
                if (activityIntent.getAction().compareTo(this.mLastProcessedIntent.mLastIntentProcessedAction) == 0)
                {
                    if (activityIntent.getExtras() != null)
                    {
                        //Is the intent time stamp being processed same as previous?
                        if (activityIntent.getExtras().getLong(TIME_STAMP_KEY) != this.mLastProcessedIntent.mLastIntentProcessedTimestamp)
                        {                           
                            newIntent = true;                                                       
                        }
                    }
                }
                else
                {
                    Log.d(TAG,"Last processed intent action does not equal new one.");
                    newIntent = true;
                }
    
                if (newIntent)
                {
                     updateAndSaveProcessedIntent();
                     /*YOUR CODE HERE TO HANDLE INTENT*/
                }
    
            }
        }
    

    【讨论】:

      【解决方案2】:

      听起来您用来启动 Activity 的 Intent 可能已作为“粘性” Intent 广播。粘性 Intent 使 Intent 即使在被消耗后仍然可用。如果是这种情况,您的应用将获得与之前使用的相同的 Intent。如果您可以检查正在广播该 Intent 的任何内容,以查看它是否是粘性 Intent。您将在清单中看到这一点:

      <uses-permission android:name="android.permission.BROADCAST_STICKY"/>
      

      它会用这个方法发送:

      sendStickyBroadcast(intent);
      

      如果您无法更改它(如果不是您的应用调用它),那么您可能只需要找到一种适合您的应用的方法来处理它。这只是一种可能,没有看到任何代码。

      【讨论】:

      • '@Jason' 意图来自我的应用程序启动的通知。当用户点击通知时,它会向我的应用程序发送一个意图。我不相信通知会使用粘性向活动发送意图。我在适当的许可下实现了 removeStickyBroadcast() 并且没有任何改变。问题仍然存在。
      • 广播Intents 和Intents 用于开始Activitys 是两个完全不同的东西。没有像 sticky Intent 这样的东西来启动 Activity。这个答案可能会让人感到困惑,应该删除它。
      【解决方案3】:

      我的解决方案是首先将我的 Activity 更改为 android:launchMode="singleTop" 然后使用 onNewIntent

      @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-13
        • 1970-01-01
        • 1970-01-01
        • 2013-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多