![](/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.