繁体   English   中英

Android:按Home键后恢复应用程序时,应用程序始终从根活动开始

[英]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);
}

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,但这也无济于事。 为什么要重新开始整个任务? 这是非常有问题的,因为如果一遍又一遍地启动LoadingActivity,我的内存将耗尽。 (下一个问题将是后退按钮的行为,但这是另一个问题)。 我可以通过将最后一个Activity名称保存为SharedPreferences或其他东西来修改一些丑陋的加载行为,但是我宁愿选择一个干净的解决方案。

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

启动了另一个应用程序实例。 这就是问题的原因。

   // 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM