最近做一个即时通讯项目,在做退出功能的时候,才发现自己不知不觉纠结了半天时间,查找各种资料,使出各种招,没有使程序完全退出,要么Service还在后台跑着,要么只是退出当前Activity,也是醉了.

如果想退出Android程序,找到了一些方法:

  1. Dalvik VM的本地方法:
    android.os.Process.killProcess(android.os.Process.myPid()) //获取PID
    System.exit(0); //常规java、c#的标准退出法,返回值为0代表正常退出
  2. 任务管理器方法:
    ActivityManager am = (ActivityManager)getSystemService (Context.ACTIVITY_SERVICE);
    am.restartPackage(getPackageName());
    或者killBackgroudProcesses(getPackageName())
    系统会将,该包下的 ,所有进程,服务,全部杀掉,就可以杀干净了,要注意加上 权限。
  3. 根据Activity堆栈原理,自动清除Activity堆栈再退出;
Intent intent = new Intent(); 
intent.setClass(Android123.this, CWJ.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  //或者其他Flag 
startActivity(intent);

以上方法都几乎对完全退出没什么效果~

收集了一下真正可以实现完全退出的方法:

  1. 通过Application保存所有运行着的Activity
public class ExitManager extends Application{
  private List<Activity> activityList=new LinkedList<Activity>();
     private static ExitManager instance;

     private ExitManager(){

     }
     public static ExitManager getInstance(){
       if (instance==null) {
      instance=new ExitManager();
    }
       return instance;
     }
     public void addActivity(Activity activity){
       activityList.add(activity);
     }
     public void exit(){
       for(Activity activity:activityList){
           if(!activity.isFinishing()){
              activity.finish();
           }
       }
       int id=android.os.Process.myPid();
       if(id!=0){
         android.os.Process
        .killProcess(id);
       }
     }
}

其次要在每个Activity的onCreate方法中加入如下代码:

ExitManager.getInstance().addActivity(this);

也就是将每个Activity加入到Activity容器中。最后,在实现退出应用程序的地方加入如下代码:

ExitManager.getInstance().exit();
  1. 给所有Activity和Service组件发一个消息,组件收到消息后结束自己。

给所有Activity和Service组件发一个消息方式有很多,就不罗嗦了,
现成的例子:使用观察者模式完美实现android程序退出

在经过一番摸索后,发现我的程序中要想做退出太简单了:因为我的退出按钮位于设置页面SetUpActivity,设置页面的只有一个父层页面MainActivity,我直接在点击事件中给后台Service法以个广播,Service收到后StopSelf(),接着设置回调结果,finis掉SetActivity自己。MainActivity收到回调结果后finis掉自己。自此程序结束。

以上两种方式,虽然理解起来很好,而且很有效。但是总觉得很挫。我估计谷歌在设计Android的时候压根就不想为app做退出方面的考虑,在他们看来,退出功能是没有必要的~。个人觉得Android没有退出功能也不是什么严重的问题.不过人们还是倾向于适应一个有”退出“功能的APP.

最后, 我们知道Android的activity是堆栈式的,一层一层的堆叠。在设计的时候,退出功能最好放置在浅层,所有的Activity和service的存活状态都了如指掌,都在点击退出的时候,我们只需要通知关闭父层级少数个Activity和后台Service就可以做到所谓的“完全退出”。