设置界面开发Preference Library数据重建机制详解

目录
  • 一.界面重建后设置项数据如何复原的?
    • 1. onSaveInstanceState()保存数据
    • 2. onRestoreInstanceState()恢复数据
  • 二.Preference的销毁重建方法是如何收到通知的呢?
  • 总结

一.界面重建后设置项数据如何复原的?

主要是介绍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对象中。

到了这里我们就明白了,是由FragmentonSaveInstanceState()方法分发了界面销毁重建前保存数据的通知,最终调用到了PreferenceonSaveInstanceState()方法。

同理,onRestoreInstanceState()的分发通知也是如此,这里就不再过多进行分析了。

总结

本篇文章主要是分析了Preference Library的界面销毁重建,数据恢复的机制,就是利用了Fragment的保存数据和恢复数据的时机进行分发通知Preference设置项执行相关的逻辑,希望本篇文章能对你有所帮助。

以上就是设置界面开发利器Preference Library数据重建机制详解的详细内容,更多关于Preference Library数据重建的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android Studio多工程引用同一个library项目配置的解决方法

    在使用Android Studio开发的时候,如遇到多个项目引用同一个library的情况时,会遇到在每个项目中都要有一套library的代码的情况,对于还在开发和维护中的Library需要频繁的修改,这对同步就很麻烦,为了解决这个问题,出现了下面的解决方案. 首先:新建一个类库工程,工程名为AppLibs.Dev. 在该类库中包含一个公共的类库appLibs的Module,Module下面的build.gradle配置如下: /** 声明是Android类库 */ apply plugin:

  • Android将项目导出为Library并在项目中使用教程

    将Android项目导出为Library 1.修改build.gradle中的Module:app文件 最终如下: 2. 进入到项目文件夹目录,保留app文件夹,其余删除 3.  进入到app文件夹下,修改app.iml为你的库名,即是外层文件名 4. 5. 打开 xxx.iml文件,并替换里面的app为Library名 导入Library 6. 点击File菜单 7.选择Model即library的文件路径(没有截图) 8. 将Model与当前项目关联 观察下 gradle app中 总结 以

  • Android用SharedPreferences实现登录注册注销功能

    Android用SharedPreferences实现登录注册注销功能 前言 本文用SharedPreferences本地缓存账号信息来实现登录注册功能,以及退出注销功能. 一.本文逻辑 本文的注册登录逻辑如下: 1.注册页面:有账号可以直接去登录页面.没有账号的话填写账号密码,检测账号密码不为空,点击立即注册,保存账号信息,跳转到登录页面. 2.登录页面:首先读取缓存的账号密码和是否记住密码,将账号显示,判断记住密码的标志,为空或false,不显示密码,需要输入密码,为true则直接将缓存的密

  • Android SharedPreferences存取操作以及封装详解

    存 首先初始化 private SP sp; sp = new SP( context ); 存入数据 第一个参数为上下文,第二个参数为key,第三个参数为要存入的数据Value sp.PutData( context,"AccessToken",AccessToken ); 取 初始化 private SP sp; sp = new SP( context ); 取出数据 第一个参数为上下文,第二个参数为存入数据时定义的名称,第三个数据为取出数据的默认类型(这个参数很关键,再封装类转

  • Android 详解Studio引用Library与导入jar

    在Android项目开发过程中,Android Studio是一款非常强大的开发工具.到底有多强大,用了你就知道了. 本文我将介绍Studio引用Library开源项目与导入jar方法. 一.引用Library 1:选择你的项目,点击导航栏File -->New -->Import Module... 根据提示Import你的Library即可 此时展开你的项目即可发现你导入的Library(我导入的是IOS_Dialog_Library) 到这工作还未结束. 2:再次选择你的项目,点击Fil

  • Android中PreferenceActivity使用详解

    目录 一,Preference介绍 二,PreferencesActivity介绍 三,PreferenceActivity的使用 四,PreferenceActivity分别和ListFragment,PreferenceFragment组合使用 五,Preference数据获取 总结 一,Preference介绍 Android提供的preference以键值对的方式来处理这种情况:自动保存设置的数据,并立时生效,而这种使用android sharedpreferences方式进行保存的,不

  • 设置界面开发Preference Library数据重建机制详解

    目录 一.界面重建后设置项数据如何复原的? 1. onSaveInstanceState()保存数据 2. onRestoreInstanceState()恢复数据 二.Preference的销毁重建方法是如何收到通知的呢? 总结 一.界面重建后设置项数据如何复原的? 主要是介绍Preference Library的数据恢复机制(比如界面销毁重建)浅析. Prefernece基类给我们提供了两个方法: onSaveInstanceState():界面销毁之前提供保存数据的时机: onRestor

  • Java GUI图形界面开发实现小型计算器流程详解

    目录 一.设计目标 二.界面设计 三.功能实现 四.全部代码 五.功能测试 六.小结 一.设计目标 (1)主要功能:实现简单的加.减.乘.除等双目运算,和开平方.百分数等单目运算 (2)辅助功能:按钮“C”实现清空文本框:按钮“←”实现退格,删除文本框中最右边的一个字符 二.界面设计 创建“面板对象”,并设置其布局管理方式为5行4列的GridLayout布局方式,以用于容纳20个按钮.文本框和容纳20个按钮组件的面板则使用边界布局方式分别将其布局到窗体BorderLayout.NORTH和中央位

  • Android开发App启动流程与消息机制详解

    目录 引言 1.第一步了解 ThreadLocal 2.App的启动流程 3.Activity中创建Handler 引言 相信很多人对这个问题不陌生,但是大家回答的都比较简单,如谈到app启动流程有人就会是app的生命周期去了,谈到消息机制有人就会说looper循环消息进行分发,如果是面试可能面试官不会满意,今天我们搞一篇完善的源码解析来进行阐述上面的问题 1.第一步了解 ThreadLocal 什么是ThreadLocal呢,专业的来讲,ThreadLocal 是一个线程内部的数据存储类,通过

  • java开发分布式服务框架Dubbo原理机制详解

    目录 前言 Dubbo框架有以下部件 Consumer Provider Registry Monitor Container 架构 高可用性 框架设计 服务暴露过程 服务消费过程 前言 在介绍Dubbo之前先了解一下基本概念: Dubbo是一个RPC框架,RPC,即Remote Procedure Call(远程过程调用),相对的就是本地过程调用,在分布式架构之前的单体应用架构和垂直应用架构运用的都是本地过程调用.它允许程序调用另外一个地址空间(通常是网络共享的另外一台机器)的过程或函数,并且

  • JavaMail邮件发送机制详解

    这篇文章主要介绍了JavaMail邮件发送机制详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 概念 JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理email的API.它可以方便地执行一些常用的邮件传输.我们可以基于JavaMail开发出类似于Microsoft Outlook的应用程序. 应用场景 一般在系统的注册模块,当用户填入注册信息的邮箱时,点击保存.系统根据用户的信息会自动给用户发送一封

  • 一款高颜值且免费的 SQL 开发工具之Beekeeper Studio详解

    目录 Beekeeper Studio 简介 Beekeeper Studio 安装 Beekeeper Studio 使用教程 连接数据库 文件关联 SQL 编辑器 表格浏览器 快捷键 SQLTools 工具 今天给大家介绍一款简单易用而且美观的免费 SQL 客户端:Beekeeper Studio. Beekeeper Studio 简介 Beekeeper Studio 是一款免费开源的 SQL 开发和数据库管理工具,具有美观高效.简单易用的特点.Beekeeper Studio 基于 V

  • Python并发编程线程消息通信机制详解

    目录 1 Event事件 2 Condition 3 Queue队列 4 总结一下 前面我已经向大家介绍了,如何使用创建线程,启动线程.相信大家都会有这样一个想法,线程无非就是创建一下,然后再start()下,实在是太简单了. 可是要知道,在真实的项目中,实际场景可要我们举的例子要复杂的多得多,不同线程的执行可能是有顺序的,或者说他们的执行是有条件的,是要受控制的.如果仅仅依靠前面学的那点浅薄的知识,是远远不够的. 那今天,我们就来探讨一下如何控制线程的触发执行. 要实现对多个线程进行控制,其实

  • Android 实例开发一个学生管理系统流程详解

    目录 效果演示 实现功能总览 代码 登录与忘记密码界面 一.添加布局文件 二.添加标题文字 三.绑定适配器 注册界面 一.创建两个Drawable文件 二.将其添加数组内 三.动态变化背景 考勤界面 一.CircleProgressBar代码如下 签到界面 一.倒计时 二.位置签到 成绩查询界面 一.创建StackAdapter 适配器 效果演示 随手做的一个小玩意,还有很多功能没有完善,倘有疏漏,万望海涵. 实现功能总览 实现了登录.注册.忘记密码.成绩查询.考勤情况.课表查看.提交作业.课程

  • python编程开发时间序列calendar模块示例详解

    目录 calendar模块 设置每周第一天-setfirstweekday 1.默认情况:礼拜一是第一天 2.设置任意一天 是否闰年-isleap 年份间的闰年数-leapdays(y1, y2) 星期几-weekday(year, month, day) monthrange(year, month) 月的日历矩阵-monthcalendar(year, month) 月的日历-prmonth(year, month, w, l) 年的日历-calendar.calendar(year) 格式

  • Java基础篇之反射机制详解

    目录 1.反射概述 1.1什么是反射 1.2.反射能干什么 2.解剖类 2.1反射构造方法 2.1.1反射无参的构造函数 2.1.2反射“一个参数”的构造函数 2.1.3反射“多个参数”的构造函数 2.1.4反射“私有”的构造函数 2.1.5反射得到类中所有的构造函数 2.2反射类中的方法 2.3反射类中的属性字段 思考:在讲反射之前,先思考一个问题,java中如何创建一个对象,有哪几种方式? Java中创建对象大概有这几种方式: 1.使用new关键字:这是我们最常见的也是最简单的创建对象的方式

随机推荐