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

您的位置:首頁技術文章
文章詳情頁

Android Jetpack架構組件Lifecycle詳解

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

前言

Lifecycle是Jetpack架構組件中用來感知生命周期的組件,使用Lifecycles可以幫助我們寫出和生命周期相關更簡潔更易維護的代碼。

生命周期

生命周期這個簡單而又重要的知識相信大家早已耳熟能詳。假設我們現在有這樣一個簡單需求:

這個需求只是一個實例,在真實的開發中當然不可能有這樣的需要:

在Activity 可見的時候,我們去做一個計數功能,每隔一秒 將計數加1 ,當Activity不可見的時候停止計數,當Activity被銷毀的時候 將計數置為0

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

public class Main3Activity extends AppCompatActivity { private static final String TAG = 'Main3Activity'; int count = 0; /** * 是否計數 */ 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; }}

運行結果如下所示:

Android Jetpack架構組件Lifecycle詳解

符合我們的預期,你可能鄙視的看了我一眼,這樣多臃腫啊,我可是學過面向對象的人,所以你把工作放在了一個名為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中的生命周期中分別執行對應的方法,感覺美滋滋~

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

使用Lifecycle管理生命周期

我們通過改寫WorkUtil類來講解如何使用Lifecycle,讓WorkUtil類實現LifecycleObserver

我們通過OnLifecycleEvent注解來注明方法所執行的生命周期,如下所示:

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中注冊即可:

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

這樣是不是簡潔多了呢,那么我們為什么可以在Activity中直接使用getLifecycle().addObserver(new WorkUtil());呢,其實使用的是LifecycleOwner.getLifecycle, LifecycleOwner是單一方法接口,表示類具有 Lifecycle,而如果activity繼承自AppcompatActivity或Fragment繼承自androidx.fragment.app.Fragment他們本身就是一個LifecycleOwner的實例,這是AndroidX庫幫我們自動完成的。

自定義LifecycleOwner

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

Android Jetpack架構組件Lifecycle詳解

我們可以看到這個時候,就不能直接使用getLifecycle,而要自定義一個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;}

這樣我們就實現了自定義LifecycleOwner了,不過大多數時候我們還是不需要自定義的。

優雅的檢測應用程序前后臺狀態

很多業務中我們都需要監聽應用前后臺的狀態 ,比如在前臺的時候開始緩存任務,在后臺的時候停止緩存任務,其實方法有很多,比如

使用我們上面所說的方法,監聽BaseActivity,但是都不夠優雅,如果我們想監聽所有Activty的生命周期就要使用ActivityLifecycleCallbacks,我們新建ForegroundCallbacks類實現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()); }}

添加一個初始化的方法:

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

在Application中進行注冊:

ForegroundCallbacks.init(this);

運行項目日志如下: Android Jetpack架構組件Lifecycle詳解

現在我們知道肯定要在onActivityResumed和onActivityPaused兩個方法中進行判斷,但是肯定不是說進入到了resumed就是在前臺,進入到了paused就是后臺,因為我們的應用會有多個activity,只有第一個activity在前臺的時候我們才提示在前臺,只有所有activity都不可見的時候才提示在后臺,按照這種思路我們編寫對應的處理

首先定義個接口 里面回調在前臺或在后臺的方法

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

定義標記位

