android控件屬性大全,Android系統中屬性值的設置和使用

 2023-12-25 阅读 32 评论 0

摘要:每個屬性都有一個名稱和值,他們都是字符串格式。屬性被大量使用在Android系統中,用來記錄系統設置或進程之間的信息交換。屬性是在整個系統中全局可見的。每個進程可以get/set屬性。 屬性服務在“init”守護進程中運行。每一個客戶端想要設置屬性時,必須

每個屬性都有一個名稱和值,他們都是字符串格式。屬性被大量使用在Android系統中,用來記錄系統設置或進程之間的信息交換。屬性是在整個系統中全局可見的。每個進程可以get/set屬性。

屬性服務在“init”守護進程中運行。每一個客戶端想要設置屬性時,必須連接屬性服務,再向其發送信息。屬性服務將會在共享內存區中修改和創建屬性。任何客戶端想獲得屬性信息,可以從共享內存直接讀取。這提高了讀取性能。

API函數(Android7.1版本在system/core/libcutils/properties.c)是:

int property_get(const char *key, char *value, const char *default_value);
int property_set(const char *key, const char *value);

android控件屬性大全?屬性服務調用libc中的__system_property_init函數來初始化屬性系統的共享內存。當啟動屬性服務時,將從以下文件中加載默認屬性:

/default.prop
/system/build.prop
/system/default.prop
/data/local.prop

屬性將會以上述順序加載。后加載的屬性將覆蓋原先的值。這些屬性加載之后,最后加載的屬性會被保持在/data/property中。

幾種特殊的屬性:
1.ro.屬性,它表示只讀屬性,它一旦被設置就不能被修改;
2.net.屬性,顧名思義,就是與網絡相關的屬性,net.屬性中有一個特殊的屬性:net.change,它記錄了每一次最新設置和更新的net.屬性,也就是每次設置和更新net.屬性時則會自動的更新net.change屬性,net.change屬性的value就是這個被設置或者更新的net屬性的name。例如我們更新了屬性net.bt.name的值,由于net有屬性發生了變化,那么屬性服務就會自動更新net.change,將其值設置為net.bt.name。
3.persist.屬性,以文件的形式保存在/data/property路徑下。persist.屬性由于將其保存在了用戶空間中,所以在property_init中是不能對其更新的,只能將其更新過程交給用戶來處理。在編程過程尤其需要注意這個屬性的使用,我之前在這個方面吃過虧,一直找不到原因,后來才發現,是這個屬性導致,如果用戶不去重新設置這個屬性,那么它一直不會改變,相當于固話在系統中了,重啟機器獲取到的也是之前設置的值,相關的命名可以設置類似于persist.sys.miscdev.beep等。
4.ctl.屬性,雖然是以屬性的形式來進行設置,其實它的目的是為了啟動或關閉它指定的service
屬性“ ctrl.start ”和“ ctrl.stop ”是用來啟動和停止服務。每一項服務必須在/init.rc中定義.系統啟動時,init守護進程將解析init.rc和啟動屬性服務。一旦收到設置“ ctrl.start ”屬性的請求,屬性服務將使用該屬性值作為服務名找到該服務,啟動該服務。這項服務的啟動結果將會放入“ init.svc.<服務名>“屬性中 。客戶端應用程序可以輪詢那個屬性值,以確定結果。

如果想要開關機之后屬性值變回空,盡量不要使用以上三種屬性前綴命名你的屬性值。或者可以在獲取到你需要的屬性之后,設置它成別的屬性。

android配置環境變量?例子:

	#include <cutils/properties.h> //要包含頭文件char driver_status[PROPERTY_VALUE_MAX];memset(_prop_value, 0, PROPERTY_VALUE_MAX);//get獲得 "wlan.driver.status" 的屬性,放到 driver_status 數組中。這是默認屬性設置為NULLproperty_get("wlan.driver.status", driver_status, "0")static char wlan_value[7] ="timeout";property_set("wlan.driver.status", wlan_value);// 將 "wlan.driver.status" 屬性設置為 timeout。

例子:

                 memset(value, 0, PROPERTY_VALUE_MAX);property_get("persist.sys.miscdev.val", value, "0"); // default : 0if (atoi(value) >= 1)state = atoi(value);ALOGE("prop[%s] setprop [ persist.sys.miscdev.debug ]", value);memset(value, 0, PROPERTY_VALUE_MAX);property_get("persist.sys.miscdev.debug", value, "0"); // default : 0if (atoi(value) == 1)dbg_on = 1;elsedbg_on = atoi(value);}

在Android中有三種方式來設置和獲取屬性:

1、Native(c++/c)代碼

當編寫Native的程序時,可以使用property_get和property_set API來獲得和設置屬性。使用這兩個API必須要包含頭文件cutils/properties.h和鏈接libcutil庫。

在c使用demo:
	char buf[20]="qqqqqq";char tempbuf[PROPERTY_VALUE_MAX];property_set("type_value",buf);property_get("type_value",tempbuf,"0");

有時候會出現報錯:error: undefined reference to ‘property_get’,出現這個問題時,一開始懷疑是頭文件沒添加,但是確認了幾遍,頭文件有添加;并確認了沒有寫錯,但是編譯還是報錯提示error: undefined reference to ‘property_get’,后面才發現是還需要在Android.mk中添加libcutils:
LOCAL_SHARED_LIBRARIES := libcutils

2、Java代碼

android:gravity屬性、Android在Java庫中提供System.getProperty和System.setProperty方法,我們Java程序可以通過他們來設置和獲得屬性。

但是請注意!雖然從語法上面看Java的代碼和Native代碼非常相近,但是Java版本存儲把屬性存在其他地方,而不是我們上面提到的屬性系統中。在JVM中有一個hash表來維護Java的屬性。所以Java屬性和Android屬性是不同的,不能用Java API(System.getProperty和System.setProperty)來設置系統屬性。也不能通過Native的方法(property_get和property_set)設置Java的屬性。

更新:Andrew指出android.os.SystemProperties可以操作Android系統屬性(雖然這個類傾向于內部使用)。這個類通過JNI調用Native的property_get和property_set方法來獲得和設置屬性。

在JAVA的使用demo:
	String navBarOverride = SystemProperties.get("qemu.hw.mainkeys");SystemProperties.set("service.bootanim.exit", "0");
3、Shell腳本

Android提供了命令行工具setprop和getprop來設置和獲取屬性,他們可以在腳本中被使用。

 在shell的使用demo:adb相應的命令獲取和設置屬性wlan.driver.status:
  getprop "wlan.driver.status"setprop "wlan.driver.status"  "timeout"

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/194844.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息