編輯:關於Android編程
以下介紹屬性服務的原理:
void property_init(void) { init_property_area(); } static int init_property_area(void) { prop_area *pa; //創建共享內存 if(init_workspace(&pa_workspace, PA_SIZE)) return -1; /**設置空間大小等其他信息*/ //系統自動調用__libc_prenit函數,完成共享內存到本地進程的工作 __system_property_area__ = pa; }
void __libc_preinit(void) { __libc_init_common(elfdata); } void __libc_init_common(uintptr_t *elfdata) { __system_properties_init(); } int __system_properties_init(void) { //取出init創建環境變量獲得文件描述符 env = getenv("ANDROID_PROPERTY_WORKSPACE"); fd = atoi(env); //映射 init創建的內存到本地進程空間 //這樣其他進程就可以共享這個內存了 //在這裡 客戶端只能做讀取的操作 pa = mmap(0, sz, PROT_READ, MAP_SHARED, fd, 0); }
1)加載屬性文件到屬性空間裡面去 同時創建scoket
*void start_property_service(void) { //加載屬性文件 load_properties_from_file(PROP_PATH_SYSTEM_BUILD); load_properties_from_file(PROP_PATH_SYSTEM_DEFAULT); load_override_properties(); //加載持久化文件 load_persistent_properties(); //創建socket fd = create_socket(PROP_SERVICE_NAME, SOCK_STREAM, 0666, 0, 0); } init.c::int main(){ nr = poll(ufds, fd_count, timeout); if (ufds[i].revents == POLLIN) { if (ufds[i].fd == get_property_set_fd()) handle_property_set_fd(); } } }
void handle_property_set_fd() { //接收scoket if ((s = accept(property_set_fd, (struct sockaddr *) &addr, &addr_size)) < 0) { return; } //取出進程的權限屬性 if (getsockopt(s, SOL_SOCKET, SO_PEERCRED, &cr, &cr_size) < 0) { close(s); return; } //接收數據 r = TEMP_FAILURE_RETRY(recv(s, &msg, sizeof(msg), 0)); if(memcmp(msg.name,"ctl.",4) == 0) { // ctl.* 控制消息 //如setprop ctl.start bootanim close(s); if (check_control_perms(msg.value, cr.uid, cr.gid, source_ctx)) { handle_control_message((char*) msg.name + 4, (char*) msg.value); } else { ERROR("sys_prop: Unable to %s service ctl [%s] uid:%d gid:%d pid:%d\n", msg.name + 4, msg.value, cr.uid, cr.gid, cr.pid); } } else { //檢查權限 if (check_perms(msg.name, cr.uid, cr.gid, source_ctx)) { //設置屬性 property_set((char*) msg.name, (char*) msg.value); } else { ERROR("sys_prop: permission denied uid:%d name:%s\n",cr.uid, msg.name); } } } int property_set(const char *name, const char *value) { prop_info *pi = (prop_info*) __system_property_find(name); if(pi != 0) { /* ro.* properties 只讀屬性 不能設置 */ if(!strncmp(name, "ro.", 3)) return -1; //更新屬性 update_prop_info(pi, value, valuelen); } else { //增加屬性最多247項 } //處理持久屬性/net.*/ ..................... //修改屬性同時執行的操作 property_changed(name, value); }
private static native String native_get(String key); public static String get(String key) { if (key.length() > PROP_NAME_MAX) { throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX); } return native_get(key); }
static JNINativeMethod method_table[] = { { "native_get", "(Ljava/lang/String;)Ljava/lang/String;", (void*) SystemProperties_getS }, .......//省略部分代碼 } } static jstring SystemProperties_getS(JNIEnv *env, jobject clazz,jstring keyJ) { return SystemProperties_getSS(env, clazz, keyJ, NULL); } static jstring SystemProperties_getSS(JNIEnv *env, jobject clazz,jstring keyJ, jstring defJ) { int len; const char* key; char buf[PROPERTY_VALUE_MAX]; jstring rvJ = NULL; .............//省略部分代碼 key = env->GetStringUTFChars(keyJ, NULL); len = property_get(key, buf, ""); //構造獲得的屬性 rvJ = env->NewStringUTF(buf); ............. }
int property_get(const char *key, char *value, const char *default_value) { char sendBuf[1+PROPERTY_KEY_MAX]; char recvBuf[1+PROPERTY_VALUE_MAX]; int len = -1; ............... //執行init函數獲取屬性 pthread_once(&gInitOnce, init); ............... return len; } static void init(void) { ................ gPropFd = connectToServer(SYSTEM_PROPERTY_PIPE_NAME); ................ } static int connectToServer(const char* fileName) { int sock = -1; int cc; struct sockaddr_un addr; ................. /* connect to socket; fails if file doesn't exist */ //采用TCP連接服務器 定義地址和協議族AF_UNIX strcpy(addr.sun_path, fileName); // max 108 bytes addr.sun_family = AF_UNIX; cc = connect(sock, (struct sockaddr*) &addr, SUN_LEN(&addr)); if (cc < 0) { close(sock); return -1; } return sock; }
先上效果圖:之前用手機QQ時,一直很覺得這個窗口提示挺不錯的,今天將它大概地實現了一遍。一、對TipView定義一些成員變量// 一些狀態變量private static
簡介 將數據存儲到SharedPreferences中 獲取SharedPreferences對象 Context類中的getSharedPreferences方法 文件
大部分手機上邊都會有一個“MENU”鍵,在一個應用安裝到手機上之後,可以通過“MENU”顯示該應用關聯的菜單。 但是,從Android 3.0開始,Android不再要求
本文實例為大家分享了android讀取assets中Excel的具體代碼,供大家參考,具體內容如下1.在assets下放的excel表格,命名為excel.xls 2.添