安卓JetPack篇——LifeCycle原理

LifeCycle

一、什么是Lifecycle

具備宿主生命周期感知能力的組件。它能持有組件(如Activity或Fragment)生命周期狀態的信息,并且允許其他觀察者監聽宿主的狀態。

二、基本原理

1、安卓10以下版本

隱形的Fragment注入在LifecycleOwner(宿主頁面)中,當Fragment感知到宿主生命周期變化時,通知LifecycleRegister進行狀態修改,然后LifecycleRegister通知LifecycleObserver進行具體的操作。

2、安卓10以上版本

不再需要隱形Fragment,直接使用系統回調(lifecyclecallback)

三、五大金剛

1、ReportFragment:隱形fragment,同步感知activity的聲明周期變化,通知給LifecycleRegister(被宿主LifecycleOwner持有)

2、LifecycleRegister:Lifecycle 的具體實現類,更新狀態并通知觀察者。

3、LifecycleObserver:觀察生命周期變化的接口

4、LifecycleOwner:生命周期的持有頁面。

5、Lifecycle:定義生命周期狀態和事件的抽象接口。

四、為什么Deportment可以感知宿主Activity的生命周期

Android 系統保證 Fragment 的生命周期方法100% 同步宿主 Activity。

public class ReportFragment extends Fragment {// ? 1. 注入到 Activitypublic static void injectIfNeededIn(Activity activity) {if (Build.VERSION.SDK_INT >= 29) {// Android 10+ 使用更高效的 APILifecycleCallbacks.registerIn(activity);}// 添加透明 Fragment(兼容舊版本)android.app.FragmentManager manager = activity.getFragmentManager();if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) {manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit();manager.executePendingTransactions();}}// ? 2. 生命周期同步方法(核心)@Overridepublic void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);dispatch(Lifecycle.Event.ON_CREATE);}@Overridepublic void onStart() {super.onStart();dispatch(Lifecycle.Event.ON_START);}@Overridepublic void onResume() {super.onResume();dispatch(Lifecycle.Event.ON_RESUME);}@Overridepublic void onPause() {super.onPause();dispatch(Lifecycle.Event.ON_PAUSE);}@Overridepublic void onStop() {super.onStop();dispatch(Lifecycle.Event.ON_STOP);}@Overridepublic void onDestroy() {super.onDestroy();dispatch(Lifecycle.Event.ON_DESTROY);}// ? 3. 事件分發核心方法private void dispatch(Lifecycle.Event event) {if (Build.VERSION.SDK_INT < 29) {// 僅舊版本需要 ReportFragment 分發事件dispatch(getActivity(), event);}}// ? 實際分發邏輯(靜態方法可獨立調用)public static void dispatch(Activity activity, Lifecycle.Event event) {if (activity instanceof LifecycleOwner) {Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();if (lifecycle instanceof LifecycleRegistry) {((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);}}}// ? 4. Android 10+ 的優化實現@RequiresApi(29)static class LifecycleCallbacks implements Application.ActivityLifecycleCallbacks {static void registerIn(Activity activity) {activity.registerActivityLifecycleCallbacks(new LifecycleCallbacks());}@Overridepublic void onActivityCreated(@NonNull Activity activity, Bundle bundle) {ReportFragment.dispatch(activity, Lifecycle.Event.ON_CREATE);}@Overridepublic void onActivityStarted(@NonNull Activity activity) {ReportFragment.dispatch(activity, Lifecycle.Event.ON_START);}@Overridepublic void onActivityResumed(@NonNull Activity activity) {ReportFragment.dispatch(activity, Lifecycle.Event.ON_RESUME);}@Overridepublic void onActivityPaused(@NonNull Activity activity) {ReportFragment.dispatch(activity, Lifecycle.Event.ON_PAUSE);}@Overridepublic void onActivityStopped(@NonNull Activity activity) {ReportFragment.dispatch(activity, Lifecycle.Event.ON_STOP);}@Overridepublic void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle bundle) {// 不處理}@Overridepublic void onActivityDestroyed(@NonNull Activity activity) {ReportFragment.dispatch(activity, Lifecycle.Event.ON_DESTROY);}}
}

參考文章:

