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

原创 2015年07月23日 11:14:42

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


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



一:流程图已经分析




二:代码的分析:

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


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。别的应用查这个值来设置默认值。


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



版权声明:本文为博主原创文章,未经博主允许不得转载。

查询/设置Settings的值

按计划每周更新一篇技术博文,第四篇:《查询/设置Settings的值》     通常很多定制系统或者与系统相关的应用都需要查询/设置Settings(设置)里边的值,比如系统亮度,休眠时间,...
  • zzp16
  • zzp16
  • 2012年08月20日 21:33
  • 19391

android Settings.Secure的使用

androdi Settings.Secure的使用
  • kingyc123456789
  • kingyc123456789
  • 2016年08月10日 17:03
  • 5500

说说Android中的Settings.Secure

在android中,许多的系统属性都在settings应用当中进行设置的,这些数据主要是存储在数据库中,并且我们可以调用下面函数来得到指定的属性值,他们都是静态函数,直接通过Settings.Secu...
  • hp910315
  • hp910315
  • 2016年06月06日 17:18
  • 1932

Android 在frameworks中修改Setting中的默认值(一)

在frameworks中跟Setting默认值相关的几个文件 /frameworks/base/packages/SettingsProvider/res/values/defaults.xml /f...
  • deng0zhaotai
  • deng0zhaotai
  • 2014年11月22日 14:09
  • 6072

Setting的默认初始值

Setting的默认初始配置frameworks/base/packages/SettingsProvider/res/values/default.xml 这里貌似可以修改很多东西,但要在 fr...
  • px348402717
  • px348402717
  • 2016年09月30日 11:08
  • 951

android系统app打开蓝牙+设置可见性

BluetoothAdapter blue = BluetoothAdapter.getDefaultAdapter();     这两个方法足矣满足你的需求(需要system权限):     blu...
  • u010164190
  • u010164190
  • 2017年01月14日 08:59
  • 1741

Android 自动旋转屏幕快捷开关监听

屏幕旋转开关: 1). 屏幕旋转开关设置主要调用android.provider.Settings.System的putInt和getInt方法实现。 2). 通过ContentObserve...
  • ThunderRong
  • ThunderRong
  • 2016年08月19日 15:31
  • 2051

辅助设置中自动旋转

补充:4.4.4bug已经被修改 切入正题 在AccessibilitySettings.java中,点击自动旋转的调用以下函数 private void handleLockScreenRot...
  • wangxueming
  • wangxueming
  • 2015年02月27日 16:37
  • 1183

系统重力感应开关和Activity的屏幕方向属性值之间的区别

跟屏幕相关的有两个级别的概念: 系统级别的重力感应开关和Acitivty级别的方向属性值,之间有关联,但是又完全不同的两个概念。 1. 系统重力感应可以理解为重力感应开关 获取系统重力感应的开关状态...
  • oLevin
  • oLevin
  • 2016年04月25日 10:20
  • 982

android第一次启动时Settings的默认值

我的环境是基于msm8x12的android4.3。 在做android系统时,每个公司对其都有其自己的定制,比如默认用什么输入法,用什么语言,是否开启ADB调试等,这些当你第一次开机的时候,都会获取...
  • sgmenghuo
  • sgmenghuo
  • 2016年06月13日 13:59
  • 7112
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:代码流程分析一:Settings中默认值的流程-显示-自动旋转屏幕
举报原因:
原因补充:

(最多只允许输入30个字)