? ? 寫這篇文章的目的主要是用來記錄一下這塊的知識从隆,同時也能夠幫助對這塊不太熟悉的朋友。? ? ? app賬號的注銷以及完全退出銷毀整個app可以說是開發(fā)app必備的功能岁疼,雖然知識不是很深但是對一些接觸android開發(fā)不久的朋友俐载,可能實現(xiàn)起來也是有點小麻煩。那先說一下網(wǎng)上對賬號注銷功能的實現(xiàn)缎岗,很多都是setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))清除堆棧中除了當(dāng)前activity上面的所有實例。
? ?LoginActivity其實在跳轉(zhuǎn)到A_Activity之后就finish掉了白粉,這里畫出來是為了讓整個流程更容易理解一些传泊。那我們是要從C Activity注銷賬號跳轉(zhuǎn)到LoginActivity,在這種情況下堆棧中的activity的順序就會有一些變化鸭巴,如下圖:
這里說一下為什么調(diào)用startActivity(C_Activity.this,LoginActivity.class)眷细,會出現(xiàn)LoginActivity排在棧頂,這是因為在舊Activity中啟動新的Activity和它們的生命周期方法調(diào)用有關(guān)系鹃祖,可以在相應(yīng)的方法中打印log驗證一下溪椎,這里我就不貼圖驗證了直接說結(jié)論,如果有需要請讀者自行驗證。會調(diào)用C_Activity中onPause()方法(調(diào)用這個方法后activity就不能進(jìn)行交互了),然后調(diào)用LoginActivity中onCreate()(activity被創(chuàng)建)----->onStart()(activity可見)----->onResume()(activity可交互,因此LoginActivity就會出現(xiàn)棧頂了),然后在調(diào)用C_Activity的onStop方法使之不可見校读。設(shè)置了setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))只能清除C_Activity之上的activity沼侣,在這里這種情況調(diào)用了C調(diào)用了finish也就能把C干掉,并不能清除A和B歉秫。因此蛾洛,這種方法不適用。
還有另外方式通過FLAG_ACTIVITY_CLEAR_TASK這個標(biāo)志端考,可以清除整個棧中activity雅潭,上面這種簡單的情況是可以通過這種方式來清除。注意使用的使用還要設(shè)置FLAG_ACTIVITY_NEW_TASK却特,因為FLAG_ACTIVITY_CLEAR_TASK是銷毀了整個棧如果不加上NEW_TASK,就無法將LoginActivity加入到棧中扶供,也就無法顯示。這種方式還是有一定的局限性的就是整個App的activity都在同一個棧中裂明,如果不在同一個棧還有其他的棧處理起來就比較麻煩了椿浓。
一個比較完美的解決方案:創(chuàng)建一個MyActivityManager活動類管理器,代碼如下所示:
public class MyActivityManager{
? ? public static List<Activitys> mActivites = new Arralist<>();
? ? public static void addActivity(Activity act){ //將activity的實例放入list中進(jìn)行維護(hù)
? ? ? ? ? ? mActivites.add(act);
? ? }
? ?public static void removeActivity(Activity act){
? ? ? ? mActivies.remove(act);//將已經(jīng)銷毀的activity在list中清除闽晦,與實際的activity活動個數(shù)保持.一致
? ?}
}
public static void finishAll(){
? ? ?for(Activity act:mActivies){
? ? ? ? ? ?if(!act.isFinishing){//這里判斷act是否正在銷毀扳碍,如果沒有就調(diào)用finish進(jìn)行銷毀
? ? ? ? ? ? ? ? ?act.finish();
? ? ? ? ? ? }
? ? ?}
}
使用:
最好是寫一個基類BaseActivity所有的activity都繼承這個activity,在onCreate()方法中調(diào)用:
MyActivityManager.addActivity(this);
在onDestroy()方法中調(diào)用:
MyActivityManager.remove(this);
在子類中注銷賬號或者完全退出app調(diào)用下面的代碼即可:
MyActivityManager.finishAll();
android.os.Process.killProcess(android.os.Process.myPid);//殺死當(dāng)前的進(jìn)程仙蛉,但是不能殺掉其它的進(jìn)程笋敞。
注:killProcess是殺死所有id進(jìn)程,謹(jǐn)慎使用應(yīng)為有一些app需要接收推送通知消息荠瘪,如果殺掉相應(yīng)的service會導(dǎo)致一些未知的錯誤夯巷,在當(dāng)前手機(jī)配置都不錯的情況盡量不要用。