SETUP一个活动,SingleTop,从通知接收意图。 目的是通过活动消耗。 用户点击后退按钮结束活动。 onDestory被调用和isFinishing()返回true。 长按Home键调出最近使用的应用。 启动先前关闭的应用程序。
类似的情况发生与onNewIntent当用户在活动按下home键后的onStop被调用。
问题一旦它完成后,该活动的娱乐,是用来从该通知的目的相同。 我不想这样。 有没有办法告诉我们已经消耗的通知,以便阻止它给人以活动的系统? 解决? 建议?
我曾尝试
- 我试图从意图删除临时演员。 不工作。 Clearning活动的意图数据随机回来了,为什么呢?
- 我试图saveInstanceState()保持时间戳的意图。 然而onIstanceState(束)被删除(在空的onCreate)活动时被破坏。
- 我试图意图,活动设置为空,但不工作
这个问题很类似这样的: http://grokbase.com/t/gg/android-developers/119jyzf492/getintent-removeextra-in-activity-doesnt-work-for-android-launchmode-"singletask”
这是一个变通 - 而不是IMO的解决方案。
问题
请记住,问题的onCreate()和onNewIntent()不停地给该活动的目的相同不管什么(什么也没有粘)。 最坏的罪犯的onCreate(),因为捆绑savedInstanceState总是空。
补救措施
我创建了一个序列化(让呼叫sFOO)类持有意图额外意图的行动和时间戳。 期间的onCreate()我加载这个序列化的类(sFOO)。 调用onStart期间()I比较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*/
}
}
}
这听起来像你正在使用开始你的活动可能已播出的“粘性”意图的意图。 置顶意图使甚至其被消耗后可用的意图。 如果是这样的话你的应用程序将获得那是以前使用相同的意向。 如果你可以检查无论是广播业的意图,看它是否是一个棘手的意图或没有。 你会在清单中看到这一点:
<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); }