2016年6月15日 星期三

[轉] android settings system/secure property

在android中,許多的系統屬性都在settings應用當中進行設置的,比如wifi、藍牙狀態,當前本機語言,螢幕亮度等等一些相關的系統屬性值。這些資料主要是存儲在資料庫中,對應的URI為:content://settings/system和content://settings/secure,這兩個是主要的,目前也只是涉及到這兩個數據庫表的使用。
接下來,就瞭解下settings應用中是如何對系統屬性進行設置的。
當需要獲得當前wifi狀態的值,調用已封裝的方法如下:
Settings.Secure.getInt(getContentResolver() , Settings.Secure.WIFI_ON);
修改wifi狀態只需要調用對應的setInt方法就可以實現。

當需要獲得當前時間日期自動獲取,調用如下:
Settings.System.getInt(getContentResolver() , "auto_time");
修改也是調用對應的setInt方法。

注意:這裡修改settings的系統屬性值需要有相關的許可權。如修改wifi狀態需要有android.permission.WRITE_SETTINGS許可權,許可權問題只要參考sdk下的描述就可以。

其實在settings應用中所獲取或者修改屬性都是調用了framework中android.provider.settings的Settings類對應的方法,也就是說真正有跟資料庫打交道的是在provider中,這裡也體現了ContentProvider的用途。
就大體說下android.provider.settings.Settings這個類吧。Settings裡面創建了包含System和Secure在內的幾個內部類,每個內部類都對應了一張資料庫表,也就是繼承自BaseColumns類,System和Secure類分別對應著system和secure資料庫表。
對於上面通過getInt獲得的欄位,其實是在初始獲得資料庫數值的時候,首先是有getString方法將資料庫資料保留,然後在integer.parseInt將資料轉換成int類型。這就是settings讀取和保留資料的基本原理。

沒有留言:

張貼留言