日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Android Jetpack架構(gòu)組件Lifecycle詳解

瀏覽:211日期:2022-09-23 13:24:45

前言

Lifecycle是Jetpack架構(gòu)組件中用來(lái)感知生命周期的組件,使用Lifecycles可以幫助我們寫(xiě)出和生命周期相關(guān)更簡(jiǎn)潔更易維護(hù)的代碼。

生命周期

生命周期這個(gè)簡(jiǎn)單而又重要的知識(shí)相信大家早已耳熟能詳。假設(shè)我們現(xiàn)在有這樣一個(gè)簡(jiǎn)單需求:

這個(gè)需求只是一個(gè)實(shí)例,在真實(shí)的開(kāi)發(fā)中當(dāng)然不可能有這樣的需要:

在Activity 可見(jiàn)的時(shí)候,我們?nèi)プ鲆粋€(gè)計(jì)數(shù)功能,每隔一秒 將計(jì)數(shù)加1 ,當(dāng)Activity不可見(jiàn)的時(shí)候停止計(jì)數(shù),當(dāng)Activity被銷(xiāo)毀的時(shí)候 將計(jì)數(shù)置為0

OK,So easy~ ,新建Main3Activity 編寫(xiě)代碼如下所示:

public class Main3Activity extends AppCompatActivity { private static final String TAG = 'Main3Activity'; int count = 0; /** * 是否計(jì)數(shù) */ private boolean whetherToCount = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main3); } @Override protected void onResume() { super.onResume(); whetherToCount = true; new Thread(new Runnable() { @Override public void run() { while (whetherToCount) { try { Thread.sleep(1000); count++; Log.d(TAG, 'onResume: ' + count); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } @Override protected void onStop() { super.onStop(); Log.d(TAG, 'onStop: ----'); whetherToCount = false; } @Override protected void onDestroy() { super.onDestroy(); whetherToCount = false; count = 0; }}

運(yùn)行結(jié)果如下所示:

Android Jetpack架構(gòu)組件Lifecycle詳解

符合我們的預(yù)期,你可能鄙視的看了我一眼,這樣多臃腫啊,我可是學(xué)過(guò)面向?qū)ο蟮娜耍阅惆压ぷ鞣旁诹艘粋€(gè)名為WorkUtil的類(lèi)中

public class WorkUtil { private static final String TAG = 'WorkUtil'; private boolean whetherToCount = true; private int count = 0; public void start() { new Thread(new Runnable() { @Override public void run() { while (whetherToCount) { try { Thread.sleep(1000); count++; Log.d(TAG, 'start: ' + count); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } public void onStop() { whetherToCount = false; } public void onDestory() { count = 0; }}

然后再activity中的生命周期中分別執(zhí)行對(duì)應(yīng)的方法,感覺(jué)美滋滋~

然而 ,這樣還是不夠解耦,如果方法過(guò)多的話(huà) ,會(huì)讓view中的代碼越來(lái)越臃腫,那么 還有更好的方案嗎?這就是今天所說(shuō)的Lifecycle。我們待會(huì)回過(guò)頭來(lái)再優(yōu)化上面的代碼。

使用Lifecycle管理生命周期

我們通過(guò)改寫(xiě)WorkUtil類(lèi)來(lái)講解如何使用Lifecycle,讓W(xué)orkUtil類(lèi)實(shí)現(xiàn)LifecycleObserver

我們通過(guò)OnLifecycleEvent注解來(lái)注明方法所執(zhí)行的生命周期,如下所示:

public class WorkUtil implements LifecycleObserver { private static final String TAG = 'WorkUtil'; private boolean whetherToCount = true; private int count = 0; @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) public void start() { new Thread(new Runnable() { @Override public void run() { while (whetherToCount) { try { Thread.sleep(1000); count++; Log.d(TAG, 'start: ' + count); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } @OnLifecycleEvent(Lifecycle.Event.ON_STOP) public void onStop() { whetherToCount = false; } @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) public void onDestory() { count = 0; }}

在Activity中注冊(cè)即可:

getLifecycle().addObserver(new WorkUtil());

這樣是不是簡(jiǎn)潔多了呢,那么我們?yōu)槭裁纯梢栽贏ctivity中直接使用getLifecycle().addObserver(new WorkUtil());呢,其實(shí)使用的是LifecycleOwner.getLifecycle, LifecycleOwner是單一方法接口,表示類(lèi)具有 Lifecycle,而如果activity繼承自AppcompatActivity或Fragment繼承自androidx.fragment.app.Fragment他們本身就是一個(gè)LifecycleOwner的實(shí)例,這是AndroidX庫(kù)幫我們自動(dòng)完成的。

自定義LifecycleOwner

如果我們的Activity由于各種原因繼承的不是AppcompatActivity而是Activity呢

Android Jetpack架構(gòu)組件Lifecycle詳解

我們可以看到這個(gè)時(shí)候,就不能直接使用getLifecycle,而要自定義一個(gè)LifecycleOwner了,我們讓Activity繼承自L(fǎng)ifecycleOwner,

使用LifecycleRegistry定義如下:

@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main3); lifecycleRegistry = new LifecycleRegistry(this); getLifecycle().addObserver(new WorkUtil()); }

@NonNull@Overridepublic Lifecycle getLifecycle() { return lifecycleRegistry;}

這樣我們就實(shí)現(xiàn)了自定義LifecycleOwner了,不過(guò)大多數(shù)時(shí)候我們還是不需要自定義的。

優(yōu)雅的檢測(cè)應(yīng)用程序前后臺(tái)狀態(tài)

很多業(yè)務(wù)中我們都需要監(jiān)聽(tīng)?wèi)?yīng)用前后臺(tái)的狀態(tài) ,比如在前臺(tái)的時(shí)候開(kāi)始緩存任務(wù),在后臺(tái)的時(shí)候停止緩存任務(wù),其實(shí)方法有很多,比如

使用我們上面所說(shuō)的方法,監(jiān)聽(tīng)BaseActivity,但是都不夠優(yōu)雅,如果我們想監(jiān)聽(tīng)所有Activty的生命周期就要使用ActivityLifecycleCallbacks,我們新建ForegroundCallbacks類(lèi)實(shí)現(xiàn)ActivityLifecycleCallbacks

public class ForegroundCallbacks implements Application.ActivityLifecycleCallbacks { private static final String TAG = 'ForegroundCallbacks'; @Override public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) { Log.d(TAG, 'onActivityCreated: ' + activity.getComponentName()); } @Override public void onActivityStarted(@NonNull Activity activity) { Log.d(TAG, 'onActivityStarted: '+ activity.getComponentName()); } @Override public void onActivityResumed(@NonNull Activity activity) { Log.d(TAG, 'onActivityResumed: '+ activity.getComponentName()); } @Override public void onActivityPaused(@NonNull Activity activity) { Log.d(TAG, 'onActivityPaused: '+ activity.getComponentName()); } @Override public void onActivityStopped(@NonNull Activity activity) { Log.d(TAG, 'onActivityStopped: '+ activity.getComponentName()); } @Override public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) { Log.d(TAG, 'onActivitySaveInstanceState: '+ activity.getComponentName()); } @Override public void onActivityDestroyed(@NonNull Activity activity) { Log.d(TAG, 'onActivityDestroyed: '+ activity.getComponentName()); }}

添加一個(gè)初始化的方法:

/** * 初始化foregroundCallbacks * * @param appApplication application */public static ForegroundCallbacks init(AppApplication appApplication) { instance = new ForegroundCallbacks(); appApplication.registerActivityLifecycleCallbacks(instance); return instance;}

在Application中進(jìn)行注冊(cè):

ForegroundCallbacks.init(this);

運(yùn)行項(xiàng)目日志如下: Android Jetpack架構(gòu)組件Lifecycle詳解

現(xiàn)在我們知道肯定要在onActivityResumed和onActivityPaused兩個(gè)方法中進(jìn)行判斷,但是肯定不是說(shuō)進(jìn)入到了resumed就是在前臺(tái),進(jìn)入到了paused就是后臺(tái),因?yàn)槲覀兊膽?yīng)用會(huì)有多個(gè)activity,只有第一個(gè)activity在前臺(tái)的時(shí)候我們才提示在前臺(tái),只有所有activity都不可見(jiàn)的時(shí)候才提示在后臺(tái),按照這種思路我們編寫(xiě)對(duì)應(yīng)的處理

首先定義個(gè)接口 里面回調(diào)在前臺(tái)或在后臺(tái)的方法

public interface Listener { /** * 在前臺(tái) */ public void onBecameForeground(); /** * 在后臺(tái) */ public void onBecameBackground();}

定義標(biāo)記位

private Runnable runnable; /** * 是否執(zhí)行過(guò)onResumed */private boolean onResumed = false; /** * 是否執(zhí)行過(guò)onPaused */private boolean onPaused = true;

@Overridepublic void onActivityResumed(@NonNull Activity activity) { Log.d(TAG, 'onActivityResumed: ' + activity.getComponentName()); onPaused = false; if (runnable != null){ handler.removeCallbacks(runnable); } handler.postDelayed(runnable = new Runnable() { @Override public void run() { if (!onResumed) { listener.onBecameForeground(); onResumed = true; } } },600); } @Overridepublic void onActivityPaused(@NonNull Activity activity) { Log.d(TAG, 'onActivityPaused: ' + activity.getComponentName()); onPaused = true; if (runnable != null){ handler.removeCallbacks(runnable); } handler.postDelayed(runnable = new Runnable() { @Override public void run() { if (onResumed && onPaused) { onResumed = false; listener.onBecameBackground(); } } }, 600); }

在這里我們進(jìn)行延遲0.6s的原因是為了避免啟動(dòng)新的activity 舊的activity頁(yè)面不可見(jiàn)時(shí)誤以為在后臺(tái),不過(guò)在真實(shí)的業(yè)務(wù)場(chǎng)景中還是需要按照細(xì)節(jié)進(jìn)行優(yōu)化,在applicaton添加事件回調(diào)

ForegroundCallbacks.init(this).addListener(new ForegroundCallbacks.Listener() { @Override public void onBecameForeground() { Log.d(TAG, 'onBecameForeground: 在前臺(tái)'); } @Override public void onBecameBackground() { Log.d(TAG, 'onBecameBackground: 在后臺(tái)'); }});

運(yùn)行程序切換到后臺(tái) 再切換回來(lái) 結(jié)果如下所示: Android Jetpack架構(gòu)組件Lifecycle詳解

如此 我們就可以?xún)?yōu)雅的監(jiān)聽(tīng)?wèi)?yīng)用前后臺(tái)切換了。

