![](/img/trans.png)
[英]App always starts fresh from root activity instead of resuming background state (Known Bug)
[英]Android: When resuming app after pressing home, app always starts at root Activity
我的游戏用例看起来是这样的:我有一个LoadingActivity,可以加载(通过AsyncTask,但这无关紧要),并将游戏所需的所有图形存储在静态类中。 加载完成后,出现MenuActivity。 从这个活动中,我可以启动其他活动,例如LikeBeginActivity。
这是清单的片段:
<activity
android:name="my.domain.mygame.LoadingActivity"
android:alwaysRetainTaskState="true"
android:screenOrientation="landscape">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="my.domain.mygame.MenuActivity"
android:theme="@android:style/Theme.NoTitleBar" >
</activity>
<activity
android:name="my.domain.mygame.LevelBeginActivity"
android:theme="@android:style/Theme.NoTitleBar" >
</activity>
调用看起来像这样:
public void startMenu()
{
final Intent gameIntent = new Intent(this, MenuActivity.class);
startActivity(gameIntent);
}
buttonStartNewGame.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View arg0)
{
Intent levelIntent = new Intent(MenuActivity.this, LevelBeginActivity.class);
levelIntent.putExtra(IntentConstants.STARTLEVELINDEX, 0);
startActivity(levelIntent);
}
});
烦人的问题是,当我处于LevelbeginActivity中并按HOME,然后通过启动器继续游戏时,它总是从LoadingActivity开始,但是为什么要清除整个任务? 这对我来说没有意义。 然后我想添加
android:alwaysRetainTaskState="true"
到清单中的LoadingActivity,但这也无济于事。 为什么要重新开始整个任务? 这是非常有问题的,因为如果一遍又一遍地启动LoadingActivity,我的内存将耗尽。 (下一个问题将是后退按钮的行为,但这是另一个问题)。 我可以通过将最后一个Activity名称保存为SharedPreferences或其他东西来修改一些丑陋的加载行为,但是我宁愿选择一个干净的解决方案。
如果系统需要内存,Android将销毁Activities
。 您必须确保将Activity的状态保存在onSaveInstanceState()
以便以后可以手动恢复它。 您可以将所需的值保存在SharedPreferences
或SQLiteDatabase
启动了另一个应用程序实例。 这就是问题的原因。
// To prevent launching another instance of app on clicking app icon
if (!isTaskRoot()
&& getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
&& getIntent().getAction() != null
&& getIntent().getAction().equals(Intent.ACTION_MAIN)) {
finish();
return;
}
在调用setContentView之前,在启动器活动中编写以上代码。 这样可以解决问题
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.