我已经在很长一段时间内一直在寻找有关我的问题的解决方案,但Android文档并不是那么清晰,而且网络解决方案也无法完全发挥作用。
我正在开发一款游戏,其中主要的Activity(游戏发生的地方)可以调用另一个简单的Activity而不是返回。 它会像这样工作:
前两点我尝试了这一点,以确保创建并调用了一个且只有一个主要活动:android:launchMode="singleTask"
或android:launchMode="singleTop"
但不幸的是,第一个问题适用于第一个问题而第二个问题适用于第二个,不是两个!
我认为问题是:使用singleTop时,当第二个活动调用它时,主Activity实际上不在堆栈的顶部(要清楚,我不明白应该是什么情况,我称之为已经位于堆栈顶部的活动!)。相反,singleTask确保Activity在其堆栈中是唯一的,但是在用户单击Home按钮并返回到Application后,其他任务被调用,我是对的吗?
无论如何,这是一个聪明的解决方案,还是我应该在onStop / onPause中保存我的游戏状态,然后在onResume中恢复它?
对于第三点,我尝试将android:noHistory="true"
添加到每个Activity,然后当用户单击退出按钮时,我调用一个新的Activity,它只对onCreate上的finish()
方法执行任何操作,使用intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);
调用活动,其launchMode为singleInstance
,但它不起作用,它只是在主Activity中返回。
答案 0 :(得分:3)
你绝对不想弄乱launchMode
。这不是解决这个问题的方法,只会给你带来更多问题。
Android可以(并且会)随时杀死您的进程(但特别是如果您的应用程序在后台)。因此,您需要在onPause()
中保存游戏状态,因为这是您保证的唯一机会。
无论如何,如果您将游戏保存在onPause()
中,标准行为将覆盖您的前2个点。
对于你的第3点,有几个选择:
startActivityForResult()
查看我的回答here 像这样:
Intent intent = new Intent(this, MyRootActivity.class); // this is the starting activity for your application
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // tells Android to finish all other activities in the stack
intent.addExtra("exit", "true"); // this tells your root activity that you want to exit
startActivity(intent);
现在,在您的MyRootActivity
中,您希望将此代码添加到onCreate()
:
Intent intent = getIntent();
if (intent.hasExtra("exit")) {
// User wants to exit
finish();
}