すべてのActivity、Activity Group関連--getLocalActivity Manager()を一度に閉じる

4547 ワード

第1種
  ActivityManager am = (ActivityManager)getSystemService (Context.ACTIVITY_SERVICE);   
am.restartPackage(getPackageName()); 
システムは、このパッケージの下で、すべてのプロセス、サービス、すべてを殺すことができます.きれいに殺すことができます.注意してください.
      
第2種
Activityを起動するたびに、このActivityを記録します.すべてのActivityを閉じる必要がある場合は、すべてのActivityを閉じます.
第3種
ラジオでActivityをオフにします.まず、コードにブロードキャストを登録し、ブロードキャストを終了します.Activityを閉じる必要がある場合、ブロードキャストを送信します. 
第四種
仮想マシンをシャットダウン
5つ目
プロセスを殺す
Activity Groupの概要1.Activity Groupの核心はこのクラスを継承し、getLocalActivity Manager()からLocalActivity Manager、例えばLocalActivity Manager am=getLocalActivity Manager()を得ることができる.2.次に、LocalActivity Managerを使用してstartActivity(String id,Intent intent)を使用して、指定したActivityにバインドし、Windowを返します.LocalActivity Managerは、複数のActivity Window 1=amを同時に管理することができる.startActivity("Module1", newIntent(TestView.this, ModuleView1.class)); Window window2 = am.startActivity("Module2", newIntent(TestView.this, ModuleView2.class)); 3.その後、WindowはgetDecorView()メソッドで1つのViewを返し、指定したコンテナのaddView(View)メソッドとは異なる効果を実現することができる.getDecorView() View view2 = window2.getDecorView()実際には、containerはScrollViewのインスタンスcontainerであるなど、簡略化された形式で使用されることが多い.removeAllViews();//他のすべてのサブビューcontainer.を削除するaddView(getLocalActivityManager().startActivity(                        "Module2",                        new Intent(TestView.this, ModuleView2.class)                          .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)                                                     )                        .getDecorView()); 注意:container.removeAllViews():このビューを表示する前に、他のすべてのビューを削除することを示す.Intent.FLAG_ACTIVITY_CLEAR_TOP:現在のTaskで起動するActivityがある場合は、そのActivity以前のすべてのActivityをオフにし、Activityのインスタンスを作成しないようにする前にこのActivityを前にしておくと柔軟性が高く、TabHostのページング効果を実現するのが一般的ですが、titleなどのTabHostの欠点を避けることができます
 
 
 
4つのActivity:A,B,C,Dが既に起動している場合.D Activityでは、B Activityにジャンプし、C finishが落ちることを望んでいます.startActivity(intent)のintentにflagsタグを追加することができます.以下に示します.
[java]  view plain copy print ?
Intent intent = new Intent(this, B.class);   
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
startActivity(intent);  
Intent intent = new Intent(this, B.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

このようにB Activityを起動すると、D、Cをfinishedしてしまいます.B Activityの起動モードがデフォルトであれば、B Activityはfinishedし、新しいActivity Bを起動します.新しいB Activityを再作成したくない場合は、上のコードに次のように追加します.
[java]  view plain copy print ?
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);  
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

これによりB Activityは新しいものを作成し、前のB Activityを再利用し、B ActivityのonNewIntent()メソッドを呼び出します.
 
 
 
質問:マルチactivityでプログラム全体を終了します.例えば、A->B->C->Dから、Dから直接プログラムを終了する必要があります.
ネット上の資料:{finish()とsystem(0)いずれも単一activityのみを終了できます.Androidのウィンドウ類が歴史スタックを提供していることを知っています.stackの原理で巧みに実現することができます.ここではDウィンドウでAウィンドウを開くときにIntentに直接マークIntentを追加します.FLAG_ACTIVITY_CLEAR_TOPでは,再びAをオンにすると,そのプロセス空間のすべてのActivityがクリアされる.Dでは、次のコードを使用します.
[java]  view plain copy print ?
Intent intent = new Intent();   
intent.setClass(D.this, A.class);  
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//注意本行のFLAG設定startActivity(intent);  
finish();  
Intent intent = new Intent(); 
intent.setClass(D.this, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // FLAG 
startActivity(intent);
finish();

自分を消してAにコードを入れる:
[java]  view plain copy print ?
Override  
protected void onNewIntent(Intent intent) {  
// TODO Auto-generated method stub   
super.onNewIntent(intent);  
//終了 if ((Intent.FLAG_ACTIVITY_CLEAR_TOP & intent.getFlags()) != 0) {  
 finish();  
 }  
}  
Override
protected void onNewIntent(Intent intent) {
// TODO Auto-generated method stub
super.onNewIntent(intent);
// 
 if ((Intent.FLAG_ACTIVITY_CLEAR_TOP & intent.getFlags()) != 0) {
 finish();
 }
}

Aのマニフェストxmlはandroid:launchMode="singleTop"に構成されています
原理の総括:一般的にAはプログラムの入口点で、Dから1つのAのactivity、標識Intentを加える.FLAG_ACTIVITY_CLEAR_TOPこの過程でスタックの中のB,Cを全部片付けます.Aはandroid:launchMode="singleTop"はoncreate()を呼び出すのではなく、onNewIntent()に応答してIntentを判断するからである.FLAG_ACTIVITY_CLEAR_TOP、そしてA finish()を落とします.スタック内のA,B,C,Dはすべてクリーンアップされる.だからプログラム全体が終了しました.