1,訊號流程:
BrightnessPreference ---->onBindDialogView(getBrightness)---->showDialog---->onPreferenceTreeClick---->onProgressChanged(若有變化才會進來)(setBrightness)----->onDialogClosed---->ContentObserver-mBrightnessObserver----->onBrightnessChanged(getBrightness).
2,相關知識點:
ContentObserver——內容觀察者,目的是觀察(捕捉)特定Uri引起的資料庫的變化,繼而做一些相應的處理
* 觀察特定Uri的步驟如下:
* 1、 建立我們特定的ContentObserver衍生類別,必須重載父類構造方法,必須重載onChange()方法去處理回調後的功能實現
* 2、 利用context.getContentResolover()獲得ContentResolove對象,接著調用registerContentObserver()方法去註冊內容觀察者
* 3、 由於ContentObserver的生命週期不同步於Activity和Service等,因此,在不需要時,需要手動的調用
unregisterContentObserver()去取消註冊。
*
* 總結: 使用ContentObserver的情況主要有一下兩者情況:
1、需要頻繁檢測的資料庫或者某個資料是否發生改變,如果使用線程去操作,很不經濟而且很耗時 ;
2、在使用者不知曉的情況下對資料庫做一些事件,比如:悄悄發送資訊、拒絕接受簡訊黑名單等;
*public final void registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer)
* 功能:為指定的Uri註冊一個ContentObserver衍生類別執行個體,當給定的Uri發生改變時,回調該執行個體對象去處理。
* 參數:uri 需要觀察的Uri(需要在UriMatcher裡註冊,否則該Uri也沒有意義了)
* notifyForDescendents 為false 表示精確匹配,即只匹配該Uri
為true 表示可以同時匹配其派生的Uri
* observer ContentObserver的衍生類別執行個體
*
*
* public final void unregisterContentObserver(ContentObserver observer)
* 功能:取消對給定Uri的觀察
參數: observer ContentObserver的衍生類別執行個體
3,public void onProgressChanged(SeekBar seekBar, int progress,boolean fromTouch)----------------------手動模式下,通過進度條控制項設定亮度;
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)---------------------選中自動或手動調整亮度;
private void setBrightness(int brightness)-------------這是設定亮度!它通過調用PowerManager(framework\base\core\java\android\os\PowerManager.java)及PowerManagerService(framework\base\service\java\com\android\server\PowerManagerService.java)的介面 來調整高度.PowerManagerService中定義的mButtonLight和mKeyboardLight都是鍵盤燈,具體使用哪一個,要看底層的平台廠商使用
public void setBacklightBrightness(int brightness);
(framework\base\service\java\com\android\server\LightsService.java)
(framework\base\services\jni\com_android_server_LightsService.cpp)