前一次的博文只是对如何监听settings里的screentimeout做了解释,而具体是如何实现系统睡眠并为做详细说明,近来有对此做休整,所以重温下具体实现.
1.设置里为何只有保存数据,而并没有保存后的数值对系统的影响?
——>displaysettings.java
@Override
protected void onCreate(Bundle savedInstanceState) {
.......
ListPreference screenTimeoutPreference =(ListPreference) findPreference(KEY_SCREEN_TIMEOUT);
screenTimeoutPreference.setValue(String.valueOf(Settings.System.getInt(resolver, SCREEN_OFF_TIMEOUT, FALLBACK_SCREEN_TIMEOUT_VALUE)));
screenTimeoutPreference.setOnPreferenceChangeListener(this);
disableUnusableTimeouts(screenTimeoutPreference);
......
}
上面的这四段代码主要是实现从系统db数据库里拿上次的设定(没有就设置默认值),然后初始化菜单
public boolean onPreferenceChange(Preference preference, Object objValue) {
........
if (KEY_SCREEN_TIMEOUT.equals(key)) {
int value = Integer.parseInt((String) objValue);
try {
Settings.System.putInt(getContentResolver(),SCREEN_OFF_TIMEOUT, value);
} catch (NumberFormatException e) {
Log.e(TAG, "could not persist screen timeout setting", e);
}
}
.......
}
上面这部分主要是将用户选择的值存到系统的db数据库里去
----->powermanagerservice.java
这部分会涉及到系统的两个服务:systemserver和powermanagerservice,具体关系如下:
class ServerThread extends Thread {
......
@Override
public void run() {
.......
power = new PowerManagerService();
ServiceManager.addService(Context.POWER_SERVICE, power);
power.init(context, lights, ActivityManagerService.getDefault(), battery);
......
}
}
很明显systemserver启动了PowerManagerService服务,那我们再看这个服务又如何screentimeout挂钩的?