6
4

3 回答 3

4

这是一种解决方法 - 而不是 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*/
            }

        }
    }
于 2012-07-28T20:57:59.127 回答
0

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

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

它将使用以下方法发送:

sendStickyBroadcast(intent);

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

于 2012-07-28T17:52:47.503 回答
0

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

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

于 2013-02-21T07:20:17.880 回答