編輯:關於Android編程
從之前的博文中我們提到過,關機流程中最後是通過修改Android屬性進行關機操作(SystemProperties.java通過JNI調用訪問系統屬性),當然我們也可以通過adb命令修改Android系統屬性執行關機操作,例如adb shell setpro sys.powerctl shutdown,這裡我們簡單介紹下修改Android屬性關機的原理或流程。
native_set()
這是SystemProperties.java類中設置系統函數的方法。
0119 /**
0120 * Set the value for the given key.
0121 * @throws IllegalArgumentException if the key exceeds 32 characters
0122 * @throws IllegalArgumentException if the value exceeds 92 characters
0123 */
0124 public static void set(String key, String val) {
0125 if (key.length() > PROP_NAME_MAX) {
0126 throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX);
0127 }
0128 if (val != null && val.length() > PROP_VALUE_MAX) {
0129 throw new IllegalArgumentException("val.length > " +
0130 PROP_VALUE_MAX);
0131 }
0132 native_set(key, val);//SystemProperties.java通過JNI調用訪問系統屬性
0133 }
SystemProperties接口類在初始環境中注冊對應CPP接口android_os_SystemProperties.cpp,實際操作通過JNI調用對應cpp文件,frameworks/base/core/jni/AndroidRuntime.cpp.點擊查看源碼
extern int register_android_os_SystemProperties(JNIEnv *env);frameworks/base/core/jni/android_os_SystemProperties.cpp;點擊查看完整源碼
0162 static void SystemProperties_set(JNIEnv *env, jobject clazz,
0163 jstring keyJ, jstring valJ)
0164 {
0165 int err;
0166 const char* key;
0167 const char* val;
0168
0169 if (keyJ == NULL) {
0170 jniThrowNullPointerException(env, "key must not be null.");
0171 return ;
0172 }
0173 key = env->GetStringUTFChars(keyJ, NULL);
0174 *從java程序中傳過去的String對象在本地方法中對應的是jstring類型,jstring類型和c中的char*不同,如果你直接作為char*使用的話,就會出錯。因此使用之前需要進行轉換。轉換方式就是GetStringUTFChars(keyJ, NULL)
0175 if (valJ == NULL) {
0176 val = ""; /* NULL pointer not allowed here */
0177 } else {
0178 val = env->GetStringUTFChars(valJ, NULL);
0179 }
0180
0181 err = property_set(key, val);
0182
0183 env->ReleaseStringUTFChars(keyJ, key);
0184 /*釋放指向UTF-8格式的char*的指針*/
0185 if (valJ != NULL) {
0186 env->ReleaseStringUTFChars(valJ, val);
0187 }
0188
0189 if (err < 0) {
0190 jniThrowException(env, "java/lang/RuntimeException",
0191 "failed to set system property");
0192 }
0193 }
AutoCompleteTextView,很多人都用過,有些情況下使用Google提供的ArrayAdapter作為適配器就可以完成需求,但是在實際開發中,我們經常需要開
Android OkHttp的簡單使用和封裝詳解1,昨天把okHttp仔細的看了一下,以前都是調用同事封裝好了的網絡框架,直接使用很容易,但自己封裝卻不是那麼簡單,還好,
Google在Android6.0之後就刪除了HttpClient相關的API,使用HttpUrlConnection代替,在Android開發中,網絡訪問是必不可少的,
一般來說,Android應用程序中的Button響應事件有兩種書寫方式 Button button=null; button.setOnClickListener(n