Android:按home后恢复应用程序时,应用程序始终从根Activity启动

Posted

技术标签:

【中文标题】Android:按home后恢复应用程序时,应用程序始终从根Activity启动【英文标题】:Android: When resuming app after pressing home, app always starts at root Activity 【发布时间】:2014-11-09 09:40:30 【问题描述】:

我的游戏用例如下所示:我有一个 LoadingActivity,它加载(通过 AsyncTask,但这无关紧要)并将游戏所需的所有图形存储在一个静态类中。加载完成后,出现MenuActivity。从这个活动中,我可以启动其他活动,如 LikeBeginActivity。

这是清单的 sn-p:

<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,通过launcher继续游戏时,总是从LoadingActivity开始,但是为什么整个任务都清空了呢?这对我来说没有意义。然后我考虑添加

android:alwaysRetainTaskState="true"

到清单中的 LoadingActivity,但这也无济于事。为什么它又开始了整个任务?这是非常有问题的,因为如果一遍又一遍地启动 LoadingActivity,我的内存就会耗尽。 (下一个问题将是后退按钮的行为,但这是另一个问题)。我可以通过将最后一个 Activity 名称保存为 SharedPreferences 或其他东西来修补一些丑陋的加载行为,但我更喜欢一个干净的解决方案。

【问题讨论】:

当您的应用不在前台清理资源时,操作系统可能会破坏您的活动。如果您说在应用启动时加载图形,这可能是正在发生的事情 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

   // 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 之前,在您的启动器活动中编写上述代码。这样就可以解决问题了

【讨论】:

以上是关于Android:按home后恢复应用程序时,应用程序始终从根Activity启动的主要内容,如果未能解决你的问题,请参考以下文章

android 按home键返回到桌面后,再按桌面应用图标又重新打开该应用的解决方法

按HOME后重新启动应用程序时如何返回最新启动的活动?

每次应用程序来自android的后台时启动第一个屏幕

从谷歌地图应用程序按下后恢复我的应用程序

在某些任务杀手杀死应用程序后如何恢复android应用程序?

Android性能优化第(八)篇---App启动速度优化之耗时检测处理