? ? 寫這篇文章的目的主要是用來記錄一下這塊的知識,同時也能夠幫助對這塊不太熟悉的朋友。? ? ? 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會導致一些未知的錯誤,在當前手機配置都不錯的情況盡量不要用。