網站首頁 編程語言 正文
一.界面重建后設置項數據如何復原的?
主要是介紹Preference Library
的數據恢復機制(比如界面銷毀重建)淺析。
Prefernece
基類給我們提供了兩個方法:
onSaveInstanceState()
:界面銷毀之前提供保存數據的時機;
onRestoreInstanceState()
:界面銷毀之后提供恢復數據的時機;
這兩個方法名和Activity
提供的銷毀重建的相關方法名都是相同的,所以其作用也都是相同的,這里我們以EditTextPreference
類作為入口分析下。
1. onSaveInstanceState()保存數據
protected Parcelable onSaveInstanceState() { final Parcelable superState = super.onSaveInstanceState(); if (isPersistent()) { return superState; } final SavedState myState = new SavedState(superState); myState.mText = getText(); return myState; }
首先isPersistent()
這個方法是用來判斷該設置項數據是否保存到默認的SharedPreference
中,如果保存,那我們就不需要通過onSaveInstanceState()
保存數據了。
比如數據保存到了SP中,當界面銷毀重建時,會重新從SP中讀取數據渲染到界面上。
接下來看下isPersistent()
返回false的情況:
會構造一個SavedState
對象,這個對象的父類就是一個Parcelable
對象,只不過幫助我們封裝了讀寫getText()
對應的內容:
2. onRestoreInstanceState()恢復數據
protected void onRestoreInstanceState(@Nullable Parcelable state) { if (state == null || !state.getClass().equals(SavedState.class)) { super.onRestoreInstanceState(state); return; } SavedState myState = (SavedState) state; super.onRestoreInstanceState(myState.getSuperState()); setText(myState.mText); }
首先判斷是否為我們上面保存的SavedState
類型的Parcelable
對象,如果是,則直接進行強制轉換,并從對象中獲取到銷毀前的mText
設置項的文本數據。
二.Preference的銷毀重建方法是如何收到通知的呢?
這里我們就以onSaveInstanceState()
保存重建前數據的方法,進行分析如何接收到分發通知進行調用的。
EditTextPreference
的方法重寫的方法onSaveInstanceState()
最終是在Preference
的方法dispatchSaveInstanceState
進行調用:
繼續往下走:
public void saveHierarchyState ( @NonNull Bundle container) { dispatchSaveInstanceState( container); }
最終我們查找到方法saveHierarchyState()
被PreferenceFragmentCompat
這個類進行調用,這個類其實就是一個Fragment
對象:
@Override public void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); final PreferenceScreen preferenceScreen = getPreferenceScreen(); if (preferenceScreen != null) { Bundle container = new Bundle(); preferenceScreen.saveHierarchyState(container); outState.putBundle(PREFERENCES_TAG, container); } }
我們的數據會被保存到container
這個Bundle對象中,然后再將這個Bundle
保存到Fragment
的用于保存銷毀重建數據的Bundle
對象中。
到了這里我們就明白了,是由Fragment
的onSaveInstanceState()
方法分發了界面銷毀重建前保存數據的通知,最終調用到了Preference
的onSaveInstanceState()
方法。
同理,onRestoreInstanceState()
的分發通知也是如此,這里就不再過多進行分析了。
總結
本篇文章主要是分析了Preference Library
的界面銷毀重建,數據恢復的機制,就是利用了Fragment
的保存數據和恢復數據的時機進行分發通知Preference
設置項執行相關的邏輯,希望本篇文章能對你有所幫助。
原文鏈接:https://juejin.cn/post/7159209932804341767
相關推薦
- 2023-01-20 Python如何求取逆序數_python
- 2022-01-20 關于 Symbol() 能不能當作 key值使用
- 2022-04-21 新一代Python包管理工具_python
- 2022-09-21 redis緩存數據庫中數據的方法_Redis
- 2022-06-29 一文教會你使用Nginx訪問日志統計PV與UV_nginx
- 2022-06-29 基于C++實現五子棋小游戲_C 語言
- 2023-07-09 echarts飄警告[ECharts] There is a chart instance alre
- 2025-02-10 window11 系統安裝 yarn
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支