应用程序始终从根活动开始,而不是恢复后台状态(已知错误)

我正好面对这些链接中提到的问题:

http://code.google.com/p/android/issues/detail?id=2373

http://groups.google.com/group/android-developers/browse_thread/thread/77aedf6c7daea2ae/da073056831fd8f3?#da073056831fd8f3

http://groups.google.com/group/android-developers/browse_thread/thread/2d88391190be3303?tvc=2

我有一个简单的根与LAUNCHER和MAIN意图, 没有别的活动 。 我开始另一个活动, 没有任何标志或任何额外的清单。

我启动应用程序(根活动),从那里开始第二个活动。 按下主页button后,任务将转到后台。 再次启动应用程序(从启动程序或从最初的应用程序按住主页button)它启动现有堆栈顶部的根活动的新实例。

如果我按下后退button,新的“根”活动closures,旧的第二个活动可见,这意味着它在同一个任务中启动根活动,而不是将任务带到前台。

为了解决这个问题,我做了root活动的启动模式singleTask 。 现在,当我按回家并再次启动应用程序时,它会清除旧的根任务之上的活动,并将旧的根任务带到前台,而不是将第二个活动的整个旧任务放在最前面。 请注意,旧的根任务仍然保留其应用程序状态,这意味着它不是一个新的实例,但更高的活动已被杀死。

它甚至发生在从市场上下载的其他应用程序上。 手动安装方法对我没有任何影响,它仍然以相同的方式启动。

这是由于意图被用来启动应用程序是不同的。 Eclipse启动一个应用程序使用意向没有行动,没有类别。 启动器启动一个应用程序使用意图与android.intent.action.MAIN行动和android.intent.category.LAUNCHER类别。 安装程序使用android.intent.action.MAIN操作启动一个应用程序,并且没有类别。

提交这个bug的人应该可能把它作为对Eclipse插件进行增强的请求,因为他们显然希望Eclipse能够假装成为启动器,并使用与启动器相同的意图启动应用程序。

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) { // Activity was brought to front and not created, // Thus finishing this will get us to the last viewed activity finish(); return; } // Regular activity creation code... } 

这是解决scheme:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0 & getIntent().getExtras() == null) { finish(); return; } Your code.... } 

编辑:我有新的意图和通知的问题。 以前的解决scheme不适用于通知和意图…

Xamarin.Android的类似解决scheme:

 if (!IsTaskRoot) { string action = this.Intent.Action; if (this.Intent.HasCategory(Intent.CategoryLauncher) && !string.IsNullOrEmpty(this.Intent.Action) && action == Intent.ActionMain) { Finish(); return; } }