一、App中进行wifi的打开与关闭的方法,这个方法在androd8真机上测试是可以,但是android11 就需要系统app才可以。
1、AndroidManifest.xml 里面增加权限
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
2、初始化管理器
WifiManager wifiManager=(WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
3、操作:
wifiManager.setWifiEnabled(false);
wifiManager.setWifiEnabled(true);
二、Androd 进入深度休眠后把WIFI给关掉,唤醒之后重新打开WIFI的实现方法
1、第一步得获取灭屏幕时候是不是进入深度休眠,进入深度休眠后系统会把很多电源给关掉省功耗。wakeup_sources节点下active_since项为非0的锁就是目前上锁的。
kernel\drivers\base\power\wakeup.c
2、休眠、唤醒的入口分别在frameworks\base\services\core\java\com\android\server\power\PowerManagerService.java的wakeUpNoUpdateLocked、goToSleepNoUpdateLocked
3、系统要进入休眠前判断一下是否是深度休眠,如果是深度休眠,就把WIFI给关了。系统唤醒后,判断一下之前的休眠是不是把WIFI给关了,如果是,重新打开WIFI。
4、上层frameworks修改的内容
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
old mode 100644
new mode 100755
index af7d91c..921c107
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -119,6 +119,19 @@ import java.util.Arrays;
import java.util.List;
import java.util.Objects;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.PrintWriter;
+import java.io.IOException;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.*;
+import android.net.wifi.WifiManager;
+import android.os.SystemProperties;
+
/**
* The power manager service is responsible for coordinating power management
* functions on the device.
@@ -507,6 +520,9 @@ public final class PowerManagerService extends SystemService
public final float mScreenBrightnessMinimumVr;
public final float mScreenBrightnessMaximumVr;
public final float mScreenBrightnessDefaultVr;
+ public boolean mdisablewifiafterscreenoff = false ;
+ public WifiManager wifiManager;
+ public boolean DeepSleepCloseWIFI = false;
// The screen brightness mode.
// One of the Settings.System.SCREEN_BRIGHTNESS_MODE_* constants.
@@ -1052,6 +1068,8 @@ public final class PowerManagerService extends SystemService
mAttentionDetector.systemReady(mContext);
PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
+ wifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
+ DeepSleepCloseWIFI = SystemProperties.getBoolean("persist.deepsleep.closewifi", false);
mScreenBrightnessSettingMinimum = pm.getBrightnessConstraint(
PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_MINIMUM);
mScreenBrightnessSettingMaximum = pm.getBrightnessConstraint(
@@ -1689,6 +1707,13 @@ public final class PowerManagerService extends SystemService
Trace.asyncTraceBegin(Trace.TRACE_TAG_POWER, TRACE_SCREEN_ON, 0);
Trace.traceBegin(Trace.TRACE_TAG_POWER, "wakeUp");
+
+ if(mdisablewifiafterscreenoff && DeepSleepCloseWIFI)
+ {
+ if (!wifiManager.isWifiEnabled())
+ wifiManager.setWifiEnabled(true);
+ }
+
try {
Slog.i(TAG, "Waking up from "
+ PowerManagerInternal.wakefulnessToString(getWakefulnessLocked())
@@ -1749,8 +1774,43 @@ public final class PowerManagerService extends SystemService
reason = Math.min(PowerManager.GO_TO_SLEEP_REASON_MAX,
Math.max(reason, PowerManager.GO_TO_SLEEP_REASON_MIN));
Slog.i(TAG, "Going to sleep due to " + PowerManager.sleepReasonToString(reason)
- + " (uid " + uid + ")...");
-
+ + " (uid " + uid + ")..."+" DeepSleepCloseWIFI:"+DeepSleepCloseWIFI);
+
+ if(DeepSleepCloseWIFI)
+ {
+ String content = "";
+ boolean check_enter_deep_sleep = true;
+ File file = new File("/sys/kernel/debug/wakeup_sources");
+ if ((file != null) && file.exists()) {
+ try {
+ FileInputStream fin = new FileInputStream(file);
+ BufferedReader reader = new BufferedReader(new InputStreamReader(fin));
+ StringBuffer stringBuffer = new StringBuffer();
+ while ((content = reader.readLine()) != null)
+ {
+ stringBuffer.append(content+"\n");
+ if(content.contains("<systemwakeuped>wake_lock_always")
+ || content.contains("<systemwakeuped>rockchip_otg"))
+ check_enter_deep_sleep = false;
+ }
+ //Slog.i(TAG, "/sys/kernel/debug/wakeup_sources content : \r\n" + stringBuffer.toString());
+ fin.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ if(check_enter_deep_sleep)
+ {
+ if (wifiManager.isWifiEnabled()) {
+ Slog.i(TAG, "Deep sleep mode,Close WIFI.\r\n");
+ wifiManager.setWifiEnabled(false);
+ mdisablewifiafterscreenoff = true;
+ } else {
+ mdisablewifiafterscreenoff = false;
+ }
+ }else
+ Slog.i(TAG, "The system will not enter deep sleep mode.\r\n");
+ }
mLastSleepTime = eventTime;
mLastSleepReason = reason;
mSandmanSummoned = true;
5、进入普通休眠不会关掉WIFi。
6、进入深度休眠之前把WIFI给关掉。