android activity的關閉處理的幾種方式
阿新 • • 發佈:2019-01-29
專案中我們往往要用到關閉程式時銷燬所有的activity,而且這也是面試經常遇到的問題,退出程式的方式也有好幾種,一下是一些處理關閉程式的方法:
1.最簡單的方式就是使用系統的方法exit(0),這是最簡單粗暴的方式,強制程式退出,但是這種方法針對部分機型有可能不太好使,退出時有可能出現程式崩潰的彈出框,或者程式會重新啟動,這對使用者體驗來說不是很好。
2.丟擲異常強制退出,這種方法的使用對使用者體驗來說簡直就是災難,所以就不要用這種方式了。
3.使用廣播的方式通知activity進行關閉,這種方式也有人在用,大家可以自行百度下,我主要介紹下面這種方式。
4.使用application,在application中建立activity集合,建立新增以及刪除activity的方法,並且在BaseActivity中的生命週期中呼叫這些方法,在使用的時候呼叫BaseApplication的方法,這也是目前最常用的方法,但是這種在BaseActivity中新增activity的方法也有一個問題,那就是當你要使用第三方的BaseActivity的時候,一個還好你可以繼承,那如果要使用兩個第三方的BaseActivity呢,Java本身是單繼承的,所以就會導致activity關閉不全了。那麼這個問題的解決就要依靠一介面:ActivityLifecycleCallbacks
@Override public void onActivityCreated(Activity activity, Bundle bundle) { Log.e("onActivityCreated---","is running" + "--"+activity.getLocalClassName()); } @Override public void onActivityStarted(Activity activity) { Log.e("onActivityStarted---","is running"大家可以看到這些方法名採用的都是英語中的過去式命名,其意大家看方法名也應該懂了,就是activity執行過得生命週期都會在這裡呼叫,想要這些方法執行要呼叫+ "--"+activity.getClass().getCanonicalName()); } @Override public void onActivityResumed(Activity activity) { Log.e("onActivityResumed---","is running"+ "--"+activity.getClass().getCanonicalName()); } @Override public void onActivityPaused(Activity activity) { Log.e("onActivityPaused---","is running"+ "--"+activity.getClass().getCanonicalName()); } @Override public void onActivityStopped(Activity activity) { Log.e("onActivityStopped---","is running"+ "--"+activity.getClass().getCanonicalName() ); } @Override public void onActivitySaveInstanceState(Activity activity, Bundle bundle) { Log.e("onActivitySaveInstanceState---","is running"+ "--"+activity.getPackageName()); } @Override public void onActivityDestroyed(Activity activity) { Log.e("onActivityDestroyed---","is running"+ "--"+activity.getPackageName()); }
registerActivityLifecycleCallbacks(this);這個方法,記得一定要呼叫啊,還有請記住這些回撥是針對所有的Activity哦,所以我們就可以使用這樣的方式去對activity進行關閉或者其他操作了。下面有一種存放activity的方式,喜歡的可以使用:
private static WeakReference<Activity> curAct; private static WeakHashMap<Activity, Object> acList = new WeakHashMap<>(); /** * 設定當前activity * * @param act */ public static void setCurActivity(Activity act) { curAct = new WeakReference<>(act); acList.put(act, null); } /** * 獲取想要的activity * @return */ public static Activity getCurActivity() { if (acList == null || acList.isEmpty()) return null; WeakReference<Activity> wr = curAct; if (wr != null) { return wr.get(); } return null; } /** *清理activity * @param act */ public static void clearCurActivity(Activity act) { Object remove = acList.remove(act); if (remove != null && TextUtils .equals(remove.getClass().getSimpleName(), curAct.get().getClass().getSimpleName())) { //TODO You want to do something. } } /** * 銷燬所有的activity */ public static void destroyAllActivity() { if (null != acList && !acList.isEmpty()) { Object[] keys = acList.keySet().toArray(); for (Object obj : keys) { Activity act = (Activity)obj; if (act != null) { act.finish(); } } } } /** * 關閉某個activity * @param activity */ public static void closeActivity(String activity) { if (null != acList && !acList.isEmpty()) { Object[] keys = acList.keySet().toArray(); for (Object obj : keys) { if (obj != null && activity != null && TextUtils.equals(obj.getClass().getSimpleName(),activity)) { Activity act = (Activity)obj; act.finish(); } } } }點選開啟連結