1. 程式人生 > >android activity的關閉處理的幾種方式

android activity的關閉處理的幾種方式

專案中我們往往要用到關閉程式時銷燬所有的activity,而且這也是面試經常遇到的問題,退出程式的方式也有好幾種,一下是一些處理關閉程式的方法:

1.最簡單的方式就是使用系統的方法exit(0),這是最簡單粗暴的方式,強制程式退出,但是這種方法針對部分機型有可能不太好使,退出時有可能出現程式崩潰的彈出框,或者程式會重新啟動,這對使用者體驗來說不是很好。

2.丟擲異常強制退出,這種方法的使用對使用者體驗來說簡直就是災難,所以就不要用這種方式了。

3.使用廣播的方式通知activity進行關閉,這種方式也有人在用,大家可以自行百度下,我主要介紹下面這種方式。

4.使用application,在application中建立activity集合,建立新增以及刪除activity的方法,並且在BaseActivity中的生命週期中呼叫這些方法,在使用的時候呼叫BaseApplication的方法,這也是目前最常用的方法,但是這種在BaseActivity中新增activity的方法也有一個問題,那就是當你要使用第三方的BaseActivity的時候,一個還好你可以繼承,那如果要使用兩個第三方的BaseActivity呢,Java本身是單繼承的,所以就會導致activity關閉不全了。那麼這個問題的解決就要依靠一介面:ActivityLifecycleCallbacks

;這是Application中宣告的一個介面,其內容如下:

@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.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()); }
大家可以看到這些方法名採用的都是英語中的過去式命名,其意大家看方法名也應該懂了,就是activity執行過得生命週期都會在這裡呼叫,想要這些方法執行要呼叫
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();
}
        }
    }
}
點選開啟連結