すべてのアクティビティを破棄し、現在のアプリケーションを終了します



Destroy All Activities



私はブロードキャスト方式を使用しますが、欠点は、出口がすべてのアクティビティであり、指定されたアクティビティを破棄できないことです(ただし、使用量が少ないようです)。さらに、Aインターフェイスで起動モードをsingleTaskに設定しました。誰かがアカウントにログインすると、ログインページにログインするように設定したアカウントの操作インターフェースAからジャンプします。

私の中の3番目のメソッドは常にクラッシュしようとしましたが、理由はわかりません。



Android:いくつかの方法でアプリケーションを終了するためにすべてのアクティビティを破棄します

著者:DRCスタジオ



アクティビティがスタックに保存されていることは誰もが知っています。デフォルトの場合(標準)のアクティビティは、高度な後入れ先出し方式でスタックに格納されます。最初に表示されるアクティビティはスタックの一番下に存在し、新しく起動されたアクティビティは常にスタックの一番上に存在します。ますます多くのアクティビティを開く場合、現在、インターフェイスで現在のアプリケーションを終了するか、戻るボタンをダブルクリックして現在のアプリケーションを終了します。現時点では、スタック内のすべてのアクティビティからアプリケーションが空になるまで、現在アクティブ化されているアクティビティの1つだけを1つずつ破棄できます。アプリケーションを終了する4つの一般的な方法は次のとおりです。

すべてのアクティビティを破棄してアプリケーションを終了するには、次の4つの一般的な方法があります。

(1)System.exit(0)は、systemメソッドを使用して強制終了します

(2)例外をスローし、強制終了します



(3)アプリケーションを使用して終了する

(4)ブロードキャストを使用して終了します

最初の方法 System.exit(0) :プログラムが終了し、現在実行中のプログラムが終了することを示します Java 仮想マシン、Javaでは、この方法を使用してアプリケーション全体を閉じます。初期の段階では、多くの開発者がこの方法を使用していました。開発プロジェクト中にこの方法を使用して終了しましたが、一部のモデルでは、アプリケーションがアプリケーションを終了すると、アプリケーションのダイアログボックスがポップアップし、終了後に再開する場合があります。ユーザーエクスペリエンスはあまり良くありません。しかし、この方法を使用する開発者はまだ少数です。使用方法は非常に単純なので、終了する必要がある場所にこのコードを追加するだけです。

2番目の方法は、例外をスローして強制終了することです。この方法は基本的に現在は見られません。ユーザーエクスペリエンスは最初の方法よりも悪く、例外をスローし、システムクラッシュであるため、アプリケーションを終了する効果が得られます。 。

アプリケーションを使用して終了する3番目の方法:最も一般的な方法の1つは、アプリケーションがAndroidのシステムコンポーネントであることを誰もが知っています。アプリケーションが起動すると、アプリケーションが自動的に作成され、アプリケーションは1つのアプリケーションにしか存在できません。 、それライフサイクルも最長です。作成したアプリケーションを使用する必要がある場合は、Androidmanifest.xmlのタグにname属性を追加するだけで済みます。作成したアプリケーションの完全なパッケージ名とクラス名を入れても問題ありません。

では、Applicationを使用して現在のアプリケーションを終了するにはどうすればよいでしょうか。

アプリケーションを使用してアプリケーションを終了する、私が書いたデモを見てみましょう。

パブリッククラスmyApplicationはApplicationを拡張します{
プライベートリストoList //は、開始されたすべてのアクティビティのコレクションを保存するために使用されます

public void onCreate(){
super.onCreate()
oList = new ArrayList()
}

/ **
*アクティビティを追加
* /
public void addActivity_(Activity activity){
//アクティビティが現在のコレクションに存在しないことを確認します
if(!oList.contains(activity)){
oList.add(activity)//現在のアクティビティをコレクションに追加します
}
}

/ **
*単一のアクティビティを破棄します
* /
public void removeActivity_(Activity activity){

//現在のコレクション内のアクティビティの存在を確認します
if(oList.contains(activity)){
oList.remove(activity)//コレクションから削除
activity.finish()//現在のアクティビティを破棄します
}
}

/ **
*すべてのアクティビティを破棄します
* /
public void removeALLActivity _(){

//ループを介して、コレクション内のすべてのアクティビティを破棄します
for(アクティビティアクティビティ:oList){
activity.finish()
}
}
}

