Androidは複数のビューIntent.FLAG_をオフにします。ACT IVITY_CLEAR_TOPの使い方

2496 ワード

既に4つのActivity:A,B,C,Dが起動されている場合。D Activityでは、私たちはB Activityにジャンプします。同時にC finishを落としたいです。startActivityのintentにflagsマークを追加します。以下の通りです。
[java] view plincopy
Intent intent = new Intent(this) B.class)    intent.setFlags(Intent.FLAG_)ACT IVITY_CLEAR_トップ   startActivity(intent)   このようにB Activityを起動すると、D、Cをfinishedします。もしあなたのB Activityの起動モードがデフォルトの場合、B Activityはfinishedを落として、新しいActivity Bを起動します。  新たにB Activityを作成したくないなら、上のコードに追加します。
[java] view plincopy
intent.addFlags(Intent.FLAG_)ACT IVITY_SINGLE_トップ   このようにB Activityはもう一つ新しいものを作成します。前のB Activityを再利用して、B ActivityのonNewIntent()メソッドを同時に呼び出します。
 
問題:マルチactivityでは、プログラム全体を終了します。例えば、A->B->C->Dから直接プログラムを終了する必要があります。
ネット上の資料:{finish()とsystem(0)は全部単一のactivityを退出することしかできません。Androidのウインドウクラスが歴史スタックを提供していることを知っています。私たちはStckの原理によって巧みに実現できます。ここではDウィンドウでAウィンドウを開けた時にIntentに直接にマークIntent.FLAGを入れます。ACT IVITY_CLEAR_TOPは、Aを再度開くと、そのプロセス空間のすべてのActivityをクリアします。Dには以下のコードを使用します。
[java] view plincopy
Intent intent = new Intent()    intent.set Class(D.this、 A.class)   intent.setFlags(Intent.FLAG_)ACT IVITY_CLEAR_トップ //本行のFLAG設定に注意してください。    startActivity(intent)   finish();  自分を消してAにコードを入れる:
[java] view plincopy
オーバーライド   protected void onNewIntent(Intent) intent) {   // TODO Auto-generated method stub   super.onnewIntent;   //終了    if ((Intent.FLAG_ACT IVITY_CLEAR_トップ & intent.getFlags() != 0) {    finish();    }   )   AのManifest.xmlはandroid:launchMode=「singleTop」に配置されています。
原理まとめ:一般Aはプログラムの入り口のところで、DからAのactivityをつけて、Intent.FLAG_をマークします。ACT IVITY_CLEAR_TOPはこの過程でスタック中B、Cを全部片付けます。Aはandroid:launchMode=「singleTop」はoncreateではなく、onnewIntent()に応答してIntent.FLAG_を判断します。ACT IVITY_CLEAR_トップ、そしてA finishを落とします。スタック中A,B,C,Dは全部整理されている。それでプログラム全体が終了しました。
歴史的なスタックを整理する方法を利用して、すべてのactivityを巧みにオフにします。まず一つの設定が見えないactivity Aでプログラムを起動します。このactivity Aの役割はスタックの底を埋めるためだけです。プログラムを起動して終了するだけでこのactivityが使えます。キャンセルが必要なときは、このactivity Aにジャンプします。  ,Aを付ける  finishは自分ですべてのactivityを閉じることができます。
        Intent intent = new Intent();
        intent.setClass(B.this, A.class);     //B          activity
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  //      
        startActivity(intent);
        Intent.FLAG_ACT IVITY_CLEAR_TOPはスタックの底にあるAをブルドーザーとして機能させ、一番下の階からスタックの中のactivityを全部片付けて、自分のoncreate方法にフィニッシュを入れて自分を終わらせれば、脱退が実現できます。心配なら、Aのondestroyメソッドにsystem.exit(0)を追加して、ジャンプ中のスレッドでも終了できます。
       このactivity Aをどのように初期化するかというと、プログラムを起動するかそれとも終了するかを決めて、適当にstaticタイプのブール変数を使って制御すればいいです。