从Application上往下跟,解析自动休眠的实现策略
Application层
Settings----Display----Sleep
这里是超时设置的地方。
文件目录:packages/apps/Settings/src/com/android/settings/DisplaySettings.java
这里比较简单:
onCreate()
{
…
mScreenTimeoutPreference = (ListPreference)findPreference(KEY_SCREEN_TIMEOUT);
final long currentTimeout =Settings.System.getLong(resolver, SCREEN_OFF_TIMEOUT,
FALLBACK_SCREEN_TIMEOUT_VALUE);
mScreenTimeoutPreference.setValue(String.valueOf(currentTimeout));
mScreenTimeoutPreference.setOnPreferenceChangeListener(this);
disableUnusableTimeouts(mScreenTimeoutPreference);
updateTimeoutPreferenceDescription(currentTimeout);
…
}
……….
@Override
publicboolean onPreferenceChange(Preference preference, Object objValue) {
finalString key = preference.getKey();
if(KEY_SCREEN_TIMEOUT.equals(key)) {
try {
int value = Integer.parseInt((String) objValue);
Settings.System.putInt(getContentResolver(), SCREEN_OFF_TIMEOUT, value);
updateTimeoutPreferenceDescription(value);
}catch (NumberFormatException e) {
Log.e(TAG, "could not persist screen timeout setting", e);
}
}
}
Settings里头,只是将当前的数值保存在数据库里头,这意味着默认值可以在SettingsProvider中被设置,这是比较正统的做法。同时,也意味着会有一个Observer。
---------------------------------------------------------------------------------------------------------------------------
Framework层
有以下几处用到了这个SCREEN_OFF_TIMEOUT
1. frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java
2. frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
3. frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
4. frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
这几处要一个一个查。具体是什么作用
从简单的开始查,基本上可以肯定DatabaseHelper.java只是初始化,读取默认参数。去看看。
一、DatabaseHelper.java
private voidloadSystemSettings(SQLiteDatabase db) {
SQLiteStatement stmt = null;
try {
……...
//add for factory as ro.rk.screenoff_time
loadSetting(stmt, Settings.System.SCREEN_OFF_TIMEOUT,
SystemProperties.getInt("ro.rk.screenoff_time",mContext.getResources().getInteger(R.integer.def_screen_off_timeout)));
………..
}
这里读取ro.rk.screenoff_time读取数据,默认数值保存在def_screen_off_timeout中。只是初始化数值。
SCREEN_OFF_TIMEOUT这个关键字还出现upgradeScreenTimeoutFromNever中,但这里只是数据库更新时的操作,没有更多的意义。
二、PhoneWindowManager.java第二个文件是这个。
特地说明下这个类:PhoneWindowManager.java继承自WindowManagePolicy.java
WindowManagePolicy.java是做什么的呢?这里头有一大堆lw li t
--------接口类,提供了WindowManager的所有UI定制行为。在WindowManager启动的时候被实例化,允许定制window层级,制定window类型,key事件派发,布局。
WindowManagePolicy.java提供了与系统窗口管理的深层交互。在这个interface中的一些方法会被许多被多重限制的context调用。这里怎么理解呢?多重限制。可以理解成这是些被很多lock限制的context。这些函数会用一些 后缀 来判别被调用时持有了哪些lock。如果没有后缀。那就意味着函数可能是被window manager 主线程或 其他调用windowmanager的线程。
后缀:Ti--------Thread input; Tq----------Thread Queue; Lw---------------lock mainwindowmanager; Li-----------------Lock input thread
同时,在PhoneWindowManager中,新增后缀Lp--------Lock phone window manager
这里的限制&