熟悉的场景:我有一个Main启动的活动Game按下按钮时的活动。如果用户按 HOME,然后再次启动我的应用程序,则应显示GameActivity,这是他最后一次使用该应用程序时所做的事情。
然而,相反发生的事情是他得到了Main再次活动。我有一种感觉 Android 正在创造anotherMainActivity 的实例并将其添加到该应用程序的堆栈中,而不是只选择顶部的任何内容,因为如果我在重新启动应用程序后按 BACK,我就会进入游戏活动!并且每次都会调用Main.onCreate方法,而不是调用GameActivity.onResume。
My AndroidManifest.xml
几乎是“简单的骨头”:
<activity android:name="MainActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="GameActivity" android:label="@string/app_name">
</activity>
正如你所看到的,没有什么太花哨的。
新活动就是这样启动的,也很简单:
Intent intent = new Intent(this, GameActivity.class);
startActivity(intent);
理论上,这应该在 Android 中“开箱即用”,正如一个非常相似的问题的答案所示:在Android中维护标准应用程序Activity返回堆栈状态(使用singleTask启动模式) https://stackoverflow.com/questions/5086985/maintaining-application-state-in-android,但事实并非如此。
我一直在阅读和重新阅读有关 Activity、Task 和 Stacks 的文档,并浏览 SO 中的所有相关答案,但我不明白为什么这样一个简单的设置不能按预期工作。
哦,我想我已经找到答案了。
因为我是使用 IntelliJ 启动应用程序的,所以它启动应用程序的方式似乎与用户单击主屏幕小部件启动的方式不同。在另一个SO问题的答案中对此进行了解释:
这是因为用于启动应用程序的意图不同。 Eclipse 使用没有任何操作和类别的 Intent 启动应用程序。启动器使用 android.intent.action.MAIN 操作和 android.intent.category.LAUNCHER 类别的意图启动应用程序。安装程序会启动一个带有 android.intent.action.MAIN 操作且没有类别的应用程序。
Ref: 应用程序始终从根活动重新启动,而不是恢复后台状态(已知错误) https://stackoverflow.com/questions/2280361/app-always-starts-fresh-from-root-activity-instead-of-resuming-background-state
因此,我手动终止了手机中的应用程序,然后从主屏幕小部件重新启动它。然后打开GameActivity,然后按HOME。现在,当重新启动它时,GameActivity 仍然可见,并保持其 UI 状态,就像我离开它时一样。
我猜想之前按下快捷键时创建活动的新实例的原因是由于启动活动时使用了不同的意图。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)