【Android: 徹底搞懂Lifcycle——原理篇 - CSDN App】https://blog.csdn.net/sange77/article/details/125131212?sharetype=blogdetail&shareId=125131212&sharerefer=APP&sharesource=y515278178&sharefrom=link

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/85474.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/85474.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/85474.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CSS 圓角邊框屬性(`border-radius`)筆記

一、作用&#xff1a; 用于設置元素四個角的圓角效果&#xff0c;讓元素不再死板&#xff0c;更加柔和。 二、基本語法&#xff1a; border-radius: 圓角大小; 單位&#xff1a;px&#xff08;像素&#xff09;或 %&#xff08;百分比&#xff09; 示例&#xff1a; div { ?…

python自助棋牌室管理系統

目錄 技術棧介紹具體實現截圖系統設計研究方法&#xff1a;設計步驟設計流程核心代碼部分展示研究方法詳細視頻演示試驗方案論文大綱源碼獲取/詳細視頻演示 技術棧介紹 Django-SpringBoot-php-Node.js-flask 本課題的研究方法和研究步驟基本合理&#xff0c;難度適中&#xf…

計算機——硬盤分區和格式化

硬盤驅動器 硬盤驅動器&#xff08;HDD&#xff09;是一種成熟、經濟的大容量存儲解決方案。它的核心優勢在于每GB成本低和超大容量。然而&#xff0c;其機械結構帶來的速度瓶頸、噪音、功耗和對物理沖擊的敏感性是其主要的缺點。隨著 SSD 價格的持續下降和性能的絕對領先&…

從IEC到UL:技術主權競爭下的斷路器合規性戰略

1 國際標準體系割裂的現狀 在全球低壓電器領域&#xff0c;國際標準體系呈現出日益明顯的割裂態勢。當前主要存在四大標準體系&#xff1a;國際通用的??IEC標準體系??、歐洲采用的??EN標準體系??、北美實施的??UL與CSA標準體系??&#xff0c;以及具有地域特色的?…

第十六屆藍橋杯_省賽B組(D).產值調整

題目如下 這道題看似很簡單&#xff0c;其實還是得觀察一下&#xff0c;要不然就會… 話不多說回到題目&#xff0c;這個題的坑就在于當A,B,C三個產值相同的時候&#xff0c;再怎么變還是之前的產值&#xff0c;或者也可以通過另外一種方法理解&#xff1a; 通過一個案例來舉…

設計模式 | 單例模式——餓漢模式 懶漢模式

單例模式 文章目錄 單例模式一、餓漢模式&#xff08;Eager Initialization&#xff09;1. 定義2. 特點3. 餓漢單例模式&#xff08;定義時-類外初始化&#xff09;4. 實現細節 二、懶漢模式&#xff08;Lazy Initialization&#xff09;1. 定義2. 特點3. 懶漢單例模式&#xf…

dify本地部署及添加ollama模型(ubuntu24.04)

說明&#xff1a;ubuntu是虛擬機的&#xff0c;用的橋接模式&#xff0c;與本地同局域網不同ip地址。 參考VM虛擬機網絡配置&#xff08;ubuntu24橋接模式&#xff09;&#xff1a;配置靜態IP前提&#xff1a;需要有docker及docker-compose環境 參考ubuntu24安裝docker及docker…

Python爬蟲實戰:研究multiprocessing相關技術

