SETUP One Activity,SingleTop,从通知中接收意图。意图由活动消耗。用户点击后退按钮结束活动。调用onDestory并且isFinishing()返回true。长按Home键以显示最近的应用程序。启动之前关闭的申请。
当用户在活动上按下主页键时调用onStop时,onNewIntent会出现类似的情况。
问题在活动完成后重新创建活动时,会使用与通知相同的意图。我不想要这个。有没有办法告诉系统我们已经消耗了该通知,因此停止将其提供给活动?解决?建议?
我尝试过什么
答案 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);
}