簡體   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