如何干净彻底地退出Android应用程序,如何干净地关闭所有已打开的Activity? 如何关闭指定的Activity? 如何关闭一类Activity?
搜索了一下,有以下一些
1. 任务管理器方法(ActivityManager)
首先要说明该方法运行在Android 1.5 API Level为3以上才可以,
系统会将,该包下的,所有进程,服务,全部杀掉
ActivityManager am = (ActivityManager)getSystemService (Context.ACTIVITY_SERVICE);
am.restartPackage(getPackageName());
要注意加上权限
<uses-permission android:name="android.permission.RESTART_PACKAGES\"></uses-permission>
2. Dalvik VM的本地方法
android.os.Process.killProcess(android.os.Process.myPid()) //获取PID
System.exit(0); //常规java、c#的标准退出法,返回值为0代表正常退出
killProcess( )需要添加权限
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES\"></uses-permission>
3.一种比较流行的Android退出方法
使用单例模式创建一个Activity管理对象,该对象中有一个Activity容器(具体实现自己处理,使用LinkedList等)专门负责存储新开启的每一个Activity,容易理解、易于操作。
我的代码就是使用第三种方法,通过创建一个 Activity界面管理工具类实现的。
package com.demo.android.model;
import android.app.Activity;
import com.demo.util.LogUtils;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* Activity界面管理工具
*/
public final class ActivityManager {
private static List<Activity> activities = new ArrayList<Activity>();// 普通Activity
/**
* 添加普通Activity
*
* @param activity
*/
public static void addActivity(Activity activity) {
if (activities.contains(activity)) {
removeActivity(activity);
}
activities.add(activity);
LogUtils.debug("ActivityManager--enter", activity.getClass().getSimpleName());
}
/**
* 删除普通Activity
*
* @param activity
*/
public static void removeActivity(Activity activity) {
activities.remove(activity);
LogUtils.debug("ActivityManager--exit", activity.getClass().getSimpleName());
}
/**
* 结束普通Activity的栈顶的元素
*
*/
public static void getTopActivityAndFinish() {
Activity top = activities.get(activities.size() - 1);
removeActivity(top);
top.finish();
}
public static boolean isActivityTop(String name){
Activity top = activities.get(activities.size() - 1);
return top.getClass().getSimpleName().equals(name);
}
/**
* 结束当前之外的Activity
*/
public static void finishNotTopActivity(Activity top) {
Iterator<Activity> iterator = activities.iterator();
while (iterator.hasNext()) {
Activity activity = iterator.next();
if (top != activity) {
iterator.remove();
activity.finish();
}
}
}
/**
* 结束所有activity
*/
public static void finishAllActivity() {
Iterator<Activity> iterator = activities.iterator();
while (iterator.hasNext()) {
Activity activity = iterator.next();
iterator.remove();
activity.finish();
}
}
public static void backToActivity(String toActivity) {
List<Activity> needRemove = new ArrayList<Activity>();
for (int i = activities.size() - 1; i < activities.size(); i--) {
if (i >= 0) {
Activity activity = activities.get(i);
if (toActivity.equals(activity.getClass().getSimpleName())) {
break;
}
needRemove.add(activity);
// removeActivity(activity);
// activity.finish();
}
}
activities.removeAll(needRemove);
// finish后对象销毁,确保上一步准确执行还是提出来做
for (Activity activity : needRemove) {
activity.finish();
}
}
}
在BaseActivity中添加
public class BaseActivity extends AnActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityManager.addActivity(this);
.....
}
}
@Override
protected void onDestroy() {
....
ActivityManager.removeActivity(this);
super.onDestroy();
}
在点击退出程序的时候,执行
ActivityManager.finishAllActivity();
其他的关闭Activity方法网上相关的说明
- finish():结束当前Activity,不会立即释放内存。遵循android内存管理机制。
- exit():结束当前组件如Activity,并立即释放当前Activity所占资源。
- killProcess():结束当前组件如Activity,并立即释放当前Activity所占资源。
- restartPackage():结束整个App,包括service等其它Activity组件。
特别注意:
除了finish()方法可以调用Activity的生命周期方法如onStop()、onDestroy(),其余三种退出App均不会调用Activity的生命周期方法。除非,在调用这几个方法之前或者之后主动调用Activity的生命周期方法。如:
System.exit(int);
onDestroy();