如何使android应用程序在重新启动时返回到上次打开的活动?

如何使android应用程序在重新启动时返回到上次打开的活动?,android,Android,是否可以配置android应用程序,以便如果用户打开了你的应用程序,启动了许多活动,然后返回主屏幕并重新启动你的应用程序,而不是转到主活动,它们将被带到堆栈上最高的活动(你应用程序中的最新活动)?当通过主屏幕上的图标启动时,Android将始终使用AndroidManifest.xml中的Android.intent.action.MAIN过滤器启动活动,除非应用程序已经在运行(在这种情况下,它显然会将活动恢复到堆栈顶部) 要实现您所描述的功能,您只需将最后一个可见的活动存储在SharedRef

是否可以配置android应用程序,以便如果用户打开了你的应用程序,启动了许多活动,然后返回主屏幕并重新启动你的应用程序,而不是转到主活动,它们将被带到堆栈上最高的活动(你应用程序中的最新活动)?

当通过主屏幕上的图标启动时,Android将始终使用
AndroidManifest.xml
中的
Android.intent.action.MAIN
过滤器启动活动,除非应用程序已经在运行(在这种情况下,它显然会将活动恢复到堆栈顶部)

要实现您所描述的功能,您只需将最后一个可见的活动存储在
SharedReferences
中,并使用Dispatcher活动根据首选项启动最后一个活动

因此,在您希望自动重新启动的每个活动中:

@Override
protected void onPause() {
    super.onPause();

    SharedPreferences prefs = getSharedPreferences("X", MODE_PRIVATE);
    Editor editor = prefs.edit();
    editor.putString("lastActivity", getClass().getName());
    editor.commit();
}
以及类似于以下内容的调度程序活动:

public class Dispatcher extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Class<?> activityClass;

        try {
            SharedPreferences prefs = getSharedPreferences("X", MODE_PRIVATE);
            activityClass = Class.forName(
                prefs.getString("lastActivity", Activity1.class.getName()));
        } catch(ClassNotFoundException ex) {
            activityClass = Activity1.class;
        }

        startActivity(new Intent(this, activityClass));
    }
}
公共类调度程序扩展活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
类活动类;
试一试{
SharedReferences prefs=GetSharedReferences(“X”,模式\私有);
activityClass=Class.forName(
prefs.getString(“lastActivity”,Activity1.class.getName());
}捕获(ClassNotFoundException ex){
activityClass=Activity1.class;
}
startActivity(新意图(本,activityClass));
}
}
评论

  • 您可以为
    onPause
    覆盖创建基类
  • Dispatcher活动显然需要是
    android.intent.action.MAIN
    action
是默认行为,这个问题以前被问过好几次:

请注意,如果您是从Eclipse启动应用程序,这就是打破此默认功能的原因。将启动配置更改为不启动活动应该可以解决问题

但是,由于在过去几周中,Eclipse的ADT插件中已经修复了这种行为,因此您不再需要这种解决方法:

从ADT启动的应用程序现在的行为就像是从主屏幕单击它们一样


没那么复杂。您只需要操纵清单

AndroidManifest.xm

<activity
     android:name=".MainActivity"
     android:alwaysRetainTaskState="true"
     android:exported="true"
     .
     .
     .


只有当应用程序已经运行时,才会出现这种情况。因为你永远都不可能真正知道,我会自己处理的。我编辑了我的答案来澄清。谢谢你。我已经看到了其他答案,现在告诉我,我正在寻找的实际上是默认行为,只有我在使用eclipse(尚未更新到插件的0.9.6)这一事实才导致了我的问题。因此,我认为我不必纳入您的解决方案。对吗?或者我需要以编程方式遵循你的想法还有其他原因吗?@johnrock:Android构建了一个堆栈,用于在你的应用程序运行时查找最后可见的活动。不幸的是,你永远不知道你的应用程序何时被终止,所以如果你总是想恢复最后的活动(即使在内存压力下,重新启动后,等等),那么你需要类似于我建议的东西。如果你大部分时间都没问题,你就不会。嗨,我只是想补充一句,预期的行为不起作用,因为它甚至“大部分时间”都不应该起作用。我已经在这里描述了问题,我应该把调度员放在哪里?在同一个活动中,我想重新开始?我应该如何使用该代码?我还是不太舒服sure@riper什么是活动1?更好的解决方案和更清洁:记录在案,前面的评论是有争议的。你也可以说,这个链接中的答案是不雅观的,虽然可能可以接受,但附带的一个陷阱是,它不会100%的工作时间。在决定哪种解决方案适合您的情况之前,请参阅此问题的公认答案中的注释。