退出图
在Android开发中,我们运行了应用程序后,都需要退出应用的,那么该如何退出应用,又都有哪些实现方式呢?今天就为大家整理分享一些退出应用程序的方法,一起来看看吧!
更新内容
Ver:v1
任务管理器方法补充
新增监听式退出方法
Ver:v2
任务管理器方法修正
新增销毁任务栈退出方法
1. finish方法
finish();
该方法只是结束当前Activity,系统将最上面的Activity移出了栈,并没有清理占用的资源。如果栈内有很多Activity 的话,使用该方法显得有点捉襟见肘了,没办法一次移出全部Activity,并且没有立即释放内存,活动的资源也没有被清理。
2. 进程式
KillProcess():
可以杀死当前应用活动的进程,这一操作将会把所有该进程内的资源(包括线程全部清理掉)。当然,由于ActivityManager时刻监听着进程,一旦发现进程被非正常Kill,它将会试图去重启这个进程。
android.os.Process.killProcess(android.os.Process.myPid());
System.exit():
Java中结束进程的方法,调用它将关闭当前的JVM虚拟机。
System.exit(0);//正常退出
System.exit(1);//非正常退出
KillProcess() 和 System.exit(),许多人都使用过,当你栈里只有一个Activity的时候,这个措施是行之有效的。但当关闭多个Activity的时候,栈里有多个Activity时,这两个方法就不起作用了。
因为通过杀进程方式退出,会被系统认为异常退出,会保存应用的一些状态信息比如Activity运行栈,然后会恢复这个应用。当恢复一个Android应用程序时,会先从栈里面移除异常的Activity,相当于Back键操作。
3. 根据Activity的生命周期
Android的窗口类提供了历史栈,可以通过stack的原理来巧妙的实现。在A窗口打开B窗口的时候,在Intent中直接加入标识Intent.FLAG_ACTIVITY_CLEAR_TOP,这样开启B时,会清除该进程空间的所有Activity。
1)在A窗口中调用该方法跳转到B窗口:
Intent intent = new Intent();
intent.setClass(AActivity.this,BActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
2)在B窗口退出时直接使用 finish 方法即可全部退出
finish();
4. 任务管理器
系统将终止一切和这个程序包关联的,所有共享同一 uid 的 process全部杀掉,还会停止相关的服务,并且会发送一个广播。
ActivityManager am = (ActivityManager)getSystemService (Context.ACTIVITY_SERVICE);
am.restartPackage(getPackageName());
但是在 Android 2.2(API 8)之后,restartPackage方法已经过时,不可以将应用程序结束,需要使用ActivityManager类的killBackgroundProcesses方法。
ActivityManager am = (ActivityManager)getSystemService (Context.ACTIVITY_SERVICE);
am.killBackgroundProcesses(getPackageName());
System.exit(0);
注意事项:该方法虽然可以立即杀死与指定包相关联的所有后台进程,但是这些进程如果在将来某一时刻需要使用,便会重新启动。而且该方法只是结束后台进程的方法,不能结束当前应用移除所有的 Activity。如果需要退出应用,需要添加System.exit(0)方法一起使用,并且只限栈内只有一个Activity,如果有多个Activity时,正如上面 方法 2 所说,就不起作用了。
5. 任务栈式
利用一个单例模式的Activity栈来管理所有Activity
1)自定义 Application类,储存每一个Activity,并实现关闭所有Activity的操作
public class MyApplication extends Application {
private List activityList = new LinkedList();
private static MyApplication instance;
/**
*单例模式 1:
*/
private MyApplication() {
}
public static MyApplication getInstance() {
if(null == instance) {
instance = new MyApplication();
}
return instance;
}
@Override
public void onCreate() {
super.onCreate();
}
/**
*单例模式 2:
*/
// public static MyApplication getInstance() {
// return instance;
// }
// @Override
// public void onCreate() {
// super.onCreate();
// instance = this;
//