在Android中,如果想退出Android程序,一般都是调用finish()、System.exit(0)、android.os.Process.killProcess(android.os.Process.myPid())等方法来实现退出程序功能,可是在实际开发中,并不能达到完全退出应用程序的效果,这是因为调用finish()、System.exit(0)、android.os.Process.killProcess(android.os.Process.myPid())只能杀死当前的activity,并不能杀死所有的activity,为了完美达到此效果,接下来通过一个案例实现:

一、使用单例模式创建一个Activity管理对象,该对象中有一个Activity容器(具体实现自己处理,使用LinkedList等)专门负责存储新开启的每一个Activity,并且容易理解、易于操作,非常不错!
MyApplication类(储存每一个Activity,并实现关闭所有Activity的操作

package com.hrtx.dd.activity;
import java.util.LinkedList;
import java.util.List;
import android.app.Activity;
import android.app.Application;
public class MyApplication extends Application {
  private List<Activity> activitys = null;
  private static MyApplication instance;
  private MyApplication() {
    activitys = new LinkedList<Activity>();
  }
  /**
   * 单例模式中获取唯一的MyApplication实例
   * 
   * @return
   */
  public static MyApplication getInstance() {
    if (null == instance) {
      instance = new MyApplication();
    }
    return instance;
  }
  // 添加Activity到容器中
  public void addActivity(Activity activity) {
    if (activitys != null && activitys.size() > 0) {
      if(!activitys.contains(activity)){
        activitys.add(activity);
      }
    }else{
      activitys.add(activity);
    }
  }
  // 遍历所有Activity并finish
  public void exit() {
    if (activitys != null && activitys.size() > 0) {
      for (Activity activity : activitys) {
        activity.finish();
      }
    }
    System.exit(0);
  }
}

二、在每一个Activity中的onCreate方法里添加该Activity到MyApplication对象实例容器中
复制代码 代码如下:
MyApplication.getInstance().addActivity(this);

三、在需要结束所有Activity的时候调用exit方法
复制代码 代码如下:
MyApplication.getInstance().exit();

//笔记
其他几种方式的退出应用

1.finish() 关闭当前的activity

该方法可以结束当前 Activity,但是如果你的App有很多 Activity 的话,使用该方法显得有点捉襟见肘了。

2.System.exit(0)

  该方法只能用于结束当前进程自身,在程序遇到异常,无法正常执行时,可以 通过这个方法强制退出。

当我们在写java程序时肯定用到过System.exit(0),它的意思是退出JVM(java虚拟机),在android中一样可以用,我们可以想像一下虚拟机都退出了当然执行System.exit的程序会完全退出,内存被释放。

注意:在android手机中查看当前正在运行的进程时可以发现还可以查看”后台缓存的进程”,你会发现很多退出了的程序还在后台缓存的进程中,如果不要让程序在后台缓存那么就可以用System.exit(0);来退出程序了,可以清除后台缓存的本进程。

System.exit(0),System.exit(1)的区别:

参数0和1代表退出的状态,0表示正常退出,1表示异常退出(只要是非0的都为异常退出),即使不传0来执行也可以退出,该参数只是通知操作系统该程序是否是正常退出。

  需要注意的是: android.os.Process.killProcess(pid) 和 System.exit(int code)会导致进程非正常退出,进程退出时不会去执行Activity的onPause、onStop和onDestroy方法,那么进程很有可能错过了保存数据的机会。因此,这两个方法最好使用在出现异常的时候!大家需要注意其使用方法。
  

3.android.os.Process.killProcess(android.os.Process.myPid())

(首先获取当前进程的id,然后杀死该进程。 建议使用这种方式, 只能终止本程序的进程,无法终止其它的。Android中所有的activity都在主进程中,在Androidmanifest.xml中可以设置成启动不同进程,Service不是一个单独的进程也不是一个线程。
当你Kill掉当前程序的进程时也就是说整个程序的所有线程都会结束,Service也会停止,整个程序完全退出。,通过这种方式不能将应用程序完全杀死,并且他不会把当前应用应用的Activity的task任务栈清空)

4.killBackgroundProcesses()

manager.killBackgroundProcesses(getPackageName());
  使用示例代码如下:
ActivityManager manager = (ActivityManager)getSystemService(ACTIVITY_SERVICE);
manager.killBackgroundProcesses(getPackageName());

//需要在xml中加入权限声明     
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>

在android2.2以后,如果服务在ondestroy里加上了start自己,用kill backgroudprocess通常无法结束自己。
5. 小结

finish():结束当前Activity,不会立即释放内存。遵循android内存管理机制。


exit():结束当前组件如Activity,并立即释放当前Activity所占资源。


killProcess():结束当前组件如Activity,并立即释放当前Activity所占资源。


restartPackage():结束整个App,包括service等其它Activity组件。