Android:恢复活动状态的Activity,同时恢复应用程序

6
我有两个活动正在运行:mainActivitychildActivity。每当用户在mainActivity中点击按钮时,就会启动childActivity。我想做的是:

当活动活动是childActivity并且用户点击主页按钮然后重新启动应用程序时,我希望看到启动childActivity而不是mainActivity

实际上,我有一些解决方法。我尝试过操纵onStart、onRestart、onResume、onStop、onDestroy事件。但是,它们并没有完全解决问题。应该有一个聪明的方法。谢谢。

编辑:

谢谢您的回答,Soonil。您所说的情况发生在从最近的活动窗口调用活动时。(长按主页按钮时打开的窗口)然而;当您从主屏幕打开时,这种情况并没有发生。(像从开始打开)我不认为我的代码有特定的问题来生成此错误。因为,我创建了一个测试项目并在发送问题之前进行了独立测试,并遇到了同样的问题。无论如何,这是测试代码:

public class MainActivity extends Activity implements OnClickListener {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        this.setTitle("MainActivity");

        ((Button) findViewById(R.id.btnChildActivity)).setOnClickListener(this);
    }

    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub
        startActivity(new Intent(this, ChildActivity.class));
    }

}

public class ChildActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main2);
        this.setTitle("ChildActivity");

    }
}

刚刚按照您的示例顺利运行了。我的操作步骤是:启动应用程序(现在在MainActivity屏幕上),点击按钮(ChildActivity启动),按Home键(现在在主屏幕上),长按Home键并选择MainActivity(最终停留在ChildActivity),按返回键(最终回到MainActivity)。 - sooniln
1
好的,这也是我期望的。但是,从主屏幕运行应用程序怎么样?(不是从最近的应用程序菜单中长按主页按钮运行,而是从主屏幕运行)我希望能看到我的ChildActivity。然而,MainActivity正在启动。谢谢。 - Ömer
抱歉,依然是相同的结果:( 在主界面上按下应用程序按钮(在MainActivity上),按下按钮(在ChildActivity上),然后返回主界面(Home Screen),再次在主界面上按下应用程序按钮(在ChildActivity上),最后按下返回按钮(在MainActivity上)。你想让你的应用程序始终从ChildActivity屏幕开始吗? - sooniln
不确定您是否收到了我的编辑通知,因此请查看下面的编辑。 - sooniln
Omer,我也遇到了同样的问题。有什么解决方法吗?提前感谢。 - Vit Khudenko
2个回答

3
编辑:我今天有些偶然地找到了你问题的解决方案!请看错误报告。它详细解释了你的问题。之所以我不能重现这个问题是因为我从来没有直接使用Eclipse启动应用程序。我使用Eclipse安装应用程序,然后自己启动它。

Android应用程序已经默认具有此行为,不需要特殊技巧即可实现。我很惊讶你的应用程序没有展示这种行为。每个Android应用程序都维护着一个Activity堆栈,字面上就是一个后进先出的活动堆栈。这些活动可以进一步分组成任务,但在我的经验中,99%的普通应用程序都不需要知道关于任务的任何事情。

当您按下Home键时,整个应用程序堆栈都会被放入后台。在后台,它可能会因内存问题而被杀死,但如果它在被恢复之前没有经过太长时间,它通常不会被杀死也不必重新创建。当您再次选择应用程序时,堆栈(或更准确地说,仅堆栈顶部的项目)将被恢复。

如果您的应用程序没有表现出这种行为,我怀疑它与您启动mainActivity和childActivity以及任何额外的Intent标志的方式有关。您有机会发布代码片段,展示如何启动mainActivity和childActivity吗?


你说得对。在我签署了我的测试应用程序并将其安装到G1并运行后,我看到了我期望看到的正确行为。接下来我要做的是从保存/恢复状态中清除我的代码,并在我的设备上重新运行。非常感谢你的帮助。 :) - Ömer
Soonil,我想问你一个与此无关的问题。你使用自动化脚本构建和导出应用程序吗?如果是这样,你是如何做到的?我无法弄清楚特别是针对Android的导出。谢谢。 - Ömer
我曾考虑过使用ANT进行构建,但目前Eclipse已经满足了我所有的需求。我只是使用一些脚本来使应用签名变得更加容易。您可以在http://developer.android.com/guide/publishing/app-signing.html找到一个相当不错的简化发布流程的解释。 - sooniln
非常感谢您的帖子和编辑,Soonil。我已经在网上和Android应用程序基础知识中搜索了大约一个小时,试图弄清楚为什么我的应用程序在后续启动时无法保持其状态。我正在经历的行为正好在那个错误报告中详细说明了。 - Austyn Mahoney

-1

我回去测试了一个类似的应用程序,即使进程被强制退出,ChildActivity也会像Soonil所说的那样自动重建。你是在模拟器上还是实际设备上看到这个问题的?

如果你运行你的应用程序并观察logcat,你应该在启动你的应用程序后,打开ChildActivity并单击Home,然后再次启动你的活动时看到以下内容:

Starting activity: Intent { action=android.intent.action.MAIN categories={android.intent.categroy.LAUNCHER} flags=... comp={com.yourpackagename.MainActivity} } Start proc for activity yourpackagename.ChildActivity: pid=x uid=y gids={} Displayed activity /.ChildActivity

当你没有看到你期望的行为时,你能否发布logcat的输出?


据我所知,这是不准确的。当一个进程被杀死并且它的活动被重新启动时,活动堆栈会被保存。每个活动只能序列化关于自己状态的信息。整个活动堆栈的状态由系统维护。(如果您能向我提供证明链接,我将取消我的投票否决) - sooniln

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接