在Android中,如果想退出Android程序,一般都是调用finish()、System.exit(0)、android.os.Process.killProcess(android.os.Process.myPid())等方法来实现退出程序功能,可是在实际开发中,并不能达到完全退出应用程序的效果,这是因为调用finish()、System.exit(0)、android.os.Process.killProcess(android.os.Process.myPid())只能杀死当前的activity,并不能杀死所有的activity,为了完美达到此效果,接下来通过一个案例实现:
一、使用单例模式创建一个Activity管理对象,该对象中有一个Activity容器(具体实现自己处理,使用LinkedList等)专门负责存储新开启的每一个Activity,并且容易理解、易于操作,非常不错!
MyApplication类(储存每一个Activity,并实现关闭所有Activity的操作
package com.hrtx.dd.activity;
import java.util.LinkedList;
import java.util.List;
import android.app.Activity;
import android.app.Application;
public class MyApplication extends Application {
private List<Activity> activitys = null;
private static MyApplication instance;
private MyApplication() {
activitys = new LinkedList<Activity>();
}
/**
* 单例模式中获取唯一的MyApplication实例
*
* @return
*/
public static MyApplication getInstance() {
if (null == instance) {
instance = new MyApplication();
}
return instance;
}
// 添加Activity到容器中
public void addActivity(Activity activity) {
if (activitys != null && activitys.size() > 0) {
if(!activitys.contains(activity)){
activitys.add(activity);
}
}else{
activitys.add(activity);
}
}
// 遍历所有Activity并finish
public void exit() {
if (activitys != null && activitys.size() > 0) {
for (Activity activity : activitys) {
activity.finish();
}
}
System.exit(0);
}
}
二、在每一个Activity中的onCreate方法里添加该Activity到MyApplication对象实例容器中
复制代码 代码如下:
MyApplication.getInstance().addActivity(this);
三、在需要结束所有Activity的时候调用exit方法
复制代码 代码如下:
MyApplication.getInstance().exit();
//笔记
其他几种方式的退出应用
1.finish() 关闭当前的activity
该方法可以结束当前 Activity,但是如果你的App有很多 Activity 的话,使用该方法显得有点捉襟见肘了。
2.System.exit(0)
该方法只能用于结束当前进程自身,在程序遇到异常,无法正常执行时,可以 通过这个方法强制退出。
当我们在写java程序时肯定用到过System.exit(0),它的意思是退出JVM(java虚拟机),在android中一样可以用,我们可以想像一下虚拟机都退出了当然执行System.exit的程序会完全退出,内存被释放。
注意:在android手机中查看当前正在运行的进程时可以发现还可以查看”后台缓存的进程”,你会发现很多退出了的程序还在后台缓存的进程中,如果不要让程序在后台缓存那么就可以用System.exit(0);来退出程序了,可以清除后台缓存的本进程。
System.exit(0),System.exit(1)的区别:
参数0和1代表退出的状态,0表示正常退出,1表示异常退出(只要是非0的都为异常退出),即使不传0来执行也可以退出,该参数只是通知操作系统该程序是否是正常退出。
需要注意的是: android.os.Process.killProcess(pid) 和 System.exit(int code)会导致进程非正常退出,进程退出时不会去执行Activity的onPause、onStop和onDestroy方法,那么进程很有可能错过了保存数据的机会。因此,这两个方法最好使用在出现异常的时候!大家需要注意其使用方法。
3.android.os.Process.killProcess(android.os.Process.myPid())
(首先获取当前进程的id,然后杀死该进程。 建议使用这种方式, 只能终止本程序的进程,无法终止其它的。Android中所有的activity都在主进程中,在Androidmanifest.xml中可以设置成启动不同进程,Service不是一个单独的进程也不是一个线程。
当你Kill掉当前程序的进程时也就是说整个程序的所有线程都会结束,Service也会停止,整个程序完全退出。,通过这种方式不能将应用程序完全杀死,并且他不会把当前应用应用的Activity的task任务栈清空)
4.killBackgroundProcesses()
manager.killBackgroundProcesses(getPackageName());
使用示例代码如下:
ActivityManager manager = (ActivityManager)getSystemService(ACTIVITY_SERVICE);
manager.killBackgroundProcesses(getPackageName());
//需要在xml中加入权限声明
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
在android2.2以后,如果服务在ondestroy里加上了start自己,用kill backgroudprocess通常无法结束自己。
5. 小结
finish():结束当前Activity,不会立即释放内存。遵循android内存管理机制。
exit():结束当前组件如Activity,并立即释放当前Activity所占资源。
killProcess():结束当前组件如Activity,并立即释放当前Activity所占资源。
restartPackage():结束整个App,包括service等其它Activity组件。