【问题标题】:Android: Restoring the active Activity while resuming the applicationAndroid:在恢复应用程序时恢复活动的活动
【发布时间】:2010-10-17 23:42:25
【问题描述】:

我有两个正在运行的活动: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 启动),按下主页按钮(现在在主屏幕上),长按主页并选择 MainActivity(在 ChildActivity 结束),按回(最终在 MainActivity)
  • 好的。这也是我所期待的。但是,从主屏幕运行应用程序呢? (当您长按主页按钮时,不是从最近的应用程序菜单运行,而是从主屏幕运行)我期待看到我的 ChildActivity。然而; MainActivity 正在启动。谢谢。
  • 对不起,结果还是一样 :( 在主屏幕上按应用按钮(在 MainActivity 上),按按钮(在 ChildActivity 上),按主页(在主屏幕上),按主屏幕上的应用按钮(在ChildActivity),按返回(在 MainActivity 上)。您是否希望您的应用始终在 ChildActivity 屏幕上启动?
  • 不确定您是否收到关于我的编辑的通知,请在下方查看我的编辑。
  • Omer,我也遇到过同样的问题。有什么解决方法吗?提前致谢。

标签: android android-activity


【解决方案1】:

编辑:今天有点随机地找到了解决您问题的方法!请参阅此error report。它准确地解释了你的问题。我无法重现该问题的原因是我从未让 Eclipse 直接启动应用程序。我使用 Eclipse 安装应用程序,然后自己启动它。


这已经是 Android 应用程序的默认行为,无需特殊技巧即可实现。我很惊讶您的应用程序没有表现出这种行为。每个 Android 应用程序都维护一个 Activity 堆栈,实际上是一个 LIFO 的 Activity 堆栈。这些活动可以进一步分组为任务,但根据我的经验,99% 的普通应用永远不需要了解任何有关任务的信息。

当您按下主页按钮时,整个应用程序堆栈都会进入后台。在后台,它可能随时因内存问题而被杀死,但如果在恢复之前没有多少时间过去,它通常不会被杀死,也不必重新创建。当您再次选择应用程序时,堆栈(或者更准确地说,仅堆栈上的顶部项)被恢复。

如果您的应用程序没有表现出这种行为,我怀疑它与您如何启动 mainActivity 和 childActivity 以及您可能正在使用的任何额外 Intent 标志有关。您是否有机会发布关于如何启动 mainActivity 和 childActivity 的代码 sn-ps?

【讨论】:

  • 你是对的。在我签署了我的测试应用程序并将其安装到 G1 并运行后,我看到了我期望看到的正确行为。接下来我要做的是从保存/恢复状态中清除我的代码并在我的设备上重新运行。非常感谢您的帮助。 :)
  • Soonil,我想问你一些无关的问题。您是否使用自动化脚本来构建和导出您的应用程序?如果是这样,你是怎么做到的?我无法弄清楚专门针对 android 的导出。谢谢。
  • 我考虑过使用 ANT 进行构建,但目前 Eclipse 可以满足我的所有需求。我只是使用了一些脚本来简化应用程序的签名。您可以在developer.android.com/guide/publishing/app-signing.html 找到关于简化发布过程的很好解释
  • 非常感谢您的帖子和编辑 Soonil,我已经搜索了大约一个小时的网络和 android 应用程序基础知识,试图弄清楚为什么我的应用程序无法保持其状态后续发射。我遇到的行为在该错误报告中详细说明。
【解决方案2】:

我回过头来用一个类似的应用程序进行了测试,即使进程被强制耗尽内存,ChildActivity 也会自动重组,正如 Soonil 所说。您是在模拟器上还是在实际设备上看到这个?

如果您运行您的应用并观看 logcat,您应该在启动应用后看到类似以下内容,然后打开 ChildActivity 并单击 Home,然后再次启动您的 Activity:

开始活动:Intent { action=android.intent.action.MAIN categories={android.intent.categroy.LAUNCHER} flags=... comp={com.yourpackagename.MainActivity} } 启动活动过程 yourpackagename.ChildActivity: pid=x uid=y gids={} 显示的活动/.ChildActivity

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

【讨论】:

  • AFAIK 这是不准确的。当一个进程被杀死并且它的活动被重新启动时,活动堆栈被保存。每个活动必须仅序列化有关其自身状态的信息。整个活动堆栈的状态由系统维护。 (如果您可以将我链接到证明,我将删除我的反对票)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多