android - 使用android中的 float 小部件服务保持屏幕打开

标签 android service widget flags floating

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

    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 的时间量添加限制,这样您就不会永远持有它,特别是因为您正在创建一个 float 小部件。您可以通过将最大毫秒数传递给 acquire 方法来做到这一点:

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

您可以使用 adb 查看您的应用程序正在使用哪些 WakeLocks:

adb shell dumpsys power | grep -i "package.name"

关于android - 使用android中的 float 小部件服务保持屏幕打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49545104/

相关文章:

android - 在代码中为 textview 设置样式,android

android - 如果强制关闭目标应用程序,PendingIntent 会发生什么情况?

c# - 在服务中从 C# 中的文件加载 SSRS 报告

flutter - 如何遍历 map 列表并在 flutter ListView 中显示文本小部件?

java - 如何设置 SWT 表中可见的行,包括单元格中的小部件?

android - 膨胀类 android.support.v7.app.AlertController.RecycleListView 时出错

android - 约束布局指南

winapi - 为什么我的服务在 Vista 上的 DebugBreak() 处崩溃?

python - 为什么在制作打印语句时出现 IOError : (9, 'Bad file descriptor' ) 错误?

Python 3.4,如何增加 tkinter spinbox 小部件箭头的大小?