private Runnable runnable; /** * 是否執行過onResumed */private boolean onResumed = false; /** * 是否執行過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); }

在這里我們進行延遲0.6s的原因是為了避免啟動新的activity 舊的activity頁面不可見時誤以為在后臺,不過在真實的業務場景中還是需要按照細節進行優化,在applicaton添加事件回調

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

運行程序切換到后臺 再切換回來 結果如下所示: Android Jetpack架構組件Lifecycle詳解

如此 我們就可以優雅的監聽應用前后臺切換了。

是否感受到Lifecycle的強大了呢?

到此這篇關于Android Jetpack架構組件Lifecycle詳解的文章就介紹到這了,更多相關Android Jetpack架構組件Lifecycle內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品毛片久久| 成人日韩在线| 国产成人精品福利| 国产精品一国产精品k频道56| 亚洲日韩中文字幕一区| www.com.cn成人| 国产美女精品视频免费播放软件| 亚洲一区二区日韩| 综合亚洲色图| 亚洲精品人人| 亚洲影院天堂中文av色| 亚洲国产一区二区在线观看 | 999国产精品永久免费视频app| 久久精品国产在热久久| 麻豆精品在线视频| 精品久久国产一区| 麻豆极品一区二区三区| 老色鬼精品视频在线观看播放| 久久精品国产免费| 成人片免费看| 日韩在线观看一区二区| 日本综合视频| 欧美国产极品| 韩国精品主播一区二区在线观看 | 日韩免费av| 久久九九电影| 免费久久精品| 一区二区日韩免费看| 日韩午夜视频在线| 国产精品1区在线| 国精品产品一区| 日韩欧美少妇| 免费成人性网站| 欧美国产日韩电影| av资源亚洲| 国产字幕视频一区二区| 日韩电影二区| 日本欧美在线看| 麻豆一区二区99久久久久| 国产一区二区三区四区大秀 | 日韩va亚洲va欧美va久久| 日韩在线观看| 国产日韩欧美一区二区三区在线观看| 久久久久久美女精品| 欧美一区在线观看视频| 欧美在线观看视频一区| 亚洲乱码一区| 国精品产品一区| 伊人影院久久| 国产精品99精品一区二区三区∴| 精品国产第一福利网站| 欧美中文日韩| 国产精品一区亚洲| 婷婷中文字幕一区| 日本成人中文字幕在线视频| 日韩成人免费| 亚洲a成人v| 久久国产毛片| 国产欧美日韩在线一区二区| 91精品国产乱码久久久久久久| 国产亚洲激情| 日本欧美韩国一区三区| 日韩免费福利视频| 日韩二区三区在线观看| 日本韩国欧美超级黄在线观看| 亚洲另类黄色| 亚洲欧美视频| 久久狠狠婷婷| 日本午夜大片a在线观看| 亚洲深夜福利在线观看| 日韩欧美字幕| 国产精品久久777777毛茸茸| 亚洲专区欧美专区| 日韩久久精品网| 国产精品99久久免费| 亚洲自拍另类| 久久国产主播| 欧美精品不卡| 日韩激情一二三区| 伊人久久亚洲美女图片| 久久精品毛片| 欧美日本精品| 日韩视频精品在线观看| 国产精品调教| 亚洲综合专区| 99视频一区| 久久精品青草| 伊人久久在线| 麻豆91在线播放| 久久精品凹凸全集| 午夜免费一区| 精品国产三区在线| 午夜精品影视国产一区在线麻豆| 亚洲午夜91| 欧美日韩国产探花| 欧美一区=区| 日韩精品五月天| 亚洲+小说+欧美+激情+另类| 一区在线观看| 伊人精品在线| 好看的av在线不卡观看| 精精国产xxxx视频在线野外| 久久99久久久精品欧美| 国产精品一级| 国产精品毛片视频| 国产精品黄色片| 国产精品网在线观看| 欧美日韩18| 国产色噜噜噜91在线精品 | 91欧美在线| 日韩1区2区| 亚洲3区在线| 免费在线观看一区二区三区| 免费久久99精品国产自在现线| 久久av在线| 免费久久精品视频| 天堂va欧美ⅴa亚洲va一国产| 免费在线观看一区二区三区| 久久av在线| 亚洲制服一区| 日韩欧美三区| 国产麻豆精品| 国产一区二区三区视频在线| 蜜臀91精品国产高清在线观看| 丝瓜av网站精品一区二区| 亚洲综合不卡| 亚洲欧美久久| 中文字幕一区二区三区四区久久 | 九九99久久精品在免费线bt| 国产区精品区| 久久精品国产99| 首页国产精品| 日韩精品dvd| 久久av免费看| 精品视频一二| 久久久777| 午夜一区在线| 日本视频中文字幕一区二区三区| 国产精品一区亚洲| 久久三级毛片| 日韩在线看片| 99pao成人国产永久免费视频| 日韩中文字幕av电影| 亚洲v天堂v手机在线| 国产乱人伦精品一区| 精品日韩一区| 波多野结衣一区| 精品资源在线| 99国产精品视频免费观看一公开 | аⅴ资源天堂资源库在线| 久久精品卡一| 免费观看日韩电影| 国产精品www.| 久久亚洲精品中文字幕蜜潮电影| 蜜臀91精品一区二区三区| 国产欧美日韩一级| 久久av综合| 日韩三区在线| 欧美在线精品一区| 91精品国产乱码久久久久久久 | 秋霞国产精品| 久久国产三级| 欧美专区一区二区三区| 欧美男人天堂| 久久丁香四色| 日韩中文字幕| 女主播福利一区| 免费高潮视频95在线观看网站| 欧美日韩午夜电影网| 国产婷婷精品| 亚洲精品国产嫩草在线观看| 国产精品任我爽爆在线播放| 免费观看久久久4p| 欧美福利在线| 午夜av成人| 热三久草你在线| 久久香蕉网站| 国产情侣久久| 亚洲免费毛片| 天堂va蜜桃一区二区三区| 久久精品亚洲欧美日韩精品中文字幕| 国产精品nxnn| 国产精品日本一区二区不卡视频| 综合激情婷婷| 免费久久精品视频| 美女黄网久久| 午夜一级在线看亚洲| 香蕉精品久久| 日韩免费高清| 国产成人精品三级高清久久91| 国产精品一卡| 国产精品久久久久久久久久白浆| 色综合视频一区二区三区日韩| 国产精品普通话对白| 亚洲性色视频| 精品91久久久久| 中文一区二区| 日韩成人a**站| 日韩av在线中文字幕| 精品国产美女a久久9999|