修改Settting中的出厂默认值

一、目的

      将手机的默认12小时制改为24小时制

二、参考

       1.http://blog.csdn.net/caszhao/archive/2010/11/04/5986900.aspx

       2.http://hi.baidu.com/wishwingliao/blog/item/32e13ddbb66d7c72d0164eaa.html

 

        扩展阅读:1. http://my.unix-center.net/~Simon_fu/?p=535

                     2. http://blog.csdn.net/chenzheng_java/archive/2011/03/16/6253181.aspx

三、涉及的文件

          1. frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java

          这个文件是用来生成setting.db的。

        2.frameworks/base/packages/SettingsProvider/res/values/defaults.xml 

          一般把setting.db中各个表的出厂默认初始值放在这个文件中,在DatabaseHelper.java 中读取。

        3./data/data/com.android.providers.settings/databases/setting.db

             此数据库文件是在开机初始化时生成的,而非编译生 成。手机文件系统下用来存储设置中值的数据库。

 

           存储数据的表是system,字段是time_12_24

           读取其值:Settings.System.getString(context.getContentResolver(),Settings.System.TIME_12_24)

           设置其值: Settings.System.putString(getContentResolver(), Settings.System.TIME_12_24,is24Hour? HOURS_24 : HOURS_12)

四、我的修改

                1.frameworks/base/packages/SettingsProvider/res/values/defaults.xml

                    增加默认值:

                      <integer name="def_time_12_24">24</integer>

                 2.frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java

                  在 loadSystemSettings(SQLiteDatabase db)最后增加初始化数据库的值:

                         

五、总结

    上面参考中的两篇博文讲的已经很详细了,我疑惑的是:

    1.默认值是如何做到只写一次的,即DatabaseHelper.java中创建setting.db中的system表,并写入默认值这段代码如何做到只在出 厂 后第一次开 机时才运行?而当用户改变设置后又 不再走这段代码的?

    2.恢复出厂设置如何恢复setting中的默认值呢?

  经过研究发现,原来是SQLiteOpenHelper这个类做到的,它是DatabaseHelper的父类,而所有SQLiteOpenHelper的子类必须实现两个重要方法:onCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase, int, int):

     onCreate:当数据库第一次被建立的时候被执行,例如创建表,初始化数据等。

  onUpgrade:当数据库需要被更新的时候执行,例如删除久表,创建新表。

 

     我们加入的代码正是在onCreate()中调用的,手机出厂第一次开机初始化时,由于 /data/data/com.android.providers.settings/databases/目录下没有setting.db这个文件,故DatabaseHelper.java中的onCreate()方法会被执行,默认值被写入相应 的表中,而当用户再次开机时此数据库文件已经存在了,oncreate()也就不再执行,默认值不会被再次写入,而是保留了用户设定的值。其实这也回答了第2个疑问,恢复出厂设置后setting.db这个文件根本不存在了,再次开机当然会调用onCreate()写入默认值了(其实adb shell 手动将setting.db删掉,也会回到默认值啦^_^~

关于SQLiteOpenHelper,可以参考:

          1 .http://www.eoeandroid.com/thread-53950-1-1.html

          2.http://tech.chinaunix.net/a2010/1103/1121/000001121539.shtml

        另外并非Setting中所有的设置项都在setting.db的相应表中有默认值,有的设置项没有在开机初始化时在数据库中填充默认值,而是在java层做了处理,如DataFormat.java中判断,若system表中没有“time_12_24”字段,则默认12小时制:

is24HourFormat(Context context) {
        String value = Settings.System.getString(context.getContentResolver(),Settings.System.TIME_12_24);       
        if (value == null) {

           ………………

       }

但是,一旦用户更改了默认设置,一般都会写入setting.db的相应表中的。有些还会同步写入到XML文件中,如timeformat ,一旦设置了24小时制,就还会写入到/data/data/com.android.settings/shared_prefs/com.android.settings_preferences.xml :<boolean name="24 hour" value="ture" />,不过这是由 Preferences类的机制决定的(信息以XML文件的形式保存在  /data/data /PACKAGE_NAME / shared_prefs 目录下),ref:http://www.cnblogs.com/GnagWang/archive/2011/02/27/1966587.html

 

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值