2022-07-30 Androd 进入深度休眠后把WIFI给关掉,唤醒之后重新打开WIFI

一、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。

扫描二维码关注公众号,回复: 14419965 查看本文章

 6、进入深度休眠之前把WIFI给关掉。

猜你喜欢

转载自blog.csdn.net/qq_37858386/article/details/126069460
今日推荐