lwn

一起分享,共同进步

代码流程分析一:Settings中默认值的流程-显示-自动旋转屏幕

需求是:手机默认的原来是恢复出厂设置是点勾的就是屏幕可以旋转的,现在要改为不打勾屏幕不可以旋转


-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------



一:流程图已经分析




二:代码的分析:

后台:默认值位置分析,后续分析点击之后实现的功能?


1:displaySettings.java显示设置的目录android\packages\apps\Settings\src\com\android\settings\displaySettings.java

onCreate()实例化控件checkBoxPreference,上来默认给控件设置选中不选中状态的代码:



2:RotationPolicy.java类中RotationPolicy.isRotationLocked这个方法调用目录在android\frameworks\base\core\java\com\android\internal\view\RotationPolicy.java


从Settings.System.ACCELEROMETER_ROTATION中查询出来的参数:public static final String ACCELEROMETER_ROTATION = "accelerometer_rotation";

从UserHandle中查出来的参数:public static final int USER_CURRENT = -2;

这个方法的作用:返回一个boolean类型的值。值是从下面3方法中返回一个整形int和0比较如果相等,返回true:不等返回false。



3:Settings.java分析Settings.System.getInteForUser();方法这个方法调用目录在:android\frameworks\base\core\java\android\provider\Settings.java

注意是Settings类中的System类中的getIntForUser方法


这个方法作用:返回一个int型,如果V不为null把V转为int返回:如果为null,返回0。如果不为null,将V解析出来,通过后面的分析直到v设置了true是0,false是1。也就是返回1就行了。


4:看getSettingForUser(cr,name,userHandle)这个方法:在Settings.System.里面不要找错,因为Settings里面有system,secure,global,bookmarks这几个里面都有那个方法


第一个if语句:MOVED_TO_SECURE这个东西是一个hashSet集合初始化的时候添加了元素进去

 MOVED_TO_GLOBAL.add(Settings.Global.ADB_ENABLED);
            MOVED_TO_GLOBAL.add(Settings.Global.ASSISTED_GPS_ENABLED);
            MOVED_TO_GLOBAL.add(Settings.Global.BLUETOOTH_ON);

这就是个例子,意思就是加进来一些属性看看里面的值有没有与name="accelerometer_rotation"一样的。经过检查没有。


第二条if语句:同理,也是没找到一样的。


走最后一个return:位置是在Settings.NameValueCache.这个类中的getStringForUser()方法,惊呆了代码太多,大致就是用contentResolver来操作数据库查询数据表中值,这种直接分析------->SettingsProvider。


contentProvider和contentResolver的用法:http://blog.csdn.net/lwnlwn1/article/details/47022527


补充分析:

第三条return语句传进来的name=”accelerometer_rotation“;userHandle=-2。


SYS_PROP_SETTING_VERSION = "sys.settings_secure_version"

public static final Uri CONTENT_URI =Uri.parse("content://" + AUTHORITY + "/system");  public static final String AUTHORITY = "settings";

public static final String CALL_METHOD_GET_SECURE = "GET_secure";

public static final String CALL_METHOD_PUT_SECURE = "PUT_secure";


这四个值分别对应上面的四个值。构造的时候已经传进去值了。

NameValueCache类中的getStringForUser方法中的关键代码:


cp就是IContentProvider这个接口对象有query方法。

URI:"content://settings/system"。

SELECT_VALUE:new String[] { Settings.NameValueTable.VALUE="value" }。

NAME_EQ_PLACEHOLDER:"name=?"。

查出来的结果就是:根据URI查询数据表中name=accelerometer_rotation“下的所有value的值。因为调用的时候是传进来name的。如果有值就取这个值,如果没有返回null。最后把这个键值对存到values(accelerometer_rotation,“value”)。但是返回出去的只是查出来的value值。







contentResolver分析:android\frameworks\base\core\java\android\provider

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

contentProvider分析:android\frameworks\base\packages\SettingsProvider







5:SettingsProvider的路径是:android\frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\settingsProvider.java

他就是操作的数据库。


provider就是对数据提供uri,重写增删改查。

一:这个provider特别之处:

在目录:android\frameworks\base\packages\SettingsProvider\res\values\下的Defaults.xml文件。

定义了:很多初始值<resources>  <bool name="def_dim_screen">true</bool>

这个地方就是改屏幕旋转初始默认值的地方,原来是true,现在改为false

有时间将所有值都翻译出来。看看都有哪些默认值。

只知道在xml文件中注册了下provider的author

经过经理的一番苦口婆心的讲解终于明白了这个类的用法:

举个例子:

之前学的contenprovider用法就是上来先走匹配,我以为走这个就是匹配连接了,不走这个就连接不上,其实是错误的。这个只是解析URI,使得操作更方便能查1条或者多条数据。

static {
URI_MATCHER.addURI("com.example.contentproviderdemo.StudentProvider",
"student", STUDENTS);
URI_MATCHER.addURI("com.example.contentproviderdemo.StudentProvider",
"student/#", STUDENT); // /#表四匹配单挑记录,否则空指针
}

第一个的意思是有一张表,执行完int flag = URI_MATCHER.match(uri);返回一个coda。如果是第一个查询所有集合,如果是第二个返回的是1条数据,比如指定表中5条。这样做的目的就是方便操作。咱们的这个表只会操作1条数据,所以就又用上面的URI_MATCHER.


大致流程:contentReserver指定了URI"content://settings/system"就会匹配到所有provider然后看注册的authour是settings的筛选出来操作,所以这个时候就筛选出来settingsProvider了相当于已经匹配到了provider

----------->走onCreate构造(创建实例化了数据库表对象)。

----------->query();方法指定URI就匹配到了provider的query。然后查询原理一样。





6:数据库这边的路径:同一个路径下\DataBaseHelper.java

onCreate方法:


创建system数据表调用loadSettings(db)





给数据表system中插入值



传参数是true返回1,false返回0.



key:字段"accelerometer_rotation"

value:R.bool中的true,false最后是1或者0。



总结:一调用这个sql就相当于给system表中name 字段插入accelerometer_rotation,value字段插入R.bool中定义好的true。现在改为false。


整体流程:先定义好了值,存到数据库里。将这个数据共享uri。别的应用查这个值来设置默认值。


前台分析:点击勾选之后的操作



阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lwnlwn1/article/details/47018445
个人分类: 代码分析
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