Android之安全退出应用程序的几种方式

当我们做项目的时候,当用户在几秒的时间之内按回车键的时候,需要退出程序,但是退出我们要确保安全退出,防止还有程序还在后台运行,下面介绍几种安全的退出程的几种方式(综合了其它博客的然后加上自己使用的看到的总结)

number1:

首先获取当前进程的id,然后杀死该进程。  建议使用这种方式                 
android.os.Process.killProcess(android.os.Process.myPid())

number2:

终止当前正在运行的Java虚拟机,导致程序终止
System.exit(0);
或者
Runtime.getRuntime().exit(0);

number3:

强制关闭与该包有关联的一切执行
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);   
manager.restartPackage(getPackageName());
使用这种方式关闭应用程序需要加上权限
<uses-permission android:name="android.permission.RESTART_PACKAGES" />

这种方法会终止一切和这个程序包关联的,所有共享同一uid的process被kill,所有的activity会被removed,所有创建的服务会停止,还会发一个广播Intent.ACTION_PACKAGE_RESTARTED导致所有注册alarms被stopped,notifications被removed。


android2.2之后
ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
manager.killBackgroundProcesses("com.xawx.gd");   // API Level至少为8才能使用
所以要用此方法最好加个判断,如果是2.2之前的ROM就用restartPackage,之后的就用killBackgroundProcesses。
<!-- 添加权限 -->
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />


number4:

抛出异常
原理:在程序遇到非检查异常时,程序退被强制退出,那么虚拟器也将会被关闭,
所以利用一个非检查异常,退出程序,但会遇到一个问题,就是强制退出的对话框的出现,是不是很恶心?
 其实没有关系,可以不让系统弹出对话框,看代码
public void exit(){
    	
    	Thread.currentThread().setUncaughtExceptionHandler(new java.lang.Thread.UncaughtExceptionHandler() {
			
			@Override
			public void uncaughtException(Thread thread, Throwable ex) {
				//遇到不可抓取的异常会到这里来,就不会弹出对话框了,完美结局
				//在这里最好让所有的activity全finish了,也另加入关闭进程的方法
			}
		});
    	String meIsNull = null;
    	//在这里肯定是空指针异常,遇到异常之后,执行上面的回调代码,就不会弹出对话框了
    	meIsNull.equals("空指针");
    }

number5:

用一个集合自己管理activity
当一个activity创建的时候,把实例传递到那个管理activity的集合里,这个集合一般放在一个可全局访问的一个类内,
最好那个类继承Application,然后在menifest的<application>标签的属性name上加上自己写的application类,这个类是单例的。
退出的时候,遍历集合让所有的activity finish掉,最后调用关闭进程的那个方法

number6:

使用遍历的方式
这种方式比较繁琐复杂,使用递归的方式,没当打开一个activity的时候都用startActivityForResult(),在onActivityResult()里接收结果关闭当前的activity,不推荐使用,太繁琐麻烦。

number7:

使用intent的flag实现
原理:在android程序中,当打开一个activity的时候可以传进去这样一个flag:  Activity.FLAG_ACTIVITY_CLEAR_TOP,
当打开那个新的activity的时候,任务栈里的所有activity将会被清空,最后只剩下那个新的activity,然后在新的activity
里使用finish()把自己销毁了就可以了。

number8:

用eventbus触发所有继承基类 activity里面的方法然后用finish杀死当前的activity,例子如下
public class CsuicideActivity extends Activity {  
        @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        // 将对象注册到事件总线中, ****** 注意要在onDestory中进行注销 ****  
        EventBus.getDefault().register(this);  
    }  
    @Override  
    protected void onDestroy() {  
        super.onDestroy();       
        // ****** 不要忘了进行注销 ****  
        EventBus.getDefault().unregister(this);  
    }  
    @Subcriber(tag = "csuicide")  
    private void csuicideMyself(String msg) {  
        finish();  
    }  
}  
我们定义一个CsuicideActivity在onCreate中注册该Activity对象,在onDestroy中注销,还添加了一个csuicideMyself的订阅函数。所有的Activity类可以继承自CsuicideActivity。当需要退出应用时,直接发布一个类型为String、tag为csuicide的事件即可。这样所有的Activity就会触发csuicideMyself,而该函数中又调用了finish方法,因此所有的Activity都将退出,通过这种方式就完成了应用退出。

KO

如果小伙伴们还有什么好的方法可以补充进来,大家一起交流与学习。












你可能感兴趣的:(android,安全退出应用程序)