当前位置:网站首页>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给关掉。

边栏推荐
- Placement Rules usage documentation
- 【HMS core】【Media】【Video Editing Service】 The online material cannot be displayed, it is always in the loading state or the network is abnormal
- FME's scheme and operation process for reading and writing cass data
- Pytorch 训练技巧
- Array element inverse
- 【HMS core】【FAQ】A collection of typical questions about Account, IAP, Location Kit and HarmonyOS 1
- CMake库搜索函数居然不搜索LD_LIBRARY_PATH
- How to use Redis for distributed applications in Golang
- 如何注册域名、备案以及解析
- vivo宣布延长产品保修期限 系统上线多种功能服务
猜你喜欢

Image information extraction DEM

【HMS core】【FAQ】Account、IAP、Location Kit and HarmonyOS典型问题合集1

Promise Notes (1)
![[flutter] What is MaterialApp and Material design](/img/72/d0845467b33b2291f47e7f54171088.jpg)
[flutter] What is MaterialApp and Material design

Leetcode 119. 杨辉三角 II

DTSE Tech Talk丨第2期:1小时深度解读SaaS应用系统设计

服务器装好系统的电脑怎么分区

安全业务收入增速超70% 三六零筑牢数字安全龙头

函数调用方式_stdcall 、 _cdecl 、_thiscall

PyQt5快速开发与实战 9.2 数据库处理
随机推荐
五只小猪的案例(五只小猪 比较体重的大小)
镜像站收集
Gorilla Mux 和 GORM 的使用方法
如何写一份高可读性的软件工程设计文档
游戏多开检测的几种实现方法及破解方法参考
Promise笔记(一)
数组元素逆置
[HMS core] [FAQ] A collection of typical questions about push kit, analysis services, and video editing services 3
Google engineer "code completion" tool; "Transformers NLP" accompanying book code; FastAPI development template; PyTorch model acceleration tool; cutting-edge papers | ShowMeAI News Daily
李沐d2l(七)kaggle房价预测+数值稳定性+模型初始化和激活函数
How to implement timing tasks for distributed applications in Golang
Horizontal Pod Autoscaler(HPA)
Goland 开启文件保存自动进行格式化
Leetcode 119. Yang Hui's Triangle II
go 学习03 基础知识变量类型
How to use Redis for distributed applications in Golang
Overview of TiDB Tool Functions
[TypeScript]简介、开发环境搭建、基本类型
【C语言】指针和数组的深入理解(第二期)
大厂面试官眼中的好简历到底长啥样