2012-03-05 40 views
6

我在我的方向改變應用中有一個奇怪的行爲方向改變後的活動二次

正常行爲:
當我打開我的應用程序,我的家庭活動開始。當我進入下一個活動(畫廊)時,它會正常啓動(從右向左滑動動畫)。 當我返回使用後退鍵時,當前活動(圖庫)完成(從左向右滑動動畫)。

奇怪的行爲:

  • 當我開始在縱向模式下的應用程序,並改變方向爲橫向。然後就像家庭活動的第二個例子。因爲然後在橫向模式下按下後退按鈕並不會關閉應用程序,而不會改變方向(家庭活動是我應用程序中的第一個活動),但是會從左向右進行滑動動畫(如啓動新活動)並再次顯示家庭活動(但我認爲是另一個實例)。第二次按下後退按鈕關閉應用程序。
  • 當我在橫向模式下啓動應用程序並將縱向更改爲縱向模式時,按後退按鈕會導致從右向左的幻燈片動畫(如關閉活動)並再次顯示主頁活動。
  • 當我啓動應用程序並進行兩個方向更改縱向橫向肖像時,後退按鈕將關閉應用程序。

所以它就像風景和肖像模式被視爲兩種不同的活動。

我不使用android:configChanges="orientation|keyboardHidden|screenSize",所以方向更改應該遵循正常的android活動生命週期,並銷燬活動的「舊」肖像(或風景)版本。
我的活動繼承自FragmentActivity。 我使用onSaveInstanceState來傳遞parceable(它不包含任何活動的引用),我使用onRetainCustomNonConfigurationInstanceread 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; 
    } 

我希望這有助於?!

+0

告訴我們代碼... – 2012-03-05 20:59:11

+0

...包括您的清單中的活動聲明,PLZ。 – Turnsole 2012-03-05 21:42:33

+3

+1對於一個很好的問題,向我們展示你的努力:) – 2012-03-07 14:25:12

回答

0

我遇到了類似的問題,看來你的問題的原因是重寫onRetainCustomNonConfigurationInstance()

我檢查了我的保留狀態對象,發現它保存着對Context的引用。我將它包裝在WeakReference中,並且正常的行爲返回並且沒有奇怪的雙重事件。

也許你的保留狀態也持有對Context的引用?