写这篇文章的目的主要是用来记录一下这块的知识,同时也能够帮助对这块不太熟悉的朋友。 app账号的注销以及完全退出销毁整个app可以说是开发app必备的功能,虽然知识不是很深但是对一些接触android开发不久的朋友,可能实现起来也是有点小麻烦。那先说一下网上对账号注销功能的实现,很多都是setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))清除堆栈中除了当前activity上面的所有实例。
LoginActivity其实在跳转到A_Activity之后就finish掉了,这里画出来是为了让整个流程更容易理解一些。那我们是要从C Activity注销账号跳转到LoginActivity,在这种情况下堆栈中的activity的顺序就会有一些变化,如下图:
这里说一下为什么调用startActivity(C_Activity.this,LoginActivity.class),会出现LoginActivity排在栈顶,这是因为在旧Activity中启动新的Activity和它们的生命周期方法调用有关系,可以在相应的方法中打印log验证一下,这里我就不贴图验证了直接说结论,如果有需要请读者自行验证。会调用C_Activity中onPause()方法(调用这个方法后activity就不能进行交互了),然后调用LoginActivity中onCreate()(activity被创建)----->onStart()(activity可见)----->onResume()(activity可交互,因此LoginActivity就会出现栈顶了),然后在调用C_Activity的onStop方法使之不可见。设置了setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))只能清除C_Activity之上的activity,在这里这种情况调用了C调用了finish也就能把C干掉,并不能清除A和B。因此,这种方法不适用。
还有另外方式通过FLAG_ACTIVITY_CLEAR_TASK这个标志,可以清除整个栈中activity,上面这种简单的情况是可以通过这种方式来清除。注意使用的使用还要设置FLAG_ACTIVITY_NEW_TASK,因为FLAG_ACTIVITY_CLEAR_TASK是销毁了整个栈如果不加上NEW_TASK,就无法将LoginActivity加入到栈中,也就无法显示。这种方式还是有一定的局限性的就是整个App的activity都在同一个栈中,如果不在同一个栈还有其他的栈处理起来就比较麻烦了。
一个比较完美的解决方案:创建一个MyActivityManager活动类管理器,代码如下所示:
public class MyActivityManager{
public static List<Activitys> mActivites = new Arralist<>();
public static void addActivity(Activity act){ //将activity的实例放入list中进行维护
mActivites.add(act);
}
public static void removeActivity(Activity act){
mActivies.remove(act);//将已经销毁的activity在list中清除,与实际的activity活动个数保持.一致
}
}
public static void finishAll(){
for(Activity act:mActivies){
if(!act.isFinishing){//这里判断act是否正在销毁,如果没有就调用finish进行销毁
act.finish();
}
}
}
使用:
最好是写一个基类BaseActivity所有的activity都继承这个activity,在onCreate()方法中调用:
MyActivityManager.addActivity(this);
在onDestroy()方法中调用:
MyActivityManager.remove(this);
在子类中注销账号或者完全退出app调用下面的代码即可:
MyActivityManager.finishAll();
android.os.Process.killProcess(android.os.Process.myPid);//杀死当前的进程,但是不能杀掉其它的进程。
注:killProcess是杀死所有id进程,谨慎使用应为有一些app需要接收推送通知消息,如果杀掉相应的service会导致一些未知的错误,在当前手机配置都不错的情况尽量不要用。