-
Notifications
You must be signed in to change notification settings - Fork 21
Android 退出所有activity的几种方式
Mr.wu edited this page May 18, 2017
·
4 revisions
第一种方式
public class MyApplication extends Application {
private List<Activity> activityList = new ArrayList<Activity>();
private static MyApplication instance;
// 单列模式获取唯一MyApplication的实例
public static MyApplication getinstance() {
if (instance == null) {
instance = new MyApplication();
}
return instance;
}
// 添加Activity到容器中
public void addActivity(Activity acivity) {
activityList.add(acivity);
}
// 遍历所有的Activity并fanish
public void closeAllActiivty() {
for (int i = 0; i < activityList.size(); i++) {
Activity activity = activityList.get(i);
activity.finish();
}
System.exit(0);
}
}
在Activity 的Oncreate()的方法中执行:
MyApplication.getinstance().addActivity(FirstActivity.this);
在退出所有的Activity执行:
MyApplication.getinstance().closeAllActiivty();
先来说一下原理。我们知道,Activity有四种启动模式,分别为:standard(默认模式)、singleTop、singleTask、singleInstance。本方式需要使用的就是singleTask启动模式。
如果设置一个Activity的启动模式为singleTask,那么每次启动此Activity时系统都会检查当前任务栈中是否已经存在此Activity的实例。如果已经存在,则不再创建此Activity新的实例,而是调用已存在的Activity的onNewIntent()方法,并把intent作为此方法的参数传递给它。然后它就会被置于栈顶,并把它之前的所有的Activity移除掉。
(我们先将进入应用的第一个Activity称为BaseActivity)。明白了基本原理之后就好办了,先将BaseActivity的启动模式设置为singleTask,并重写此Activity的onNewIntent()方法用来结束自己,之后会在此Activity上进入其他Activity进行数量不定的跳转。在需要退出时只需在当前Activity上调用startActivity(this,BaseActivity.class)会首先将除BaseActivity外的所有Activity结束掉,然后会自动调用BaseActivity的onNewIntent()结束掉自己,这样所有Activity都完美的退出了。
代码实现
第一步:设置BaseActivity的启动模式为singleTask
android:launchMode="singleTask"
第二步:重写BaseActivity的onNewIntent()方法
//声明一个静态常量,用作退出BaseActivity的Tag
public static final String EXIST = "exist";
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (intent != null) {//判断其他Activity启动本Activity时传递来的intent是否为空
//获取intent中对应Tag的布尔值
boolean isExist = intent.getBooleanExtra(EXIST, false);
//如果为真则退出本Activity
if (isExist) {
this.finish();
}
}
}
第三步:在需要退出应用的Activity中启动BaseActivity
Intent intent = new Intent(this,BaseActivity.class);
//传递退出所有Activity的Tag对应的布尔值为true
intent.putExtra(BaseActivity.EXIST, true);
//启动BaseActivity
startActivity(intent);
第三种方式
public class AppManager {
private static Stack<Activity> activityStack;
private volatile static AppManager instance;
private AppManager() {
}
/**
* 单一实例
*/
public static AppManager getAppManager() {
if (instance == null) {
synchronized (AppManager.class){
if(instance==null){
instance = new AppManager();
instance.activityStack = new Stack();
}
}
}
return instance;
}
/**
* 添加Activity到堆栈
*/
public void addActivity(Activity activity) {
if (activityStack == null) {
activityStack = new Stack<Activity>();
}
activityStack.add(activity);
}
/**
* 获取当前Activity(堆栈中最后一个压入的)
*/
public Activity currentActivity() {
try {
Activity activity = activityStack.lastElement();
return activity;
} catch (Exception e) {
// e.printStackTrace();
return null;
}
}
/**
* 获取当前Activity的前一个Activity
*/
public Activity preActivity() {
int index = activityStack.size() - 2;
if (index < 0) {
return null;
}
Activity activity = activityStack.get(index);
return activity;
}
/**
* 结束当前Activity(堆栈中最后一个压入的)
*/
public void finishActivity() {
Activity activity = activityStack.lastElement();
finishActivity(activity);
}
/**
* 结束指定的Activity
*/
public void finishActivity(Activity activity) {
if (activity != null) {
activityStack.remove(activity);
activity.finish();
activity = null;
}
}
/**
* 移除指定的Activity
*/
public void removeActivity(Activity activity) {
if (activity != null) {
activityStack.remove(activity);
activity = null;
}
}
/**
* 结束指定类名的Activity
*/
public void finishActivity(Class<?> cls) {
try {
for (Activity activity : activityStack) {
if (activity.getClass().equals(cls)) {
finishActivity(activity);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 结束所有Activity
*/
public void finishAllActivity() {
for (int i = 0, size = activityStack.size(); i < size; i++) {
if (null != activityStack.get(i)) {
activityStack.get(i).finish();
}
}
activityStack.clear();
}
/**
* 返回到指定的activity
*
* @param cls
*/
public void returnToActivity(Class<?> cls) {
while (activityStack.size() != 0)
if (activityStack.peek().getClass() == cls) {
break;
} else {
finishActivity(activityStack.peek());
}
}
/**
* 是否已经打开指定的activity
* @param cls
* @return
*/
public boolean isOpenActivity(Class<?> cls) {
if (activityStack!=null){
for (int i = 0, size = activityStack.size(); i < size; i++) {
if (cls == activityStack.peek().getClass()) {
return true;
}
}
}
return false;
}
/**
* 退出应用程序
*
* @param context 上下文
* @param isBackground 是否开开启后台运行
*/
public void AppExit(Context context, Boolean isBackground) {
try {
finishAllActivity();
ActivityManager activityMgr = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
activityMgr.restartPackage(context.getPackageName());
} catch (Exception e) {
} finally {
// 注意,如果您有后台程序运行,请不要支持此句子
if (!isBackground) {
System.exit(0);
}
}
}
}