オリエンテーションの変更に関する私のアプリケーションで、奇妙なの動作があります。オリエンテーション変更後のアクティビティの2番目の例
通常の動作:
私のアプリを開くと、私のホームアクティビティが始まります。私が次の活動(ギャラリー)に行くとき、それは普通に始まります(右から左へのスライドインアニメーションで)。 バックキーを使用して戻ると、現在のアクティビティ(ギャラリー)が終了します(左から右にスライドするアニメーションがあります)。
奇妙な行動:
- 私はポートレートモードでアプリを起動し、景観への向きを変更しています。その後、家庭活動の第二のインスタンスのようなものがあります。それで、風景モードで戻るボタンを押しても、アプリの動きが変わらないようにアプリが閉じるわけではありません(ホームアクティビティはアプリの最初のアクティビティです)が、ラフターは左から右に(新しいアクティビティの開始のように)ホームアクティビティを表示します(ただし、別のインスタンスと思います)。戻るボタンをもう一度押すと、アプリケーションが終了します。
- アプリを横向きモードで起動してオリエンテーションをポートレートモードに変更するときは、戻るボタンを押すと、右から左(スライドを閉じるなど)のスライドアニメーションが表示され、再びホームアクティビティが表示されます。
- 私がアプリを起動し、縦向きの2つの向きを変更して横向きのポートレートを変更すると、戻るボタンはアプリを閉じるべきです。
だから、風景やポートレートモードのようなものだ二つの異なる活動のように扱われます。
私はandroid:configChanges="orientation|keyboardHidden|screenSize"
を使用していませんので、オリエンテーションの変更は通常のアンドロイドのアクティビティライフサイクルに従い、アクティビティの「古い」ポートレート(またはランドスケープ)バージョンを破棄する必要があります。
私のアクティビティはFragmentActivity
から継承されています。 onSaveInstanceState
を使用して、(アクティビティへの参照を含まない)parceableを渡しています。onRetainCustomNonConfigurationInstance
(read 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;
}
私はこれが役に立ちますか?
... –
...あなたのマニフェスト、plzにアクティビティ宣言を含めてください。 – Turnsole
+1私たちにあなたの努力を示す良いポーズの質問:) –