代码流程分析一: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。别的应用查这个值来设置默认值。


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



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

在Android M及更高版本中使用 Settings.System 抛出异常"You cannot keep your settings in the secure settings. "

You cannot change private secure settings. You cannot keep your settings in the secure settings.

Android自定义控件简单实现ratingbar效果

先上图: 一开始让我自定义控件我是拒绝的,因为android很早以前就有一个控件ratingbar,但是设置样式的时候我发现把图片设置小一点就显示不全,一直找不到解办法!(可以设置系统的自带的小...

SVN如何管理项目的版本号,如1.0.1.xx,修改到1.1.1.xx?

一般是这么操作的: 首先在项目版本库的根目录下建立trunk、branches、tags三个文件夹,日常开发都在trunk文件夹下进。其中tags文件夹主要用于进行版本标记,对此文件夹通常只有该项目的...

android自动屏幕旋转流程分析

在android设置(Settings)中我们可以看到显示(display)下有一个自动屏幕旋转的checkbox, 如果我们勾选checkbox的话当你手机屏幕就会根据重量自动旋转,那么我...

androoid framework学习之Settings的主界面的代码流程分析

今天开始学setting的相关代码流程,主要是主界面生成的流程。 1.Settings简述: Setting模块大家很熟悉把,那你知道它是怎么形成的吗?...

代码流程分析二:Settings-蓝牙分析-加载界面

人一定要靠自己!~ 一:话不多说直接上图Settings->BluetoothSettings分析(那个SB在笑我) 今天先分析BluetoothSettings,明天分析它的父类 二:知识点 ...
  • lwnlwn1
  • lwnlwn1
  • 2015年07月09日 16:27
  • 492

代码流程分析二:Settings-蓝牙分析-搜索设备原理

一:BluetoothSettings中走onResume 二:相当于父类deviceListPreferenceFragment 中走onResume onCreate 三:LocalB...
  • lwnlwn1
  • lwnlwn1
  • 2015年08月12日 19:24
  • 944

代码流程分析二:Settings-蓝牙分析-点击配对连接设备原理分析

蓝牙配对功能 配对手机,配对蓝牙耳机,配对电脑 (一)设置界面packages\Settings A:搜索调用的地方:点击preference因为下面的条目是单独的一个所以到了blueet...
  • lwnlwn1
  • lwnlwn1
  • 2015年08月27日 15:29
  • 1476

代码流程分析二:Settings-蓝牙分析-switch开关分析

一:流程图已经分析 二:代码的分析: switch开关事件的流程: 准备工作: switch点击事件就是:点了开关可以显示不同的界面。 经过测试没有看到bluetoothEnable来控制...
  • lwnlwn1
  • lwnlwn1
  • 2015年08月10日 12:03
  • 633

Android 6.0 屏幕旋转系统流程分析

从今天开始把在技术上心得写在博客上,一来为了记录技术成长历程,二来写下技术关键点,再有向技术大牛们致敬。 从Android 系统开发开始,第一篇写下Android 6.0 屏幕旋转系统分析。第...
  • xyyjxa
  • xyyjxa
  • 2016年12月30日 10:05
  • 975
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:代码流程分析一:Settings中默认值的流程-显示-自动旋转屏幕
举报原因:
原因补充:

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