3 回答
这是一种解决方法 - 而不是 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*/
}
}
}
听起来您用来启动 Activity 的 Intent 可能已作为“粘性” Intent 广播。粘性 Intent 使 Intent 即使在被消耗后仍然可用。如果是这种情况,您的应用将获得与之前使用的相同的 Intent。如果您可以检查正在广播该 Intent 的任何内容,以查看它是否是粘性 Intent。您将在清单中看到这一点:
<uses-permission android:name="android.permission.BROADCAST_STICKY"/>
它将使用以下方法发送:
sendStickyBroadcast(intent);
如果您没有能力改变它(如果它不是您的应用程序调用它),那么您可能只需要找到一种适合您的应用程序的方法来处理它。这只是没有看到任何代码的一种可能性。
我的解决方案是首先将我的活动更改为
android:launchMode="singleTop"
然后使用 onNewIntent
@Override
protected void onNewIntent(Intent intent)
{
super.onNewIntent(intent);
setIntent(intent);
}