http://androidxref.com/8.0.0_r4
============================================================
/frameworks/base/core/java/android/provider/Settings.java
public static final String WIFI_SLEEP_POLICY = "wifi_sleep_policy";
public static final int WIFI_SLEEP_POLICY_DEFAULT = 0;
public static final int WIFI_SLEEP_POLICY_NEVER_WHILE_PLUGGED = 1;
public static final int WIFI_SLEEP_POLICY_NEVER = 2;
============================================================
/frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiController.java
private int mSleepPolicy; // 当前休眠策略
private int mPluggedType; // 当前充电状态 可选值如下
{
private static final int BATTERY_PLUGGED_NONE = 0; // 手机没有充电
private static final int BATTERY_PLUGGED_AC = 1; // 注册充电
private static final int BATTERY_PLUGGED_USB = 2; // 连接电脑USB充电
private static final int BATTERY_PLUGGED_WIRELESS= 4; // 无线充电
public static final int BATTERY_PLUGGED_ANY = 7;
}
/**
* Determines whether the Wi-Fi chipset should stay awake or be put to
* sleep. Looks at the setting for the sleep policy and the current
* conditions.
*
* @see #shouldDeviceStayAwake(int)
*/
private boolean shouldWifiStayAwake(int pluggedType) { //依据参数pluggedType和mSleepPolicy值 确定是否休眠
if (mSleepPolicy == Settings.Global.WIFI_SLEEP_POLICY_NEVER) {
// Never sleep
return true;
} else if ((mSleepPolicy == Settings.Global.WIFI_SLEEP_POLICY_NEVER_WHILE_PLUGGED) && (pluggedType != 0)) {
// Never sleep while plugged, and we're plugged
return true;
} else {
// Default
return shouldDeviceStayAwake(pluggedType);
}
}
/**
* Observes changes to wifi sleep policy
*/
private void registerForWifiSleepPolicyChange(Handler handler) {
ContentObserver contentObserver = new ContentObserver(handler) {
@Override
public void onChange(boolean selfChange) {
readWifiSleepPolicy();
}
};
mFacade.registerContentObserver(mContext,Settings.Global.getUriFor(Settings.Global.WIFI_SLEEP_POLICY), false,
contentObserver);
}
private void readWifiSleepPolicy() {
mSleepPolicy = mFacade.getIntegerSetting(mContext,
Settings.Global.WIFI_SLEEP_POLICY,
Settings.Global.WIFI_SLEEP_POLICY_NEVER);
}
class DefaultState extends State {
@Override
public boolean processMessage(Message msg) {
switch (msg.what) {
case CMD_SCREEN_OFF: // 灭屏情况下
mScreenOff = true;
if (!shouldWifiStayAwake(mPluggedType)) {
//private static final long DEFAULT_IDLE_MS = 15 * 60 * 1000 // 15分钟
// private static final String ACTION_DEVICE_IDLE ="com.android.server.WifiManager.action.DEVICE_IDLE";
//public static final String WIFI_IDLE_MS = "wifi_idle_ms";
// mIdleMillis = mFacade.getLongSetting(mContext,Settings.Global.WIFI_IDLE_MS, DEFAULT_IDLE_MS);
// Intent idleIntent = new Intent(ACTION_DEVICE_IDLE, null); private static final int IDLE_REQUEST = 0;
// private PendingIntentmIdleIntent = mFacade.getBroadcast(mContext, IDLE_REQUEST, idleIntent, 0);
// 【如果不保持连接,那么设置mIdleMillis 15分钟之后发送 ACTION_DEVICE_IDLE的广播】
if (mNetworkInfo.getDetailedState() ==NetworkInfo.DetailedState.CONNECTED) {
if (DBG) Slog.d(TAG, "set idle timer: " + mIdleMillis + " ms");
mAlarmManager.set(AlarmManager.RTC_WAKEUP,System.currentTimeMillis() + mIdleMillis, mIdleIntent);
} else {
//需要使机器不保持连接 当前连接状态不为连接那么就 直接使发送CMD_DEVICE_IDLE消息
sendMessage(CMD_DEVICE_IDLE);
}
}
break;
case CMD_BATTERY_CHANGED:
int pluggedType = msg.arg1;
// 如果当前灭屏
if (mScreenOff && shouldWifiStayAwake(mPluggedType)【CMD_BATTERY_CHANGED消息前记录的PluggedType】
&&!shouldWifiStayAwake(pluggedType) 【CMD_BATTERY_CHANGED携带的PluggedType】 ) {
// 以上条件满足 那么就发送 mIdleIntent 广播
long triggerTime = System.currentTimeMillis() + mIdleMillis;
if (DBG) Slog.d(TAG, "set idle timer for " + mIdleMillis + "ms");
mAlarmManager.set(AlarmManager.RTC_WAKEUP, triggerTime, mIdleIntent);
}
mPluggedType = pluggedType;
break;