2013-03-27 62 views
2

我们的活动可以从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" > 
+0

我想从GCM意图中添加一个额外的内容,然后在Activity.onNewIntent()中检查这个额外的存在绰绰有余 – 2013-03-27 01:40:18

+0

如果用户从应用程序中启动应用程序,onNewIntent()将不会被调用活动被破坏后的最近历史记录菜单(但仍然提供以前的意图信息)。 – 2013-03-27 16:35:19

+0

嗯......我想这就是我有时从onCreate()调用onNewIntent()的原因。当onNewIntent()被调用或者不被调用时,你描述的不同场景可能会受益? – 2013-03-27 16:41:29

回答

0

我感兴趣的是如何解决部分:

但是,我们也需要这通过分享图片到我们的应用程序 工作时SEND图像/ jpg意图。

只要我处理图像,我就在意图上加上一个额外的标志。正如你可以想象的那样,我在进行文件处理之前检查该标志。即使Intent是由其他应用程序创建的,也是如此。