android activity的關(guān)閉處理的幾種方式

項(xiàng)目中我們往往要用到關(guān)閉程序時(shí)銷(xiāo)毀所有的activity,而且這也是面試經(jīng)常遇到的問(wèn)題,退出程序的方式也有好幾種,一下是一些處理關(guān)閉程序的方法:

1.最簡(jiǎn)單的方式就是使用系統(tǒng)的方法exit(0),這是最簡(jiǎn)單粗暴的方式,強(qiáng)制程序退出,但是這種方法針對(duì)部分機(jī)型有可能不太好使,退出時(shí)有可能出現(xiàn)程序崩潰的彈出框,或者程序會(huì)重新啟動(dòng),這對(duì)用戶(hù)體驗(yàn)來(lái)說(shuō)不是很好。

2.拋出異常強(qiáng)制退出,這種方法的使用對(duì)用戶(hù)體驗(yàn)來(lái)說(shuō)簡(jiǎn)直就是災(zāi)難,所以就不要用這種方式了。

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

4.使用application,在application中創(chuàng)建activity集合,創(chuàng)建添加以及刪除activity的方法,并且在BaseActivity中的生命周期中調(diào)用這些方法,在使用的時(shí)候調(diào)用BaseApplication的方法,這也是目前最常用的方法,但是這種在BaseActivity中添加activity的方法也有一個(gè)問(wèn)題,那就是當(dāng)你要使用第三方的BaseActivity的時(shí)候,一個(gè)還好你可以繼承,那如果要使用兩個(gè)第三方的BaseActivity呢,Java本身是單繼承的,所以就會(huì)導(dǎo)致activity關(guān)閉不全了。那么這個(gè)問(wèn)題的解決就要依靠一接口:ActivityLifecycleCallbacks;這是Application中聲明的一個(gè)接口,其內(nèi)容如下:

@Override

public voidonActivityCreated(Activity activity,Bundle bundle) {??

Log.e("onActivityCreated---","is running"+"--"+activity.getLocalClassName());

}

@Override

public voidonActivityStarted(Activity activity) {? ?

Log.e("onActivityStarted---","is running"+"--"+activity.getClass().getCanonicalName());}

@Override

public voidonActivityResumed(Activity activity) {? ? Log.e("onActivityResumed---","is running"+"--"+activity.getClass().getCanonicalName());}

@Override

public voidonActivityPaused(Activity activity) {? ? Log.e("onActivityPaused---","is running"+"--"+activity.getClass().getCanonicalName());}

@Override

public voidonActivityStopped(Activity activity) {? ? Log.e("onActivityStopped---","is running"+"--"+activity.getClass().getCanonicalName() );}

@Override

public voidonActivitySaveInstanceState(Activity activity,Bundle bundle) {? ? Log.e("onActivitySaveInstanceState---","is running"+"--"+activity.getPackageName());}

@Override

public voidonActivityDestroyed(Activity activity) {? ? Log.e("onActivityDestroyed---","is running"+"--"+activity.getPackageName());}

大家可以看到這些方法名采用的都是英語(yǔ)中的過(guò)去式命名,其意大家看方法名也應(yīng)該懂了,就是activity執(zhí)行過(guò)得生命周期都會(huì)在這里調(diào)用,想要這些方法執(zhí)行要調(diào)用

registerActivityLifecycleCallbacks(this);

這個(gè)方法,記得一定要調(diào)用啊,還有請(qǐng)記住這些回調(diào)是針對(duì)所有的Activity哦,所以我們就可以使用這樣的方式去對(duì)activity進(jìn)行關(guān)閉或者其他操作了。下面有一種存放activity的方式,喜歡的可以使用:

private staticWeakReferencecurAct;

private staticWeakHashMapacList=newWeakHashMap<>();

/***設(shè)置當(dāng)前activity**

@paramact*/

public static voidsetCurActivity(Activity act) {curAct=newWeakReference<>(act);acList.put(act, null);}

/***獲取想要的activity*@return*/

public staticActivitygetCurActivity() {if(acList==null||acList.isEmpty())return null;WeakReference wr =curAct;if(wr !=null) {returnwr.get();}return null;}

/***清理activity*@paramact*/

public static voidclearCurActivity(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.}}/***銷(xiāo)毀所有的activity*/public static voiddestroyAllActivity() {if(null!=acList&& !acList.isEmpty()) {? ? ? ? Object[] keys =acList.keySet().toArray();for(Object obj : keys) {? ? ? ? ? ? Activity act = (Activity)obj;if(act !=null) {? ? ? ? ? ? ? ? act.finish();}? ? ? ? }? ? }}

/***關(guān)閉某個(gè)activity*@paramactivity*/

public static voidcloseActivity(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();}? ? ? ? }? ? }}

下面是CSDN地址:原文鏈接?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容