android自定义广播实现app完全退出

来源:互联网 发布:在centos上安装apache 编辑:程序博客网 时间:2024/04/27 16:18

 完全退出应用程序是一个基本的不能再基本的功能了,每个APP都会有这个功能,在java中这个功能很容易就实现了,这里就不多说了,但在android里,却好像没有那么容易,查阅了网上相关的资料和博客,大概有以下几种方法:

  1.利用 PackageManager关闭所有本程序相关的进程,有人说2.2以上此法就失效了,没有亲自试过,不枉下断言,感兴趣的可以自己试.

   2.利用java的exit()方法+android的killProcess(int pid); 小米3上亲测不可用,只能关掉当前Activity,可能在其它android系统中可以,但至少说明不通用.

   3.创建一个List<Activity>将所有新启动的Activity都加入到此列表中,在退出应用时,执行遍历此集合,将所有Activity关闭,可以勉强实现退出整个应用,缺点:代价太大,要在整个应用的生命同期中维护一个List,极易产生内存堆积,处理不好就是内存溢出,亲测会有内存堆积和溢出的现象,在小米1上溢出的更频繁.而且如果未关闭的Activity比较多的话,退出时会明显有一个卡的过程,用户体验不好.

   以上三种方法要不是不通用,要不就是不好用,看到过一篇博客,推荐用广播的方式去关闭整个应用程序,思路就是为所有的Activity创建一个父类,只要在父类中注册一个自定义关闭应用广播即可实现,仔细想了一下这个方法是可行的,只要在基类中动态注册一个广播就可实现这个功能.以下是自己写的一个退出应用的demo,具体到不同的应用中,只要稍加调整就可以使用:


[java] view plaincopy
  1. //自定义一个广播接收器,用来接收应用程序退出广播.  
  2. public class ExitAppReceiver extends BroadcastReceiver {  
  3.   
  4.     @Override  
  5.     public void onReceive(Context context, Intent intent) {  
  6.         // TODO Auto-generated method stub  
  7.         if (context != null) {  
  8.   
  9.             if (context instanceof Activity) {  
  10.   
  11.                 ((Activity) context).finish();  
  12.             } else if (context instanceof FragmentActivity) {  
  13.   
  14.                 ((FragmentActivity) context).finish();  
  15.             } else if (context instanceof Service) {  
  16.   
  17.                 ((Service) context).stopSelf();  
  18.             }  
  19.         }  
  20.     }  
  21. }  

[java] view plaincopy
  1. //应用程序中所有Activity的基类  
  2. public class BaseActivity extends Activity  {  
  3.       
  4.     private ExitAppReceiver exitReceiver = new ExitAppReceiver();  
  5.        //自定义退出应用Action,实际应用中应该放到整个应用的Constant类中.  
  6.         private static final String EXIT_APP_ACTION = "com.micen.exit_app";  
  7.   
  8.     @Override  
  9.     protected void onCreate(Bundle savedInstanceState) {  
  10.         super.onCreate(savedInstanceState);  
  11.         registerExitReceiver();  
  12.     }  
  13.   
  14.     private void registerExitReceiver() {  
  15.   
  16.             IntentFilter exitFilter = new IntentFilter();  
  17.         exitFilter.addAction(EXIT_APP_ACTION);  
  18.         registerReceiver(exitReceiver, exitFilter);  
  19.     }  
  20.   
  21.     private void unRegisterExitReceiver() {  
  22.   
  23.         unregisterReceiver(exitReceiver);  
  24.     }  
  25.   
  26.     @Override  
  27.     protected void onDestroy() {  
  28.         // TODO Auto-generated method stub  
  29.         super.onDestroy();  
  30.         unRegisterExitReceiver();  
  31.     }  
  32.   
  33.     @Override  
  34.     protected void onStart() {  
  35.         super.onStart();  
  36.     }  
  37.   
  38.     @Override  
  39.     protected void onStop() {  
  40.         super.onStop();  
  41.     }  
  42. }  
[java] view plaincopy
  1. //最后在要退出App的方法中添加以下发送广播代码即可.  
  2. Intent intent = new Intent();  
  3. intent.setAction(EXIT_APP_ACTION);  
  4. sendBroadcast(intent);  

  这个方法是我认为目前最好的退出整个应用的方法,即不会产生内存堆积,退出整个应用的时间也很短,提高了用户体验,实现起来也很简单.

0 0
原创粉丝点击