2012-03-05 6 views
6

オリエンテーションの変更に関する私のアプリケーションで、奇妙なの動作があります。オリエンテーション変更後のアクティビティの2番目の例

通常の動作:
私のアプリを開くと、私のホームアクティビティが始まります。私が次の活動(ギャラリー)に行くとき、それは普通に始まります(右から左へのスライドインアニメーションで)。 バックキーを使用して戻ると、現在のアクティビティ(ギャラリー)が終了します(左から右にスライドするアニメーションがあります)。

奇妙な行動:

  • 私はポートレートモードでアプリを起動し、景観への向きを変更しています。その後、家庭活動の第二のインスタンスのようなものがあります。それで、風景モードで戻るボタンを押しても、アプリの動きが変わらないようにアプリが閉じるわけではありません(ホームアクティビティはアプリの最初のアクティビティです)が、ラフターは左から右に(新しいアクティビティの開始のように)ホームアクティビティを表示します(ただし、別のインスタンスと思います)。戻るボタンをもう一度押すと、アプリケーションが終了します。
  • アプリを横向きモードで起動してオリエンテーションをポートレートモードに変更するときは、戻るボタンを押すと、右から左(スライドを閉じるなど)のスライドアニメーションが表示され、再びホームアクティビティが表示されます。
  • 私がアプリを起動し、縦向きの2つの向きを変更して横向きのポートレートを変更すると、戻るボタンはアプリを閉じるべきです。

だから、風景やポートレートモードのようなものだ二つの異なる活動のように扱われます。

私はandroid:configChanges="orientation|keyboardHidden|screenSize"を使用していませんので、オリエンテーションの変更は通常のアンドロイドのアクティビティライフサイクルに従い、アクティビティの「古い」ポートレート(またはランドスケープ)バージョンを破棄する必要があります。
私のアクティビティはFragmentActivityから継承されています。 onSaveInstanceStateを使用して、(アクティビティへの参照を含まない)parceableを渡しています。onRetainCustomNonConfigurationInstanceread here)を使用して、複数のAsyncTaskを渡しています。しかし、これらのタスクの参照は、いずれもonRetainCustomNonConfigurationInstanceで破棄され、getLastCustomNonConfigurationInstanceの後に復元されます(新しく作成されたアクティビティで)。

何がこの現象を引き起こす可能性がありますか?

EDIT:
マニフェスト・ファイルでの活動宣言:
<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は、アプリケーションコンテキストへの参照を保持する追跡クラスのいくつかの静的メソッドを呼び出します。アクティビティのコンテキストではありません。

HomeはHomeSmartphoneとHomeTabletによって拡張された抽象クラスです。これらの2つのクラスは、さまざまなレイアウトで特別なロード/リフレッシュ/初期化を行います。

ほとんどのタスクは抽象的なホームクラスで行われます。



    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

... –

+0

...あなたのマニフェスト、plzにアクティビティ宣言を含めてください。 – Turnsole

+3

+1私たちにあなたの努力を示す良いポーズの質問:) –

答えて

0

同様の問題が発生しました。問題の原因がonRetainCustomNonConfigurationInstance()を無効にしているようです。

保存状態オブジェクトを確認したところ、Contextへの参照が保持されていました。私はWeakReferenceでそれをラップし、正常な振る舞いが返され、奇妙なダブルインスタンスは残っていません。

保存状態でもContextの参照が保持されている可能性がありますか?

関連する問題