一、引言 1.1 研究背景與意義 隨著互聯網信息的爆炸式增長,網絡爬蟲已成為獲取海量數據的重要工具。傳統的單線程爬蟲在面對大規模數據采集任務時效率低下,無法充分利用現代計算機多核 CPU 的優勢。多線程爬蟲雖然在一定程度上提高了效率,但受限于 Python 的全局解釋器鎖(…

6.18 redis面試題 日志 緩存淘汰過期刪除 集群

Redis有哪2種持久化方式&#xff1f;分別的優缺點是什么&#xff1f; Redis 的重寫 AOF 過程是由后臺子進程 bgrewriteaof 來完成的。 過期刪除策略和內存淘汰策略有什么區別&#xff1f; 內存淘汰策略是在內存滿了的時候&#xff0c;redis 會觸發內存淘汰策略&#xff0c;來淘…

什么時候會發生內存泄漏?

1. 內存泄漏是什么&#xff1f; 定義&#xff1a;內存泄漏是指程序中的對象已經不再需要&#xff0c;但由于被其他對象錯誤引用&#xff0c;導致垃圾回收器&#xff08;GC&#xff09;無法回收它&#xff0c;從而長期占用內存空間的現象。 2. 內存泄漏的危害 問題具體表現內存…

用RSA算法模擬類的適配器模式

“RAS算法”這個術語本身并不常見或標準&#xff0c;它可能指向兩個主要領域的不同概念&#xff0c;具體取決于上下文&#xff1a; 更可能是拼寫錯誤&#xff1a;指 RSA 算法&#xff08;密碼學&#xff09; 這是最常見的情況。 “RAS” 極有可能是 “RSA” 的拼寫錯誤。RSA 算…

CARSIM-與C#自動化測試方案

using System; using System.Runtime.InteropServices; using System.Collections.Generic;namespace CarSimAutomation {/// <summary>/// CarSim COM 自動化測試接口/// 封裝所有 CarSim COM 功能用于自動化測試/// </summary>[ComVisible(true)][ClassInterface…

企微CRM系統中的任務分配與效率提升技巧

在數字化管理時代&#xff0c;企業微信(企微)與CRM系統的深度融合&#xff0c;為企業提供了更高效的客戶管理與團隊協作方案。企微CRM軟件不僅整合了客戶溝通、銷售跟進、數據分析等功能&#xff0c;還能通過智能任務分配優化團隊效率。本文將深入探討企微CRM管理系統的任務分配…

day66—BFS—最短的橋(LeetCode-934)

題目描述 給你一個大小為 n x n 的二元矩陣 grid &#xff0c;其中 1 表示陸地&#xff0c;0 表示水域。 島 是由四面相連的 1 形成的一個最大組&#xff0c;即不會與非組內的任何其他 1 相連。grid 中 恰好存在兩座島 。 你可以將任意數量的 0 變為 1 &#xff0c;以使兩座…

FramePack 安裝指南(中文)

FramePack 安裝指南&#xff08;中文&#xff09; -Windows FramePack 是最前沿的 AI 視頻生成框架&#xff0c;以極小的硬件需求顛覆視頻創作&#xff01;它能在僅 6GB 筆記本 GPU 內存上&#xff0c;驅動 13B 模型以 30 FPS 生成超長 120 秒視頻&#xff0c;幾乎無內容限制&…

Redis Sentinel 非集群模式高可用部署指南

1. Sentinel 在非集群模式的定位 一句話&#xff1a;在單主多從架構中&#xff0c;用 Sentinel 替你盯哨——探測故障、選舉新主、通知客戶端。 核心四職能&#xff1a; 職能作用點Monitoring定時 PING 主從&#xff0c;自身也互相探測Notification通過日志/PubSub/外部調用報…

2025Java面試八股文

文章目錄 Java基礎JVM多線程SpringSpring Boot數據庫與SQL分布式系統其他 Java基礎 自動裝箱與拆箱&#xff1a;Java中基礎數據類型與包裝類之間的轉換。例如&#xff0c;Integer x 1; 是裝箱&#xff0c;int y x; 是拆箱。Object類常用方法&#xff1a;如clone()、getClass…

寶塔安裝nginx-rtmp,音視頻直播

前置&#xff1a;需要自己開發音視頻直播&#xff0c; 注意不是實時音視頻&#xff0c;不是一對一視頻聊天&#xff0c;不是視頻會議 方案有 srs &#xff0c;nginx-rtmp&#xff0c;live555&#xff0c;node-media-server&#xff0c;EasyDarwin等 今天是說 nginx-rtmp 怎么…

基于微信小程序和深度學習的寵物照片拍攝指導平臺的設計與實現

文章目錄 摘要前言緒論1. 課題背景2. 國內外現狀與趨勢2.1 國內研究現狀2.2 國外研究現狀2.3 發展趨勢3. 課題內容相關技術與方法介紹1. 微信小程序開發技術2. 深度學習模型選型2.1 MobileNetV22.2 ResNet-503. 系統架構設計4. 關鍵技術實現4.1 實時拍攝指導4.2 多模態建議生成…

web布局02

Web 發展的每個不同時期都有新的技術為 Web 布局提供支持&#xff0c;但不管是哪個時期&#xff0c;Web 布局相關的概念和術語都是相同的。如果你想徹底或者更好地掌握 Web 布局&#xff0c;那么首先需要對 Web 布局相關的技術術語有所了解。 在這一節中&#xff0c;我們一起來…