すべてのアクティビティを管理するために使用され、すべてのアクティビティはこのクラスを継承します

パブリッククラスBaseActivityはActivity {を拡張します
プライベートmyApplicationアプリケーション
プライベートBaseActivityoContext

protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState)

if(application == null){
// Applicationオブジェクトを取得します
application =(myApplication)getApplication()
}
oContext = this //現在のコンテキストオブジェクトをBaseActivityに割り当てます
addActivity()// addメソッドを呼び出す
}

//アクティビティメソッドを追加します
public void addActivity(){
application.addActivity_(oContext)// myApplicationのAddActivityメソッドを呼び出します
}
//アクティビティメソッドを破棄します
public void removeActivity(){
application.removeActivity_(oContext)// myApplicationを呼び出して単一のActivityメソッドを削除する
}
//すべてのアクティビティメソッドを破棄します
public void removeALLActivity(){
application.removeALLActivity _()// myApplicationを呼び出して、すべてのアクティビティメソッドを破棄します
}

/ * Toastを再利用可能なメソッドとして定義します。使用時にプロンプ​​トを表示する必要があるコンテンツのみを渡す必要があります* /
public void show_Toast(String text){
Toast.makeText(oContext、text、Toast.LENGTH_SHORT).show()
}
}

パブリッククラスMainActivityはBaseActivityを拡張します{

protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}

//バインドボタン
public void button(View v){

startActivity(new Intent(MainActivity.this、oneActivity.class))/ / oneActivityにジャンプします
}
// onKeyDownメソッドを書き直します
public boolean onKeyDown(int keyCode、KeyEvent event){

//クリックが戻るボタンであるかどうかを判断します
if(keyCode == event.KEYCODE_BACK){
exit()// Exitメソッド
}
trueを返す
}

プライベートロングタイム= 0

//終了メソッド
private void exit(){
// 2秒で2秒を超える場合
if(System.currentTimeMillis()-時間> 2000){
//現在の時刻を取得します
時間= System.currentTimeMillis()
showToast( 'もう一度クリックしてアプリケーションを終了します')
} そうしないと {
// 2秒以内にクリック
removeALLActivity()// remove soActivityメソッドを実行します
}
}

}

パブリッククラスoneActivityはBaseActivityを拡張します{


protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState)
setContentView(R.layout.onelayout)
}
//バインドボタン
public void button(View v){
Intent intent = new Intent(this、MainActivity.class)//メインインターフェイスに移動します
startActivity(インテント)
}
}

android:name = 'com.jxsw.chong.application_closeactivity.myApplication' // myapplicationを登録します
android:allowBackup = 'true'
android:icon = '@ drawable / ic_launcher'
android:label = '@ string / app_name'
android:theme = '@ style / AppTheme'>
android:name = 'com.jxsw.chong.application_closeactivity.MainActivity'
android:label = '@ string / app_name'>






各アクティビティは、独自に定義されたBaseActivityから継承します。アクティビティを開くたびに、BaseActivityのonCreate()メソッドでaddActivity()メソッドを実行します。この方法は、myApplicationクラスにアクティビティを追加することです。メソッド、現在のアクティビティをコレクションに入れ、戻るボタンを2回クリックすると、すべてのアクティビティを破棄するメソッドを実行します。これにより、アプリケーションを完全に終了する効果が得られます。

PS:androidmanifest.xmlにmyApplicationを登録することを忘れないでください

ブロードキャスト出口を使用する4番目の方法:ブロードキャストを使用して出口アプリケーションを実現します。実際、アイデアの実装は3番目よりも比較的簡単です。BaseActivityを記述し、終了する必要があるときに他のアクティビティを継承させます。 、BaseActivityを破棄すると、他の継承とそのアクティビティが破棄されます。

ブロードキャストを使用してアプリケーションを終了するために作成したデモを見てみましょう。

