Android:在按回家后恢复应用程序时,应用程序始终从root活动开始

时间:2014-09-15 19:13:06

标签: android android-activity behavior android-task

我的游戏用例看起来如此:我有一个LoadingActivity,它加载(通过AsyncTask,但这并不重要),并将游戏所需的所有图形存储在静态类中。加载完成后,将出现MenuActivity。从这个Activity我可以启动像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>

调用如下所示:

LoadingActivity

public void startMenu()
{
    final Intent gameIntent = new Intent(this, MenuActivity.class);
    startActivity(gameIntent);
}

MenuActivity

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,但这也没有帮助。为什么它会再次启动整个任务?这是非常有问题的,因为如果LoadActivity一次又一次地启动,我的内存不足。 (下一个问题将是后退按钮行为,但这是另一个问题)。我可以通过将最后一个活动名称保存为SharedPreferences或其他东西来修补一些丑陋的加载行为,但我宁愿选择一个干净的解决方案。

2 个答案:

答案 0 :(得分:0)

如果系统需要内存,Android将销毁Activities。您必须确保在onSaveInstanceState()中保存活动的状态,以便之后可以手动恢复它。您可以在SharedPreferencesSQLiteDatabase

中保存所需的值

答案 1 :(得分:0)

推出另一个应用实例。这就是问题的原因。

   // 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之前在启动器活动中编写上述代码。这将解决问题