在 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"
我是 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"