原始碼DisplaySettings分析android橫豎屏切換的開關
由於jwisp本人在使用手機過程中, 經常需要開啟或者關閉橫豎屏的開關. (比如jwisp在發簡訊或者各種文字編輯情況時, 經常需要全鍵盤來快速輸入, 而瀏覽文字或者某些應用時, 躺著或者坐著不切換橫豎屏)
好, 有了jwisp這個需求, 我們如何實現呢.
這裡說兩句廢話, 有同學一碰到問題先網上搜, 其實有時候搜東西, 資訊不是沒有, 而是太多, 花很久時間才能找到自己想要的結果. 如果花很久又沒有找到自己的結果就更鬱悶了. 而且這種方法常常也沒有讓自己鍛鍊到自己的技術. 當然搜尋能力得到了提高, 呵呵.
所以不如我們直接找到android原始碼, 看看google是怎麼實現的, 即可以鍛鍊自己閱讀原始碼能力, 也提高了分析能力, 還能在自己的程式中借鑑google的程式設計思想, 豈不是一舉三得之妙事?
好, 進入正題, 首先我們在手機介面上, 可以找到這個程式設定的關鍵詞. 設定 -> 顯示設定 -> 自動旋轉螢幕
如果熟悉android原始碼, 直接定位DisplaySettings.java (packages/apps/settings/src/com/android/settings/下)
如果不知道這個類, 我們該如何找到呢?
在命令列下, 敲命令也行:
grep '自動旋轉螢幕' /android -r -s
開啟DisplaySettings.java後, 關注下面這幾個關鍵地方就行
1. DisplaySettings類繼承關係
public class DisplaySettings extends PreferenceActivity
我們在設定類的layout中, 經常使用PreferenceActivity類
2.checbox資源
private CheckBoxPreference mAccelerometer; ...... protected void onCreate(Bundle savedInstanceState) { ...... addPreferencesFromResource(R.xml.display_settings); ...... mAccelerometer = (CheckBoxPreference) findPreference(KEY_ACCELEROMETER); mAccelerometer.setPersistent(false); ...... }
mAccelerometer是這個橫豎屏切換的關鍵點, 它的狀態動作決定了橫豎屏開關的開啟和關閉. 它是在display_settings.xml中設定的.
2.載入checkbox的初始狀態
private void updateState(boolean force) { ...... updateAnimationsSummary(mAnimations.getValue()); mAccelerometer.setChecked(Settings.System.getInt( getContentResolver(), Settings.System.ACCELEROMETER_ROTATION, 0) != 0); }
載入checkbox的初始狀態
3.mAccelerometer的狀態更新
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { if (preference == mAccelerometer) { Settings.System.putInt(getContentResolver(), Settings.System.ACCELEROMETER_ROTATION, mAccelerometer.isChecked() ? 1 : 0); } return true; }
ok, 這裡就是關鍵點了. Settings使用SharedPreference方式設定了開關的對應值, 我們這裡只需要通過Settings.System的靜態方法putInt就可以實現鍵值對對應的修改選項呢了
很簡單, 如果自己分析的話, 應該也很快, 不會比網上找更慢
最後, jwisp提醒大家, 在程式中新增Settings.System.putInt()後, 還需要在AndroidManifest.xml中新增對應許可權:
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
ok, good luck.