我们的活动可以从GCM通知中启动。我们在GCM意图中设置了附加内容,以确保用户被带到该GCM通知的消息线程,并且之后我们调用removeExtra
将其从意图中移除。如何在同一意图重新启动活动时避免重复处理
如果用户从最近的历史记录菜单启动我们的应用程序,那么活动的启动时间与上次启动时的意图相同(例如,从GCM通知)。
这种情况是很容易发现:
Intent i = getIntent();
// If the caller intent is from the recent apps and has the RECIPIENT_ID_KEY
// extra we should remove it to avoid open the messages thread again
if (((i.getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0) &&
i.hasExtra(MyConstants.RECIPIENT_ID_KEY)) {
i.removeExtra(MyConstants.RECIPIENT_ID_KEY);
}
但是,我们也希望如果该活动已被破坏操作系统这个工作。此时,如果设置了开发人员选项“不保留活动”(仅适用于OS 4.0+),那么当按下我们另一个屏幕上的后退按钮时,活动会以相同的意图继续重新创建,导致糟糕发生的事情。
我们考虑在我们的GCM意图中添加一个独特的额外内容,并在我们处理完它后将其保存到共享偏好设置中。不过,我们还需要通过SEND image/jpg
意图将图像分享到我们的应用程序时才能工作。我们不控制这个意图,那么我们如何知道我们是否已经处理了它?我想我们可以使用文件/ URI信息,尽管这意味着如果用户连续两次共享相同的图像,我们将忽略第二个。
有没有一种干净简单的方法来解决这个问题?
我们目前支持OS 2.3+,我们的应用程序在世界各地都可用。这里是我的AndroidManifest.xml中的相关章节:
<activity
android:name=".ui.MyClass"
android:configChanges="orientation|screenSize"
android:launchMode="singleTop"
android:windowSoftInputMode="stateHidden" >
我想从GCM意图中添加一个额外的内容,然后在Activity.onNewIntent()中检查这个额外的存在绰绰有余 – 2013-03-27 01:40:18
如果用户从应用程序中启动应用程序,onNewIntent()将不会被调用活动被破坏后的最近历史记录菜单(但仍然提供以前的意图信息)。 – 2013-03-27 16:35:19
嗯......我想这就是我有时从onCreate()调用onNewIntent()的原因。当onNewIntent()被调用或者不被调用时,你描述的不同场景可能会受益? – 2013-03-27 16:41:29