首先,我前面有一片部落格寫的是android消除螢幕鎖 ,這裡想加以改進,因為在我們所使用的手機中已經在“設定”的“協助工具功能”中有選擇是否“解除螢幕鎖”(也就開機時和按power鍵 亮屏時是否有螢幕鎖)。 這裡我想做的就是在原生的android源碼上添加這一功能,主要還是以學習為主去實現這一功能。 看這個之前我希望你們看一下android消除螢幕鎖這篇部落格。 首先我是在做好了案頭迴圈之後去做在“設定”中的“協助工具功能”中添加這一項:先看一張圖片:這裡的解除螢幕鎖就是咱們要添加的項。 先講一下思路吧:先把介面做出來,再將是否選擇的值存到系統的(adb shell進入)data/data/com.android.providers.settings/databases/settings.db資料庫中的system表中, 然後在framework/base/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java的源碼中取得資料庫中是否選擇迴圈案頭來執行相關代碼。 先做UI:先做UI: 在settings源碼中的accessibility_settings.xml檔案中添加一個checkbox:[java] <!-- add by xxnan --> <CheckBoxPreference android:key="lock_screen" android:title="@string/lock_screen_title" android:persistent="false"/> 在settings源碼的res中添加相關的代碼:在values/string.xml中添加(英文顯示):<string name="lock_screen_title">Lock_Screen</string> 在values-zh-rCN/string.xml中添加(中文顯示):<string name="lock_screen_title" msgid="4676390750360727396">"迴圈案頭"</string> 在settings源碼的AccessibilitySettings.java中的OnCreate中添加:[java] /*****************************************/ mLockScreen=(CheckBoxPreference) findPreference( LOCK_SCREEN); int LockScreen=Settings.System.getInt(this.getContentResolver(), "lock_screen",0);//取出是否被選擇 if( LockScreen==1) mLockScreen.setChecked(true);//如果被選擇,那麼下次開啟setting時就勾選 else mLockScreen.setChecked(false);//如果沒被選擇,那麼下次開啟setting時就不勾選 /*****************************************/ 當然還要定義幾個量:private final String LOCK_SCREEN = "lock_screen"; private CheckBoxPreference mLockScreen; 在onPreferenceTreeClick函數中添加: [java] //add by xxnan if(LOCK_SCREEN.equals(key)) { Settings.System.putInt(getContentResolver(), "lock_screen", ((CheckBoxPreference) preference).isChecked()? 1:0);//將是否選擇存到系統的system表中 } //add by xxnan 如果做好了之後當你點擊選擇“案頭迴圈時”可以到(adb shell進入)data/data/com.android.providers.settings/databases下的settings.db資料庫(sqlite3 settings.db)的system 表中看到lock_screen|1(select * from system;)。 到這裡就完成了將資料存到系統system表中以及UI,接下來就是在framework/base/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java源碼中去取這個值。 在framework/base/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java中的private void handleShow() 方法中: [java] mKeyguardViewManager.show(); mShowing = true; adjustUserActivityLocked(); adjustStatusBarLocked(); 改為:[java] /* **************************************************/ //modifidy by xxnan lock_screen=Settings.System.getInt(mContext.getContentResolver(), "lock_screen",0);//取出system表中是否取消螢幕鎖的值 if(lock_screen==0)//如果不取消 { mKeyguardViewManager.show(); mShowing = true; adjustUserActivityLocked(); adjustStatusBarLocked(); } /***************************************************/ 並且在 private void handleHide() 方法中也要做一樣的修改: [java] mKeyguardViewManager.hide(); mShowing = false; adjustUserActivityLocked(); adjustStatusBarLocked(); 改為: [java] /******************************************************/ lock_screen=Settings.System.getInt(mContext.getContentResolver(), "lock_screen",0);//從資料庫中取值 if(lock_screen==0) { mKeyguardViewManager.hide(); mShowing = false; adjustUserActivityLocked(); adjustStatusBarLocked(); } /*****************************************************/ 當然這裡面也要定義幾個量,以及匯入幾個包:匯入包://add by xxnanimport android.content.ContentResolver;//從system表中取資料import android.provider.Settings;定義變數:private int lock_screen;//取得是否迴圈的值 到這裡就全部修改好了,還有就是編譯一下源碼中的package/apps的settings源碼和framework/base的policy源碼,將產生的out/target/。。。/system/app下的Settings.apk和system/framework下的android.policy.jar替換手機裡system/app的Settings.apk和system/framework下的android.policy.jar就可以了。