你的位置:首页 > 操作系统

[操作系统]退出多个activity的方法


1.使用List集合方式

用list保存activity实例,然后逐一干掉

import java.util.LinkedList;import java.util.List;import android.app.Activity;import android.app.AlertDialog;import android.app.Application;import android.content.DialogInterface;import android.content.Intent;public class SysApplication extends Application {private List<Activity> mList = new LinkedList<Activity>();private static SysApplication instance;private SysApplication() {}public synchronized static SysApplication getInstance() {  if (null == instance) {     instance = new SysApplication();   }     return instance;   }// add Activitypublic void addActivity(Activity activity) {   mList.add(activity);}  public void exit() {    try {      for (Activity activity : mList) {       if (activity != null)         activity.finish();         }       } catch (Exception e) {         e.printStackTrace();       } finally {       // System.exit(0);//去掉这个       }}@Overridepublic void onLowMemory() {  super.onLowMemory();   System.gc();}}在每个Activity的onCreate方法中添加类似代码:    public void onCreate(Bundle savedInstanceState) {      super.onCreate(savedInstanceState);      SysApplication.getInstance().addActivity(this);    }

  在需要退出程序的时候,调用:

SysApplication.getInstance().exit();

 简而言之,通过单例模式把每个Activity 的引用添加到一个全局链表中,每次退出程序调用System.exit(0)时,先调用链表中Activity 的finish方法 

 优点:实现简单,逻辑清晰

2.使用广播

推荐!!好方便!!

基本逻辑就是:定义一个BaseActivity,在这个Activity中绑定广播,在广播的onReceive方法中调用finish();然后以后的Activity都继承这个Activity,退出时发送广播,退出BaseActivity,父activity都退出了,子activity肯定退出。

代码如下:

import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.support.v7.app.AppCompatActivity;public class BaseActivity extends AppCompatActivity {  protected BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {    @Override    public void onReceive(Context context, Intent intent) {      finish();    }  };  @Override  public void onResume() {    super.onResume();    // 在当前的activity中注册广播    IntentFilter filter = new IntentFilter();    filter.addAction("ExitApp");    this.registerReceiver(this.broadcastReceiver, filter);  }  @Override  protected void onDestroy() {    // TODO Auto-generated method stub    super.onDestroy(); //解除绑定    this.unregisterReceiver(this.broadcastReceiver);  }}

  一个Activity实例:

import android.content.Intent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.KeyEvent;import android.view.View;import android.widget.Button;import android.widget.Toast;public class ActivityC extends BaseActivity {  Button btn;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_activity_c);    SysApplication.getInstance().addActivity(this);    btn = (Button) findViewById(R.id.acticityc_btn);    //关闭所有的activity    btn.setOnClickListener(new View.OnClickListener() {      @Override      public void onClick(View view) {      }    });  }  /**   * 捕获手机物理菜单键   */  private long exitTime = 0;  @Override  public boolean onKeyDown(int keyCode, KeyEvent event) {    if(keyCode == KeyEvent.KEYCODE_BACK){//&& event.getAction() == KeyEvent.ACTION_DOWN      if((System.currentTimeMillis()-exitTime) > 2000){        Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();        exitTime = System.currentTimeMillis();      } else {        myExit();      }      return true;    }    return super.onKeyDown(keyCode, event);  }  protected void myExit() {    //第二种退出方法    // SysApplication.getInstance().exit();    Intent intent = new Intent();    intent.setAction("ExitApp");    this.sendBroadcast(intent);    //super.finish();  }  @Override  protected void onStop() {    super.onStop();    Log.i("tag","ActivityC-onStop");  }  @Override  protected void onDestroy() {    super.onDestroy();    Log.i("tag","ActivityC-onDestroy");  }}

  就是在退出的地方调用这个:

private long exitTime = 0;  @Override  public boolean onKeyDown(int keyCode, KeyEvent event) {    if(keyCode == KeyEvent.KEYCODE_BACK){//&& event.getAction() == KeyEvent.ACTION_DOWN      if((System.currentTimeMillis()-exitTime) > 2000){        Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();        exitTime = System.currentTimeMillis();      } else {        myExit();      }      return true;    }    return super.onKeyDown(keyCode, event);  }  protected void myExit() {    //第二种退出方法    // SysApplication.getInstance().exit();    Intent intent = new Intent();    intent.setAction("ExitApp");    this.sendBroadcast(intent);    //super.finish();  }

  优点:方便,方便!!只需要在退出的地方发送广播就可以!!

这是我的退出时的输出:

08-09 15:33:48.869 26919-26919/example.com.closeapp I/tag: MainActivity-onPause08-09 15:33:49.279 26919-26919/example.com.closeapp I/tag: MainActivity-onStop08-09 15:33:51.569 26919-26959/example.com.closeapp D/OpenGLRenderer: endAllStagingAnimators on 0x55850598b0 (RippleDrawable) with handle 0x558504151008-09 15:33:56.079 26919-26919/example.com.closeapp I/tag: MainActivity-onDestroy08-09 15:33:56.089 26919-26919/example.com.closeapp I/tag: ActivityB-onDestroy08-09 15:33:56.399 26919-26919/example.com.closeapp I/tag: ActivityC-onDestroy