亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

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

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

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

前言

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

生命周期

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

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

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

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

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é)過面向?qū)ο蟮娜耍阅惆压ぷ鞣旁诹艘粋€(gè)名為WorkUtil的類中

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)的方法,感覺美滋滋~

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

使用Lifecycle管理生命周期

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

我們通過OnLifecycleEvent注解來注明方法所執(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是單一方法接口,表示類具有 Lifecycle,而如果activity繼承自AppcompatActivity或Fragment繼承自androidx.fragment.app.Fragment他們本身就是一個(gè)LifecycleOwner的實(shí)例,這是AndroidX庫幫我們自動(dòng)完成的。

自定義LifecycleOwner

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

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

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

使用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了,不過大多數(shù)時(shí)候我們還是不需要自定義的。

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

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

使用我們上面所說的方法,監(jiān)聽BaseActivity,但是都不夠優(yōu)雅,如果我們想監(jiān)聽所有Activty的生命周期就要使用ActivityLifecycleCallbacks,我們新建ForegroundCallbacks類實(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)行判斷,但是肯定不是說進(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都不可見的時(shí)候才提示在后臺(tái),按照這種思路我們編寫對(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í)行過onResumed */private boolean onResumed = false; /** * 是否執(zhí)行過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頁面不可見時(shí)誤以為在后臺(tái),不過在真實(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) 再切換回來 結(jié)果如下所示: Android Jetpack架構(gòu)組件Lifecycle詳解

如此 我們就可以優(yōu)雅的監(jiān)聽?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)文章:
主站蜘蛛池模板: 国产精品拍自在线观看 | 丁香月婷婷| 在线色图| 在线视频黄 | 亚洲制服丝袜第一页 | 欧美日韩中文字幕久久伊人 | 国产白嫩美女在线观看 | 欧美国产亚洲精品高清不卡 | 天天色踪合 | 羞羞答答免费人成黄页在线观看国产 | 欧美精品一区二区久久 | 国产综合色在线视频播放线视 | 黄色片免费观看网站 | 欧美一级乱理片免费观看 | 欧美在线一区二区三区 | 非洲一级毛片又粗又长aaaa | a毛片| 全黄一级裸片视频免费区 | 欧美精品综合一区二区三区 | 美国a视频| 香蕉97超级碰碰碰碰碰久 | juliaann与黑人丝袜交 | 成人在线激情网 | 1000部羞羞禁止免费观看视频 | 免费人成黄页在线观看69 | 国自产拍在线视频天天更新 | 激情影院成人区免费观看视频 | 亚洲成人在线网站 | 精品三级在线观看 | 国产精品欧美亚洲韩国日本 | 国产综合久久一区二区三区 | 免费大黄网站在线看 | 2021最新国产成人精品视频 | 成人嗯啊视频在线观看 | 成人私拍福利视频在线 | 又爽又黄又无遮挡的激情视频免费 | 欧美日韩在线视频观看 | 久久精品人人做人人爽 | 中国国产成人精品久久 | 亚洲涩福利高清在线 | 欧美 国产 日韩 第一页 |