在 android 中使用浮动小部件服务保持屏幕打开

Keep the screen turned on using a floating widget service in android

我是 android 开发的新手。我有方法使用浮动小部件中的开关控件保持屏幕打开。

    public void onSwitchClick(View view) {
    aSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
           public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
           if (isChecked) { // The switch is enabled
               //int flag = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
               //mLayoutParams.flags=flag;
               //mWindowManager.updateViewLayout(mFloatingWidgetView.getRootView(), mLayoutParams);
               //getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
               Toast.makeText(getApplicationContext(), "ON",
                       Toast.LENGTH_SHORT).show();
           } else { // The switch is disabled
               Toast.makeText(getApplicationContext(), "OFF",
                       Toast.LENGTH_SHORT).show();
           }
       }
   });
}

当用户点击开关时,它应该保持屏幕打开。我已经完成了很多关于 WakeLock、Flags 的回答,但没有一个解决方案对我有用。当我按下打开开关时,应用程序崩溃了。请注意,此方法在服务中并且 Toast 消息工作正常。非常感谢您的帮助。

以下代码段未提供任何编译错误,但在 运行 时间内不起作用。

int flag = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
mLayoutParams.flags=flag;
mWindowManager.updateViewLayout(mFloatingWidgetView.getRootView(), mLayoutParams);

您应该只在有时只会出现在屏幕上的 Activity 中使用 FLAG_KEEP_SCREEN_ON。相反,您需要使用 WakeLock 使屏幕保持全亮度或部分亮度。

首先您需要声明权限:

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

然后您需要使用 PowerManager 获取 WakeLock 并确保 释放 它。释放 WakeLock 意味着您不会不必要地耗尽用户的电池。

WakeLock mScreenWakeLock = null;

PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
mScreenWakeLock = powerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK,
    "widget-screen-wakelock");

// You only want one WakeLock to deal with.
mScreenWakeLock.setReferenceCounted(false);

// Grab the WakeLock and make sure the screen stays on 
mScreenWakeLock.acquire();

然后当你不再需要它的时候你可以释放它:

mScreenWakeLock.release()

请注意,您可能希望对可以持有 WakeLock 的时间量添加限制,这样您就不会永远持有它,尤其是当您正在创建浮动小部件时。您可以通过将最大毫秒数传递给 acquire 方法来做到这一点:

// Hold WakeLock for upto 1 hour.
mScreenWakeLock.acquire(3600000);

您可以使用 adb:

查看您的应用程序正在使用什么 WakeLocks
adb shell dumpsys power | grep -i "package.name"