【问题标题】:Keep the screen turned on using a floating widget service in android使用 android 中的浮动小部件服务保持屏幕打开
【发布时间】:2018-03-28 22:20:31
【问题描述】:

我是 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);

【问题讨论】:

    标签: android service widget flags floating


    【解决方案1】:

    您应该只在有时只会出现在屏幕上的 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"
    

    【讨论】:

    • 谢谢,它成功了。你拯救了这一天。但 SCREEN_BRIGHT_WAKE_LOCK 自 API 13 起已弃用,建议改用 FLAG_KEEP_SCREEN_ON。如果我不能在服务上使用它,那么还有其他方法可以做到这一点吗?
    • 他们建议仅将标志与活动一起使用,因为它们仅有时出现在屏幕上,因此当用户不使用您的应用程序时,您不会冒险浪费用户的电池,所以这是万无一失的。不幸的是,这不是您的用例。即使他们没有看您的应用,您也希望屏幕亮起,因此您必须直接使用 WakeLocks。
    猜你喜欢
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    相关资源
    最近更新 更多