当前位置:网站首页>2022-07-30 Androd 进入深度休眠后把WIFI给关掉,唤醒之后重新打开WIFI
2022-07-30 Androd 进入深度休眠后把WIFI给关掉,唤醒之后重新打开WIFI
2022-07-30 16:22:00 【海月汐辰】
一、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给关掉。

边栏推荐
- Image information extraction DEM
- [HMS core] [FAQ] Collection of typical problems of push kit, AR Engine, advertising service, scanning service 2
- 华为云数据治理生产线DataArts,让“数据‘慧’说话”
- 【AGC】质量服务2-性能管理示例
- 【HMS core】【FAQ】push kit、AR Engine、广告服务、扫描服务典型问题合集2
- Invalid or corrupt jarfile xxx.jar
- 登录模块调试-软件调试入门
- 探究CSAPP实验二-bomb lab-第一节
- 大厂面试官眼中的好简历到底长啥样
- lotus 1.16.0 最小快照导出 导入
猜你喜欢
随机推荐
Goland 开启文件保存自动进行格式化
How to intercept the first few digits of a string in php
C#西门子S7 协议通过偏移量的方式读写PLC DB块
Nervegrowold d2l (7) kaggle housing forecast model, numerical stability and the initialization and activation function
SocialFi 何以成就 Web3 去中心化社交未来
【开发者必看】【push kit】推送服务典型问题合集2
Goland opens file saving and automatically formats
PMP每日一练 | 考试不迷路-7.30(包含敏捷+多选)
node.js中怎么连接redis?
[NCTF2019]Fake XML cookbook-1|XXE漏洞|XXE信息介绍
李沐d2l(七)kaggle房价预测+数值稳定性+模型初始化和激活函数
【SOC】Classic output hello world
rhce笔记2
探究CSAPP实验二-bomb lab-第一节
How to connect redis in node.js?
3D激光SLAM:LeGO-LOAM论文解读---实验对比
DTSE Tech Talk丨第2期:1小时深度解读SaaS应用系统设计
详解最实用的几种dll注入方式
DTSE Tech Talk丨第2期:1小时深度解读SaaS应用系统设计
The case of five little pigs (five little pigs compare the size of the body weight)









