设置一个活动,singletop,接收来自通知的意图。意图被活动所消耗。用户点击后退按钮结束活动。调用ondestory,isFinishing()返回true。长按Home键以显示最近的应用程序。启动以前关闭的应用程序。
当用户在活动上按home键后调用onstop时,onnewintent也会出现类似的情况。
活动完成后重新创建时出现问题,使用通知中的相同意图。我不想要这个。有没有办法告诉系统我们已经使用了该通知,所以停止将其提供给活动?在附近工作?建议?
我试过的
我试图从意图中删除额外内容。不工作。
Clearning Activity's intent data randomly comes back, why?
我试图保存instanceState()以保持意图的时间戳。但是,当活动被销毁时,将删除resonancestate(bundle)(oncreate中为空)。
我试图在活动中将意图设置为空,但这不起作用
这个问题与这个问题非常相似:http://grokbase.com/t/gg/android-developers/119jyzf492/getintent-removeextra-in-activity-doesnt-work-for-android-launchmode-“singletask”
最佳答案
这是一个解决办法,而不是我的解决办法。
问题
请记住,问题是oncreate()和onnewintent()一直在赋予活动相同的意图,无论是什么(没有什么是粘性的)。最糟糕的违规者是oncreate(),因为bundle savedInstanceState始终为空。
解决问题
我创建了一个serializable(let call is sfoo)类,该类保存intent操作和intent extras的时间戳。在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*/
}
}
}