パブリッククラスBaseActivityはActivity {を拡張します
プライベートMyBaseActiviy_BroadoBaseActiviy_Broad


protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState)
//動的登録ブロードキャスト
oBaseActiviy_Broad = new MyBaseActiviy_Broad()
IntentFilter intentFilter = new IntentFilter( 'drc.xxx.yyy.baseActivity')
registerReceiver(oBaseActiviy_Broad、intentFilter)
}
//破棄されたメソッドでブロードキャストの登録を解除します
保護されたvoidonDestroy(){
super.onDestroy()
unregisterReceiver(oBaseActiviy_Broad)//ログアウトブロードキャスト
}
//ブロードキャストを定義します
パブリッククラスMyBaseActiviy_BroadはBroadcastReceiverを拡張します{

public void onReceive(Context arg0、Intent intent){
//送信されたブロードキャストコンテンツを受信します
int closeAll = intent.getIntExtra( 'closeAll'、0)
if(closeAll == 1){
finish()// BaseActivityを破棄します
}
}

}
/ **
*トースト情報を表示する
* /
public void showToast(String text){
Toast.makeText(this、text、2000).show()
}
}

パブリッククラスMainActivityはBaseActivityを拡張します{

protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
//バインドボタン
public void button(View v){
インテントインテント=新しいインテント(this、oneActivity.class)
startActivity(インテント)
}
// onkeydownメソッドを書き直します
public boolean onKeyDown(int keyCode、KeyEvent event){
//クリックして戻るボタン
if(keyCode == event.KEYCODE_BACK){
exit()//終了メソッド
}
trueを返す
}


プライベートロングタイム= 0

//終了メソッド
private void exit(){
if(System.currentTimeMillis()-時間> 2000){
時間= System.currentTimeMillis()
showToast( 'もう一度クリックしてアプリケーションを終了します')
} そうしないと {
インテントインテント= new Intent( 'drc.xxx.yyy.baseActivity')
intent.putExtra( 'closeAll'、1)
sendBroadcast(intent)//ブロードキャストを送信します
}
}

}

パブリッククラスoneActivityはBaseActivityを拡張します{

protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState)
setContentView(R.layout.onelayout)
}

//バインドボタン
public void button(View v){
インテントインテント=新しいインテント(this、MainActivity.class)// MainActivityにジャンプ
startActivity(インテント)
}
}

私は別のブログ投稿を試していません。方法2はトップ3と同じであるはずです。

まず、finish()がすべてのアクティビティではなく、現在のアクティビティのみを強制終了することを説明します

方法1:DalvikVMのローカルメソッド

1、android.os.Process.killProcess(android.os.Process.myPid())PIDを取得します。現在は自分用のAPIのみを取得します。それ以外の場合は、/ procから他のプロセスを列挙しますが、説明する必要があります。必ず許可が必要です。許可がないと、混乱してしまいます。
2、System.exit(0)通常のjava、c#標準の終了メソッド、戻り値0は通常の終了を意味します

方法2:

(1)ActivityCollector.javaを作成します。このクラスは、アクティビティを収集および破棄するためのパブリッククラスとして使用されます。

画像

public class ActivityCollector { public static List activities = new ArrayList() public static void addActivity(Activity activity) { activities.add(activity) } public static void removeActivity(Activity activity) { activities.remove(activity) } public static void finishAll() { for (Activity activity : activities) { if (!activity.isFinishing()) { activity.finish() } } } }

画像

(2)。 BaseActivity.java基本クラスを作成します。プロジェクト内のすべてのアクティビティはこのクラスを継承し、上記のクラスのメソッドを呼び出します。

画像

public class BaseActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState) ActivityCollector.addActivity(this) } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy() ActivityCollector.removeActivity(this) }

画像

(3)3つのアクティビティA、B、およびCがそれぞれBaseActivity.javaを継承するようにします。

(4)すべてのアクティビティを終了するには、ActivityCollector.javaのfinishAll()メソッドを呼び出すだけです。

アクティビティの宣言期間に応じた方法3

Androidウィンドウクラスは履歴スタックを提供します。スタックの原則を使用して、巧妙な実装を実現できます。

ここでは、AウィンドウでBウィンドウを開くときに、フラグIntent.FLAG_ACTIVITY_CLEAR_TOPをインテントに直接追加します。

これにより、Bがオンになると、プロセススペースのすべてのアクティビティがクリアされます。

 / / In the A window, use the following code to call the B window Intent intent = new Intent() intent.setClass(MainActivity.this, otherActivity.class) intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) //Note the FLAG setting of this line startActivity(intent) //Invoke finish() in the B window and it all ends.