欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

深入Android Browser配置管理的详解

程序员文章站 2023-12-09 22:36:21
settings是webview提供给上层app的一个配置webview的接口,每个webview都有一个websettings,要控制webview的行为,只能通过web...
settings是webview提供给上层app的一个配置webview的接口,每个webview都有一个websettings,要控制webview的行为,只能通过webview.getsettings()获取websettings对象的引用,然后再改变它的属性。
browser有一个browsersettings用来管理所有的配置信息,它是一个单键(singleton)。browsersettings是直接管理websettings的,而ui部分则是由browserpreferencepage和fragment来完成。browsersettings实现了onsharedpreferencechangedlistener,当某个配置项发生变化时,browsersettings的接口onpreferenceschanged就会被回调到,然后browsersettings就会把配置通过websettings应用到webview中,所以这些settings都是及时生效的。

一共有三类settings:共享settings,静态settings和动态settings。静态就是不会在browser运行时发生变化的,也就是说在browser的settings中无法改变的一些配置,这些跟应用程序内部关联较多,比如应用程序的数据存放地点等,而与用户层关系不多;共享settings是独立于webview的,也就是说它被系统内所有webview共享的一些配置,比如cookie,它不需要为每个webview单独配置。动态settings就是用于动态配置webview的,比如字体,缩放,是否加载图片,是否启用javascript等等。

初始化
因为browser可以有多个窗口,每一个窗口都会有一个webview,也就是说browser会管理多个webview,所以browsersettings也要管理多个websettings,因为每一个配置的改变都要应用到所有的webview中。为了能让browsersettings能够管理多个websettings,它必须持有对这些websettings的引用。browser在创建webview的时候会把webview的配置websettings通过接口放到browsersettings中,browsersettings中有一个列表,用于持有对websettings的引用。具体的browserwebviewfactory中的initwebviewsettings()方法会在每次创建webview后调用,它把webview的websettings取出,做些必要的初始化,然后放到browsersettings中,browsersettings.startmanagingsettings()会加载sharedpreference文件中的信息对此websettings进行初始化,然后放到mmanagedsettings列表中。

配置变更
用户进入settings界面,进行配置的更改,每当有配置发生变化browsersettings.onsharedpreferenceschanged()会被回调到,它就会做syncmanagedsettings()的动作,把共享设置同步到底层去(也即把设置同步到cookiemanager中),再遍历列表mmanagedsettings,把mpref中的信息全部同步到每个websettings中,这样所有的webview都会实时的响应配置变更。

设置的界面和browsersettings没有直接的关联,界面是通过preferenceactivity和fragment把各种settings呈现给用户,而browsersettings是把配置信息同步给webview也就是让配置生效。它们之间的信息桥梁是sharedpreference,也就是说preferenceactivity和fragment从用户处接收配置信息,然后放到sharedpreference中,browsersettings监听sharedpreference的变化,再把sharedpreference同步给webview。