关机后Android Activity Intent仍然存在

时间:2012-07-28 17:38:06

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

SETUP One Activity,SingleTop,从通知中接收意图。意图由活动消耗。用户点击后退按钮结束活动。调用onDestory并且isFinishing()返回true。长按Home键以显示最近的应用程序。启动之前关闭的申请。

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

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

我尝试过什么

  1. 我试图从意图中移除额外内容。不工作。 Clearning Activity's intent data randomly comes back, why?
  2. 我尝试使用saveInstanceState()来保持意图的时间戳。但是当活动被销毁时,onIstanceState(Bundle)被删除(在onCreate中为null)。
  3. 我尝试在活动中将意图设置为null,但这不起作用
  4. 这个问题与此问题非常相似:http://grokbase.com/t/gg/android-developers/119jyzf492/getintent-removeextra-in-activity-doesnt-work-for-android-launchmode-“singletask”

3 个答案:

答案 0 :(得分:4)

这是一项工作 - 而不是解决方案IMO。

问题

记住问题是onCreate()和onNewIntent()不管是什么都没有给予活动相同的意图(没有粘性)。最糟糕的罪犯是onCreate(),因为 Bundle savedInstanceState 总是为空。

解决方法

我创建了一个serializable(允许调用是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*/
            }

        }
    }

答案 1 :(得分:0)

听起来你用来启动你的活动的意图可能已被广播为“粘性”意图。 Sticky Intents即使在消费后也可以使用Intent。如果是这种情况,您的应用程序将获得之前使用的相同Intent。如果您可以检查广播该Intent的任何内容,看它是否是一个粘性意图。您将在清单中看到这一点:

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

并将使用此方法发送:

sendStickyBroadcast(intent);

如果你没有能力改变它(如果它不是你的应用程序调用它),那么你可能只需找到一种方法来处理它适合你的应用程序。这只是一种可能性而不会看到任何代码。

答案 2 :(得分:0)

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

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