是否感受到Lifecycle的強(qiáng)大了呢?

到此這篇關(guān)于Android Jetpack架構(gòu)組件Lifecycle詳解的文章就介紹到這了,更多相關(guān)Android Jetpack架構(gòu)組件Lifecycle內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲精品在线二区| 中文精品电影| 免播放器亚洲一区| 99视频+国产日韩欧美| av在线日韩| 久久免费福利| 91久久精品无嫩草影院| 国产美女撒尿一区二区| 亚洲毛片在线| 亚洲另类av| 日韩1区2区日韩1区2区| 热久久久久久久| 蜜臀av亚洲一区中文字幕| 免费精品视频| 蜜臀va亚洲va欧美va天堂| 国产精品美女| 最新亚洲激情| 亚洲高清影视| 午夜日韩在线| 欧美日韩国产免费观看视频| 国产一区国产二区国产三区| 久久精品国产精品亚洲毛片| 久久精品免视看国产成人| 欧美aaaaaa午夜精品| 久久99久久人婷婷精品综合| 免费看一区二区三区| 精品不卡一区| 999国产精品永久免费视频app| 99成人超碰| 亚洲乱码视频| 日韩精品福利一区二区三区| 最新国产精品久久久| 日韩一区二区三区免费视频| 欧美一级网站| 国产精品久久777777毛茸茸| 中文不卡在线| 日本麻豆一区二区三区视频| 国产女人18毛片水真多18精品| 美女久久久久久| 亚洲美女久久精品| 99久久夜色精品国产亚洲1000部| 九一精品国产| 中文亚洲欧美| 蜜桃视频免费观看一区| 视频一区日韩| 国产精品对白久久久久粗| 成人日韩av| 国产一区国产二区国产三区 | 久久久久久夜| 999精品色在线播放| 久久亚洲不卡| 日韩国产欧美| 国产毛片精品| 爽爽淫人综合网网站| 精品亚洲a∨一区二区三区18| 亚洲欧洲一区二区天堂久久| 精品中国亚洲| 久久人人97超碰国产公开结果| 国产成人调教视频在线观看| 免费不卡中文字幕在线| 日韩精品一二三区| 日韩av自拍| 在线亚洲成人| 亚洲精品国模| 国产精品久久久久久久免费观看 | 91福利精品在线观看| 久久精品国产久精国产爱| 精品成人18| 91成人精品| 国产精品一站二站| 久久天堂成人| 蜜臀av在线播放一区二区三区| 国产精品一区二区三区av麻| av综合电影网站| 久久性天堂网| 久久精品免视看国产成人| 亚洲经典在线| 日韩精品免费视频人成 | 蜜桃久久av一区| 久久av资源| 亚洲一区二区三区高清| 国产精品jk白丝蜜臀av小说| 91精品啪在线观看国产18| 亚洲一区网站| 日韩欧美美女在线观看| 国产欧美高清| 999国产精品永久免费视频app| 日韩欧乱色一区二区三区在线| 激情视频网站在线播放色| 亚洲精品在线a| 久久电影tv| 日韩av在线免费观看不卡| 欧洲av不卡| 国产福利亚洲| 视频在线在亚洲| 日本在线高清| 久久狠狠久久| 国产一级久久| 一区二区三区四区日本视频| 亚洲精品一级二级三级| 成人在线免费观看91| 亚洲毛片视频| 久久久精品五月天| 国产精品大片| 免费不卡在线视频| 人人精品亚洲| 国产无遮挡裸体免费久久| 黄色免费成人| 卡一卡二国产精品| 在线看片一区| 国产真实久久| 黄色aa久久| 国产欧美精品久久| 水野朝阳av一区二区三区| 国内精品伊人| 亚洲一区av| 伊人成人在线视频| 亚洲va中文在线播放免费| 国产精品久久777777毛茸茸| 亚洲精品乱码日韩| 99在线|亚洲一区二区| 国产资源在线观看入口av| 国产美女久久| 日本一区福利在线| 久久亚洲国产精品一区二区| 国产91在线播放精品| 羞羞答答国产精品www一本| 国产自产自拍视频在线观看| 国产精品成人自拍| 亚洲ww精品| 欧美一区二区性| 欧美精选视频一区二区| 国产中文欧美日韩在线| 国产精品xxx在线观看| 综合亚洲色图| 亚洲最新av| 亚洲香蕉视频| 中文不卡在线| 亚洲涩涩av| 日韩中文字幕1| 日韩一级欧洲| 日韩一级欧洲| 噜噜噜久久亚洲精品国产品小说| 欧美日韩高清| 黄色日韩精品| 日本不良网站在线观看| 美女精品视频在线| **爰片久久毛片| 欧美日一区二区在线观看| 日韩高清不卡在线| 欧美亚洲三级| 国产日韩高清一区二区三区在线| 日韩精品电影一区亚洲| 日韩欧美精品一区二区综合视频| 三级欧美在线一区| 三级欧美在线一区| 亚洲毛片网站| 亚洲精品在线a| 午夜亚洲福利| 欧美日韩亚洲一区三区| 日韩在线观看中文字幕| 久久亚洲影院| 天堂av在线一区| 蜜臀av一区二区在线免费观看| 性色av一区二区怡红| 日韩欧美三区| 国产盗摄——sm在线视频| 欧美日韩国产传媒| 日韩福利视频网| 在线天堂中文资源最新版| 日韩视频在线一区二区三区| 日韩精品乱码av一区二区| 久久久久久色 | 国产精品自在| 成人日韩在线| 久久成人亚洲| 国产精品久久免费视频| 性感美女一区二区在线观看| 日av在线不卡| 精品视频在线观看网站| 激情五月综合网| 国产欧美日韩免费观看| 999国产精品999久久久久久| 亚洲综合国产| 国产精品66| 欧美日韩国产免费观看| 国产调教精品| 91成人网在线观看| 国产欧美日韩| 91久久国产| 久久免费影院| 鲁大师影院一区二区三区| 国产精品亚洲欧美日韩一区在线| 久久久久一区| 国产情侣一区| 欧美午夜不卡| 精品一区二区三区免费看| 亚洲综合不卡| 精品国产精品久久一区免费式| 亚洲欧美日韩国产|