網(wǎng)站首頁 編程語言 正文
設(shè)置界面開發(fā)Preference?Library數(shù)據(jù)重建機(jī)制詳解_Android
作者:長安皈故里 ? 更新時(shí)間: 2022-12-03 編程語言一.界面重建后設(shè)置項(xiàng)數(shù)據(jù)如何復(fù)原的?
主要是介紹Preference Library
的數(shù)據(jù)恢復(fù)機(jī)制(比如界面銷毀重建)淺析。
Prefernece
基類給我們提供了兩個(gè)方法:
onSaveInstanceState()
:界面銷毀之前提供保存數(shù)據(jù)的時(shí)機(jī);
onRestoreInstanceState()
:界面銷毀之后提供恢復(fù)數(shù)據(jù)的時(shí)機(jī);
這兩個(gè)方法名和Activity
提供的銷毀重建的相關(guān)方法名都是相同的,所以其作用也都是相同的,這里我們以EditTextPreference
類作為入口分析下。
1. onSaveInstanceState()保存數(shù)據(jù)
protected Parcelable onSaveInstanceState() { final Parcelable superState = super.onSaveInstanceState(); if (isPersistent()) { return superState; } final SavedState myState = new SavedState(superState); myState.mText = getText(); return myState; }
首先isPersistent()
這個(gè)方法是用來判斷該設(shè)置項(xiàng)數(shù)據(jù)是否保存到默認(rèn)的SharedPreference
中,如果保存,那我們就不需要通過onSaveInstanceState()
保存數(shù)據(jù)了。
比如數(shù)據(jù)保存到了SP中,當(dāng)界面銷毀重建時(shí),會重新從SP中讀取數(shù)據(jù)渲染到界面上。
接下來看下isPersistent()
返回false的情況:
會構(gòu)造一個(gè)SavedState
對象,這個(gè)對象的父類就是一個(gè)Parcelable
對象,只不過幫助我們封裝了讀寫getText()
對應(yīng)的內(nèi)容:
2. onRestoreInstanceState()恢復(fù)數(shù)據(jù)
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
對象,如果是,則直接進(jìn)行強(qiáng)制轉(zhuǎn)換,并從對象中獲取到銷毀前的mText
設(shè)置項(xiàng)的文本數(shù)據(jù)。
二.Preference的銷毀重建方法是如何收到通知的呢?
這里我們就以onSaveInstanceState()
保存重建前數(shù)據(jù)的方法,進(jìn)行分析如何接收到分發(fā)通知進(jìn)行調(diào)用的。
EditTextPreference
的方法重寫的方法onSaveInstanceState()
最終是在Preference
的方法dispatchSaveInstanceState
進(jìn)行調(diào)用:
繼續(xù)往下走:
public void saveHierarchyState ( @NonNull Bundle container) { dispatchSaveInstanceState( container); }
最終我們查找到方法saveHierarchyState()
被PreferenceFragmentCompat
這個(gè)類進(jìn)行調(diào)用,這個(gè)類其實(shí)就是一個(gè)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); } }
我們的數(shù)據(jù)會被保存到container
這個(gè)Bundle對象中,然后再將這個(gè)Bundle
保存到Fragment
的用于保存銷毀重建數(shù)據(jù)的Bundle
對象中。
到了這里我們就明白了,是由Fragment
的onSaveInstanceState()
方法分發(fā)了界面銷毀重建前保存數(shù)據(jù)的通知,最終調(diào)用到了Preference
的onSaveInstanceState()
方法。
同理,onRestoreInstanceState()
的分發(fā)通知也是如此,這里就不再過多進(jìn)行分析了。
總結(jié)
本篇文章主要是分析了Preference Library
的界面銷毀重建,數(shù)據(jù)恢復(fù)的機(jī)制,就是利用了Fragment
的保存數(shù)據(jù)和恢復(fù)數(shù)據(jù)的時(shí)機(jī)進(jìn)行分發(fā)通知Preference
設(shè)置項(xiàng)執(zhí)行相關(guān)的邏輯,希望本篇文章能對你有所幫助。
原文鏈接:https://juejin.cn/post/7159209932804341767
相關(guān)推薦
- 2022-07-04 python實(shí)現(xiàn)PyEMD經(jīng)驗(yàn)?zāi)B(tài)分解殘差量分析_python
- 2022-12-03 C?++迭代器iterator在string中使用方法介紹_C 語言
- 2022-06-28 ASP.NET?WebAPI導(dǎo)出CSV_實(shí)用技巧
- 2022-01-29 調(diào)用存儲命令:將sqlserver表中的數(shù)據(jù)導(dǎo)出sql語句或生成insert into語句
- 2022-08-01 OpenCV連通域數(shù)量統(tǒng)計(jì)學(xué)習(xí)示例_python
- 2022-07-22 Docker安裝Seata分布式鎖
- 2022-12-12 python字符串中兩個(gè)大括號{{}}的使用及說明_python
- 2022-04-09 SpringBoot上傳文件并配置本地資源映射來訪問文件
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支