我们都知道,Activity是存放在栈中。在默认的情况下(standard)Activity在栈中是以先进后出、后进先出的方式进行存放。最开始出现的Activity会存在栈底,最新启动的Activity总是会存在栈顶。当我们开启的Activity越来越多,当前想在某个界面退出当前应用程序的时候,或者双击返回键退出当前应用程序。这个时候只能一个一个的把当前所有启动的Activity销毁,直到清空栈中的所有Activity,应用程序才能退出
销毁所有Activity,退出应用程序常见的方式有下面四种:
(1) System.exit(0) 使用系统的方法,强制退出
(2) 抛出异常,强制退出
(3) 使用Application退出
(4) 使用广播退出
我在项目中使用第三种方式,在全局Application类中用一个List存放所有的Activity,退出时对所有的Activity使用finish()….。activity.finish();
下面给出具体的用法
1.创建一个MyApplication类,继承Application,在AndroidManifest.xml的application节点的
<application
android:name=".MyApplication"
....此处是其他配置....
/>
public class MyApplication extends Application {
//用于存放所有启动的Activity的集合
private List<Activity> activityList;
@Override
public void onCreate() {
super.onCreate();
activityList = new ArrayList<Activity>();
}
/**
* 添加Activity
*/
public void addActivity(Activity activity) {
// 判断当前集合中不存在该Activity
if (!activityList.contains(activity)) {
activityList.add(activity);//把当前Activity添加到集合中
}
}
/**
* 销毁单个Activity
*/
public void removeActivity(Activity activity) {
//判断当前集合中存在该Activity
if (activityList.contains(activity)) {
activityList.remove(activity);//从集合中移除
activity.finish();//销毁当前Activity
}
}
/**
* 销毁所有的Activity
*/
public void removeALLActivity() {
//通过循环,把集合中的所有Activity销毁
for (Activity activity : activityList) {
activity.finish();
}
}
}
2.创建一个BaseActivity类,应用中所有的Activity都继承这个基类,在BaseActivity中添加一下方法
public class BaseActivity extends Activity {
private MyApplication application;
private BaseActivity oContext;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (application == null) {
// 得到Application对象
application = (MyApplication) getApplication();
}
oContext = this;// 把当前的上下文对象赋值给BaseActivity
addActivity();// 调用添加方法
}
// 添加Activity方法
public void addActivity() {
application.addActivity(oContext);// 调用myApplication的添加Activity方法
}
//销毁当个Activity方法
public void removeActivity() {
application.removeActivity(oContext);// 调用myApplication的销毁单个Activity方法
}
//销毁所有Activity方法
public void removeALLActivity() {
application.removeALLActivity();// 调用myApplication的销毁所有Activity方法
}
}
3.在有退出操作的Activity类中调用removeALLActivity()方法即可
//退出系统
private long exitTime = 0;
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
if((System.currentTimeMillis()-exitTime) > 2000){
Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();
exitTime = System.currentTimeMillis();
}else{
removeALLActivity();//此处调用BaseActivity中的方法释放所有activity
finish();
System.exit(0);
}
return true;
}
return super.onKeyDown(keyCode, event);
}