代码流程分析一:Settings中默认值的流程-显示-自动旋转屏幕
来源:互联网 发布:天猫手续费比淘宝高 编辑:程序博客网 时间:2024/05/21 17:16
需求是:手机默认的原来是恢复出厂设置是点勾的就是屏幕可以旋转的,现在要改为不打勾屏幕不可以旋转
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
一:流程图已经分析
二:代码的分析:
后台:默认值位置分析,后续分析点击之后实现的功能?
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中默认值的流程-显示-自动旋转屏幕
- android自动屏幕旋转流程分析
- android自动屏幕旋转流程分析
- android自动屏幕旋转流程分析
- Settings的显示流程
- android屏幕旋转显示流程
- Android 6.0 屏幕旋转系统流程分析
- settings源码中显示所有进程流程
- 代码流程分析二:Settings-蓝牙分析-新增rawgelWhile分析一
- 代码流程分析二:Settings-蓝牙分析-switch开关分析
- 代码流程分析二:Settings-蓝牙分析-加载界面
- 代码流程分析二:Settings-蓝牙分析-搜索设备原理
- android源码settings中显示所有正在运行进程流程分析
- android源码settings中显示所有正在运行进程流程分析
- Android M中Settings的启动流程
- androoid framework学习之Settings的主界面的代码流程分析
- Android Settings源码流程分析
- SurfaceFlinger旋转流程分析
- 最全面的前端面试问题及答案总结
- maven笔记一
- 无符号整型,在for循环出错
- Hibernate的generator属性
- [树状数组] poj3468 A Simple Problem with Integers
- 代码流程分析一:Settings中默认值的流程-显示-自动旋转屏幕
- #ifdef DEBUG的理解
- ios的新App加急上线可以选择邮件催办
- 按键事件在activity中的流程
- POJ 3461 && HDU 1686 Oulipo(kmp)
- 创建一个简单的按钮
- app版本更新的四种实现方式
- swift学习03-快速学习常量变量
- Swift之 ? 和 !用法