杀死全部的Activity,退出当前程序
首先说明finish()杀死的只是当前的Activity,并不是全部的Activity
方法一:Dalvik VM的本地方法
1、android.os.Process.killProcess(android.os.Process.myPid()) 获取PID,目前获取自己的也只有该API,否则从/proc中自己的枚举其他进程吧,不过要说明的是,结束其他进程不一定有权限,不然就乱套了。
2、System.exit(0) 常规java、c#的标准退出法,返回值为0代表正常退出
方法二:
(1)创建一个ActivityCollector.java,此类用作收集和销毁activity的公共类
public class ActivityCollector { public static List<Activity> activities = new ArrayList<Activity>(); 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基类,项目中的所有activity都继承此类,调用上面类的方法就可以。
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)让A, B, C这三个activity分别去继承BaseActivity.java
(4)只需要调用ActivityCollector.java中的finishAll()方法,就可以结束全部Activity了。
方法三、根据Activity的声明周期
Android的窗口类提供了历史栈,我们可以通过stack的原理来巧妙的实现
这里我们在A窗口打开B窗口时在Intent中直接加入标志Intent.FLAG_ACTIVITY_CLEAR_TOP
这样开启B时将会清除该进程空间的所有Activity。
//在A窗口中使用下面的代码调用B窗口 Intent intent = new Intent(); intent.setClass(MainActivity.this, otherActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //注意本行的FLAG设置 startActivity(intent); //在B窗口中调用finish()就全部结束掉了