1. 程式人生 > >SystemProperties與Settings.system

SystemProperties與Settings.system

android原始碼開發中,常常要用到一些全域性標誌或者說變數,這時候我們可以給android系統新增自己想要的屬性。

1.Settings.system

這種系統屬性我們經常用到,例如飛航模式的開啟和關閉,我們就是去改變Settings.system.AIRPLANE_MODE_ON 的值。

下面就介紹下我們怎樣去定義一個系統屬性。例如要新增一個屬性名為“SILVAN_LIU”

路徑:frameworks/base/core/java/android/provider/Settings.java

[java] view plaincopyprint?
  1. publicstaticfinal String SILVAN_LIU = 
    "silvan_liu";  
  2. publicstaticfinal String[] SETTINGS_TO_BACKUP ={  
  3.             ~  
  4.        +SILVAN_LIU  
  5.               ~     
  6. }  
這樣新增後,你就是可以通過Settings.System.getInt(getContentResolver(), Settings.System.SILVAN_LIU,0) 和Settings.System.getInt(getContentResolver(), Settings.System.SILVAN_LIU,0
)去得到和設定SILVAN_LIU的屬性值。

2.SystemProperties

建立與修改android屬性用Systemproperties.set(name, value),獲取android屬性用Systemproperties.get(name),需要注意的是android屬性的名稱是有一定的格式要求的,如下: 字首必須用system\core\init\property_service.c中定義的字首 ,進行系統屬性設定的程式也必須有system或root許可權

如果我們要新增一個property:例如:silvan_liu

路徑:system/core/rootdir/int.rc

在on post-fs-data 目錄下

 setprop persist.sys.silvan_liu 1//persist.sys 字首名; 1為初始值

PS:不同字首名許可權不同,這裡就不一一說明;還有為什麼要載入on post-fs-data目錄下,這和int.rc的語法有關。

1 使用 SystemProperties.get

這中方法在framework裡面 經常見到。

特別屬性

如果屬性名稱以“ro.”開頭,那麼這個屬性被視為只讀屬性。一旦設定,屬性值不能改變。
如果屬性名稱以“persist.”開頭,當設定這個屬性時,其值也將寫入/data/property。

在c++中就是對應JAVA的兩個函式就是property_set, property_get,其實JAVA是通過JNI呼叫這兩個函式的。


JAVA

import android.os.SystemProperties;

SystemProperties.set("persist.sys.language", zone.getID());
String lang= SystemProperties.get("persist.sys.language");

C

#include <cutils/properties.h>

property_set("persist.sys.language", "zh");
property_get("persist.sys.language", propLang, "en");

在adb shell可以通過以下的命名讀取和修改

#getprop  persist.sys.language


#setprop   persist.sys.language  zh

2 使用 Settings.System.putInt 

這種方式會儲存變數到Settings 資料庫中,飛航模式等的開關就是用這種方式實現的。


AndroidManifest.xml中包含許可權:
<uses-permission android:name=”android.permission.WRITE_SETTINGS” />
在需要傳送資料的java檔案中,包含:
import android.provider.Settings;
import android.content.ContentResolver;
ContentResolver resolver = mContext.getContentResolver();
Settings.System.putInt(resolver,”inputFlag”,1);
同理,在接收資料端:
Settings.System.getInt(resolver,”inputFlag”,3);
mContext為所在應用的上下文。