一键退出APP的思路: 关闭所有的Activity(不需要kill进程)

首先,创建一个activity管理类,代码如下:

/** * Activity管理器:用于Activity管理和应用程序退出 */public class ActivityCollector {    public static List activities = new ArrayList<>();    public static void addActivity(Activity activity) {        activities.add(activity);    }    public static void removeActivity(Activity activity) {        activities.remove(activity);    }    public static void finishAllActivity() {        for (Activity activity : activities) {            if (!activity.isFinishing()) {                activity.finish();            }        }    }}

然后,在所有Activity的共同父类(如:BaseActivity)的onCreate方法和onDestroy方法里,分别调用ActivityCollector.addActivity(this)方法和ActivityCollector.removeActivity(this)方法,代码如下:

/** * BaseActivity:所有的Activity都将继承这个类 */public class BaseActivity extends AppCompatActivity {    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        ActivityCollector.addActivity(this);//每启动一个Activity,就将其加入到activity列表中    }    @Override    protected void onDestroy() {        super.onDestroy();        ActivityCollector.removeActivity(this);//当一个Activity调用onDestroy方法时,就将其从activity列表中删除    }}

最后,在需要一键退出APP的地方,调用ActivityCollector.finishAllActivity()方法即可。

 

注:

在网上看到很多说,退出APP要kill掉进程,通过调用 killProcess(android.os.Process.myPid()); 或者 System.exit(0); 方法, 我在ActivityCollector类的 finishAllActivity(); 方法的最后,添加了 killProcess(android.os.Process.myPid());方法后,运行APP,当调用 finishAllActivity(); 方法退出APP后,程序的进程是被kill掉了,但是过了一会儿后,又有新的进程产生; 调用System.exit(0);方法也是一样的。

其实,killProcess(android.os.Process.myPid()); 或 System.exit(0);方法都不应该直接调用, 进程是由系统底层进行管理的,android 系统会自己进行进程的处理回收:ActivityManager 一直监听着进程状态,如果发现进程被kill掉,会进行重启。正常情况下退出应用以后系统就会回收 app 进程, 但当 app 中有需要长时间运行的服务(比如消息推送)时系统就不会 kill 掉进程,即使我们手动 kill 掉进程, 进程也会自动重启。

所以,退出Android应用的话,finish掉所有的Activity即可。

更多相关文章

  1. Android(安卓)自定义Dialog,以及失去焦点之后,Dialog消失的解决
  2. Android(安卓)面试--请描述一下Activity的生命周期?
  3. Android(安卓)Handler 分析
  4. [Android]调用字符串资源的几种方法
  5. 【Android】ProcessRecord、ServiceRecord和ConnectionRecord
  6. android通过web service调用查询手机归属地代码
  7. Android应用推送角标设置方法
  8. Android6.0 设置默认输入法
  9. Android(安卓)- BroadcastReceiver

随机推荐

  1. order by newid() 各种数据库随机查询的
  2. SQL2000 事务回滚问题探讨
  3. 关于PowerDesigner初体验的使用介绍
  4. 基于存储过程的详细介绍
  5. sql动态行转列的两种方法
  6. SQL中的ISNULL函数使用介绍
  7. 关于sql server批量插入和更新的两种解决
  8. 基于Sql Server通用分页存储过程的解决方
  9. 关于SQL 存储过程入门基础(基础知识)
  10. 关于SQL 存储过程入门基础(变量)