我在我的方向改變應用中有一個奇怪的行爲。方向改變後的活動二次
正常行爲:
當我打開我的應用程序,我的家庭活動開始。當我進入下一個活動(畫廊)時,它會正常啓動(從右向左滑動動畫)。 當我返回使用後退鍵時,當前活動(圖庫)完成(從左向右滑動動畫)。
奇怪的行爲:
- 當我開始在縱向模式下的應用程序,並改變方向爲橫向。然後就像家庭活動的第二個例子。因爲然後在橫向模式下按下後退按鈕並不會關閉應用程序,而不會改變方向(家庭活動是我應用程序中的第一個活動),但是會從左向右進行滑動動畫(如啓動新活動)並再次顯示家庭活動(但我認爲是另一個實例)。第二次按下後退按鈕關閉應用程序。
- 當我在橫向模式下啓動應用程序並將縱向更改爲縱向模式時,按後退按鈕會導致從右向左的幻燈片動畫(如關閉活動)並再次顯示主頁活動。
- 當我啓動應用程序並進行兩個方向更改縱向橫向肖像時,後退按鈕將關閉應用程序。
所以它就像風景和肖像模式被視爲兩種不同的活動。
我不使用android:configChanges="orientation|keyboardHidden|screenSize"
,所以方向更改應該遵循正常的android活動生命週期,並銷燬活動的「舊」肖像(或風景)版本。
我的活動繼承自FragmentActivity
。 我使用onSaveInstanceState
來傳遞parceable(它不包含任何活動的引用),我使用onRetainCustomNonConfigurationInstance
(read here)來傳遞幾個AsyncTask
s。但是這些任務中的所有引用(如果有的話)在onRetainCustomNonConfigurationInstance
中銷燬並在getLastCustomNonConfigurationInstance
之後恢復(使用新創建的活動)。
任何想法可能會導致此行爲?
編輯:在清單,文件
活動宣言:
<activity android:name=".activities.smartphone.HomeSmartphone" android:label="@string/app_name"></activity>
HomeSmartphone延伸主頁
家庭延伸MyFragmentActivity
MyFragmentActivity延伸android.support.v4.app.FragmentActivity
在MyFragmentActivity我只是做onCreate,onRestart,onStart,onSaveInstanceState,onPause,onResu一些日誌記錄/跟蹤的東西我,onStop,onDestroy通過調用跟蹤類的一些靜態方法,它只持有對應用程序上下文的引用。不適用於活動環境。
首頁是由HomeSmartphone和HomeTablet擴展的抽象類。這兩個類只是在不同的佈局中進行一些特殊的加載/刷新/初始化。
大多數任務都是在抽象的Home類中完成的。
public HomeRetainedObjects retained = new HomeRetainedObjects();
public boolean adIsShown = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.home);
Log.i("DEBUG", "onCreate(Home)");
if (savedInstanceState != null) {
this.adIsShown = savedInstanceState.getBoolean("adIsShown");
}
// write/update values in shared preferences
this.initPreferences();
// recover retained objects (mostly AsyncTasks)
this.recoverRetained();
// show content/refresh content
this.init();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean("adIsShown", this.adIsShown);
Log.i("DEBUG", "onSaveInstanceState(Home)");
}
public void recoverRetained() {
Object retained = this.getLastCustomNonConfigurationInstance();
if (retained instanceof HomeRetainedObjects) {
this.retained = (HomeRetainedObjects) retained;
if (this.retained.loadMessageTask != null) {
this.retained.loadMessageTask.restoreContext(this);
}
}
}
@Override
public Object onRetainCustomNonConfigurationInstance() {
if (this.retained.loadMessageTask != null) {
this.retained.loadMessageTask.destroyContext();
}
return this.retained;
}
我希望這有助於?!
告訴我們代碼... – 2012-03-05 20:59:11
...包括您的清單中的活動聲明,PLZ。 – Turnsole 2012-03-05 21:42:33
+1對於一個很好的問題,向我們展示你的努力:) – 2012-03-07 14:25:12