【发布时间】:2013-03-27 00:45:46
【问题描述】:
我们的活动可以从 GCM 通知启动。我们在 GCM 意图中设置了额外内容,以确保将用户带到该 GCM 通知的消息线程,然后我们调用 removeExtra 将其从意图中删除。
如果用户从最近的历史菜单启动我们的应用程序,那么该 Activity 的启动意图与上次启动时相同(例如,从 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() 中检查这个额外的存在就足够了
-
onNewIntent() 如果用户在 Activity 被销毁后从“Recent History”菜单启动应用程序,则不会调用(但仍会再次提供之前的 Intent 信息)。
-
嗯...我想这就是我有时从 onCreate() 调用 onNewIntent() 的原因。也许你描述的不同场景可以从 onNewIntent() 被调用或不被调用中受益?
标签: android android-intent android-activity