1. 一键退出思路
1.1 实现页面不可见
- Activity 启动时,将这个 Activity 实例添加到 List 中
- Activity 销毁时,将这个 Activity 实例移除 List
- 在需要一键退出时,将这个 List 中的所有实例全部结束掉,并清空 List
1.2 实现杀死当前进程
页面不可见不代表应用完全退出,还需要杀掉这个应用程序对应的进程,杀掉进程有两种方法
- Process.killProcess(android.os.Process.myPid());
这个方法对应的包名为:
package android.os;
- System.exit();
这个方法对应的包名为:
package java.lang;
exit() 中可以传入整数型参数,传入 0 时,通知系统正常退出;传入其他整数时,通知系统异常退出。
1.3 备注项
- Android 中所有的 Activity 都在主进程中运行
- Service 不是一个单独的进程也不是一个线程
代码实现
MainActivity.java
package com.demo.thorn.onekeyexitdemo; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import static android.os.Process.killProcess; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ActivityCollector.addActivity(this);//在所有 Activity 的 onCreate 方法中添加自身的实例 } @Override protected void onDestroy() { super.onDestroy(); ActivityCollector.removeActivity(this);//在所有 Activity 的 onDestroy 方法中移除自身的实例 } public void oneKeyExit(View view) { ActivityCollector.onKeyExit();//在 list 中结束所有活动实例 killProcess(android.os.Process.myPid());//方法一、杀掉当前程序的进程 //System.exit(0);//方法二、 java 中的退出当前线程的方法 } }
ActivityCollector.java
package com.demo.thorn.onekeyexitdemo; import android.app.Activity; import java.util.ArrayList; public class ActivityCollector { public static ArrayList<Activity> activities = new ArrayList<>(); public static void addActivity(Activity activity){ activities.add(activity); } public static void removeActivity(Activity activity){ activities.remove(activity); } public static void onKeyExit(){ for(Activity activity:activities){ if(activity.isFinishing()){ activity.finish(); } } activities.clear(); } }