使用android

时间:2018-03-28 22:20:31

标签: android service widget flags floating

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

1 个答案:

答案 0 :(得分:1)

您应该只在有时只在屏幕上的活动中使用FLAG_KEEP_SCREEN_ON。相反,您需要使用WakeLock来保持屏幕亮度达到全亮或部分亮度。

首先,您需要声明权限:

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

然后,您需要使用WakeLock获取PowerManager,并确保发布。释放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);

您可以使用WakeLocks查看您的应用使用的adb

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