文章目錄
- 一、目的
- 二、參考
- 三、涉及的檔案
- 四、我的修改
- 五、總結
一、目的
將手機的預設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)最後增加初始化資料庫的值:
loadUISoundEffectsSettings(stmt);</p><p> loadBooleanSetting(stmt, Settings.System.VIBRATE_IN_SILENT,<br /> R.bool.def_vibrate_in_silent);<br /> //added by yueo @20110609<br /> System.out.println("Entry :loadSystemSettings()......");<br />/* loadStringSetting(stmt, Settings.System.TIME_12_24,<br /> R.string.def_time_12_24);*/<br /> //end<br /> loadIntegerSetting(stmt, Settings.System.TIME_12_24,<br /> R.integer.def_time_12_24);</p><p> } finally {<br /> if (stmt != null) stmt.close();<br /> }
五、總結
上面參考中的兩篇博文講的已經很詳細了,我疑惑的是:
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
。