You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android API 23:如何在保持网络活跃的前提下控制屏幕开关?

解决Android 6.0.1无交互显示屏关闭背光但保持TCP/IP连接的问题

作为Android开发者,我完全理解你遇到的痛点——既要关闭屏幕背光避免残留光晕,又要维持TCP连接、WiFi和USB供电正常,而常规方法要么触发系统休眠导致网络断开,要么无法彻底关闭背光。针对你的Android 6.0.1设备,这里有一套精准可行的解决方案:

核心思路

问题的根源在于:当你清除FLAG_KEEP_SCREEN_ON后,系统没有任何唤醒锁支撑,会自动进入深度休眠状态(切断WiFi、USB供电以省电)。我们需要通过持有PARTIAL唤醒锁保持CPU、网络和USB的活跃,同时单独控制屏幕背光的开关,实现“关屏但系统不停”的效果。

步骤1:添加必要权限

AndroidManifest.xml中声明WAKE_LOCK权限(Android 6.0及以上属于正常权限,无需动态申请):

<uses-permission android:name="android.permission.WAKE_LOCK" />

步骤2:初始化PowerManager和唤醒锁

在你的Activity中初始化PowerManager和PARTIAL类型的唤醒锁,这种锁会保持CPU持续运行,允许屏幕和键盘灯自由关闭:

import android.content.Context;
import android.os.PowerManager;
import android.view.WindowManager;

// 定义全局变量存储唤醒锁
private PowerManager.WakeLock wakeLock;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
    // 第二个参数是唤醒锁的标识,方便系统追踪
    wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyDisplayApp::KeepSystemAliveLock");
}

步骤3:实现关闭屏幕但保持系统活跃的方法

这个方法会先持有唤醒锁防止系统休眠,再强制关闭屏幕:

public void turnScreenOffButLeaveEverythingElseAlone() {
    // 确保唤醒锁已持有,维持CPU、网络、USB活跃
    if (!wakeLock.isHeld()) {
        wakeLock.acquire();
    }
    // 强制关闭屏幕
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_OFF);
    // 清除之前的屏幕常亮标记(如果存在)
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}

步骤4:实现重新打开屏幕的方法

恢复屏幕点亮状态,同时根据需求决定是否释放唤醒锁:

public void turnScreenBackOn() {
    // 清除关闭屏幕的标记,恢复屏幕点亮
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_OFF);
    // 重新设置屏幕常亮(根据你的业务需求可选)
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    // 如果不需要再维持后台系统活跃,可以释放唤醒锁;若要持续保持TCP连接,也可以选择不释放
    if (wakeLock.isHeld()) {
        wakeLock.release();
    }
}

为什么之前的方法无效?

  • 清除FLAG_KEEP_SCREEN_ON:没有唤醒锁的情况下,系统会触发默认休眠逻辑,主动切断WiFi和USB供电以节省电量。
  • 调整screenBrightness到0.0f:很多Android设备的硬件限制了最低亮度阈值,无法彻底关闭背光,只能达到“低亮度”状态,因此会残留光晕。

注意事项

  • 由于你的设备是固定供电的非交互显示屏,持有PARTIAL唤醒锁的耗电问题可以完全忽略。
  • 在应用销毁时(比如onDestroy方法),务必释放唤醒锁,避免影响系统资源:
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (wakeLock != null && wakeLock.isHeld()) {
            wakeLock.release();
        }
    }
    

内容的提问来源于stack exchange,提问作者Lincoln

火山引擎 最新活动