2012-02-07 33 views
3

我有存在于像这样的清单活动:防止系统启动的单个顶级活动与以往的意图

<activity android:name=".activity.Main" android:launchMode="singleTask"> 
     <intent-filter> 
      <action android:name="android.intent.action.VIEW"/> 
      <category android:name="android.intent.category.DEFAULT"/> 
      <category android:name="android.intent.category.BROWSABLE"/> 
      <data android:scheme="http" android:host="asdf.com"/> 
     </intent-filter> 
</activity> 

使拦截和处理链接到http://asdf.com。在我处理了其中一个意图之后,我退出了我的主要活动。

如果我使用任务管理器返回到我的应用程序,它将使用与我已处理的数据相同的意图。是否有办法基本上清除或替换此意图,以便它不会被任务管理器重用?如果我正常启动,通过点击应用程序而不是使用任务管理器,它不会重用数据。

感谢

+0

https://groups.google.com/forum/#!topic/android-developers/vrLdM5mKeoY。这可能是我唯一的答案 – 2012-02-07 14:33:20

回答

1

当您重新输入已设置的“singleTask”启动模式下的应用程序,如果它已经存在,它不创建活动的新实例,而是重用了老活动,把它带到栈顶。您必须覆盖您的活动的onNewIntent()方法以处理您可能需要的任何操作。当你将一个活动带到堆栈的前面时,这个onNewIntent()被调用,你将需要重置该函数中的数据。

有关Tasks和Back Stack的更多信息here

+0

我在这里没有看到解决方案。无论我做什么,当用户在退出后通过任务管理器重新启动应用程序时,它都会以先前使用的意图启动该活动。在这个实例中没有onNewIntent调用,并且活动的前一个实例中没有保存状态。我无法判断这个意图是否过时。 – 2012-02-07 15:02:54

+0

那么从任务管理器调用时,应用程序的入口点是什么?我可以看到你解决这个问题的唯一方法是,如果你持久存在一个标志变量(可能在sharedPreferences中),它告诉你在退出应用程序之前它的意图是旧的。然后,当你重新进入应用程序时,你需要检查并重置它,然后你就会知道这个意图是旧的。 – onit 2012-02-07 15:19:29

+0

有一些工作,下面发布,upvoting你的帮助,虽然.. – 2012-02-07 15:24:56

1

我的问题的情况是当活动从home键启动,因此这似乎是一个有效的解决方案:

if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0) { 
    //handle intent 
}; 

那如果从任务管理器启动,标志为true在这种情况下,我可以忽略意图数据。这可能不适用于其他一些情况。