Android fragmentシステムメモリ不足等によりkill後の異常

2635 ワード

android4.0以降はfragmentの使用が強調されているようで、ADTの最新バージョンで生成されたデフォルトエンジニアリングでもfragmentが運用されており、使用してみると確かに使いやすく、1つのインタフェースを複数の独立した部分に分けて、それぞれの部分が独立して自分のロジックを実現し、互いにデータをやり取りすることができ、操作が便利であることがわかります.もちろん、接触するのが面倒なので、ゆっくり使えばいいです.
今日fragmentの使用中に問題が発生しました.具体的には、次のとおりです.
まず、一般的にfragmentを使用するにはactivityのonCreateメソッドにfragmentをnewし、fragmentマネージャに追加して表示します.次のようにします.
<span style="font-size:18px;">//     
Fragment fragment = new Fragment();
//        fragment
transaction.add(R.id.fragment_container, fragment).show(fragment).commit();</span>

では、問題が来ました.私たちはfragmentをnewした後、fragmentは自分のライフサイクルに入りました.ユーザーが現在のactivityをバックグラウンドに切り替えると(moveTaskToBackはfinishではありません)、コンテナactivityとfragmentはonStop状態に入ります(activityとfragmentのライフサイクルについて自分で頭で補う方法が呼び出されました)、携帯電話のメモリが神馬に不足している理由(携帯電話を挫く)私たちのアプリケーションkillを落として、この时に再びアプリケーションを開けて、activityとfragmentはすべて保留して、そしてonCreate->onStart->onResume方法を再実行して、重点!!!activityはまたnew Fragment()を実行して、また新しいfragmentをレイアウトマネージャに追加して、この时アプリケーションは2つのfragmentを実行します!それですべてが悪くなった...同じ操作を1回繰り返すと、アプリケーションにはもう1つのfragmentが追加されます.このように、子孫孫は尽きません.もちろん、2つのfragmentが実行されている間にプログラムは正常に実行されません.
とてもうれしくこの问题を発见することができて、ネット上の多くがこのようにfragmentを初期化することを见て、私は长い间穴をあけて、今日1时间余りやってやっとこの问题を発见して、それから无脳はfragmentのライフサイクルを补って、それからactivityの中を発见しました:
@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

この方法はパラメータ付きで、これを持って何をしているのか注意してください.使ったことないよ!そこでactivityのライフサイクルを観察したところ、activityのライフサイクルでは、可視段階を離れたり、焦点を失ったりすれば、activityがプロセスによって終了する可能性が高いことが分かった.KILLに落とされた場合、その時の状態を保存できる仕組みが必要です.これがsavedInstancesStateの役割です.
ActivityがPAUSEにある場合、killの前に、onSaveInstanceState()を呼び出して現在のactivityの状態情報(paused状態でKILLEDになる場合)を保存することができます.状態情報を保存するBundleは、onRestoreInstanceState()and onCreate()という2つのmethodに同時に渡されます.
では、解決策を見つけました.
if(savedInstanceState == null){
	fragment = new <span style="font-size:18px;">Fragment</span>();
	transaction.add(R.id.fragment_container, mainFragment, "mainFragment");
}else{
	fragment = manager.findFragmentByTag("mainFragment");
}
transaction.show(fragment).commit();

以上のコードで、savedInstanceStateが空かどうかを判断し、空証明が新しく来たのか、歴史がないのかを判断するとnewが1つですが、transactionに追加するときはtagを追加することに注意し、savedInstanceStateが空でない場合は歴史があることを証明し、killされたのではなく非正常killになったので、余計なfragmentが発生しないように、私はマネージャからtagを通じて前のfragmentを見つけて、それから表示して、このようにプログラムの中でまだactivityとfragmentが実行していて、プログラムも正常です.
小さい問題はやはり絶えずテストの中で答えを必要として、ネット上であげたのは問題もたくさん参考にすることができて、みんなはまだ良いfragmentの使用経験があって、ありがとうございます.