重复警告:此问题针对服务和前端,有一些类似的线程,但重点关注 GUI 方法。
Problem
从任何状态开始(背景中播放音乐、屏幕打开(原文如此!)、屏幕关闭、手机锁定、手机解锁等等)我只想更改状态中的一件事 - 打开屏幕。其他什么都不应该改变。
Attempts
要从某个已知状态开始,我锁定手机并关闭屏幕:
DevicePolicyManager dpm = (DevicePolicyManager)context
.getSystemService(Context.DEVICE_POLICY_SERVICE);
dpm.lockNow();
所以从现在开始,打开屏幕就意味着实际显示键盘保护罩。我尝试这样做:
- forcing
userActivity
——什么也没发生
- 唤醒锁的各种组合——任一唤醒都太弱(例如
PARTIAL_WAKE_LOCK
- 什么也没有发生)或者它会触发屏幕打开,但只要我保持锁定。一旦我释放它,屏幕就会回到关闭状态(尽管我有ON_AFTER_RELEASE
放);小问题是我必须在一些延迟后获取唤醒锁lockNow
因为否则lockNow
会被简单地取消
解决方法
这几乎是复制粘贴更改屏幕亮度系统设置 Android https://stackoverflow.com/questions/6708692/changing-the-screen-brightness-system-setting-android/9848456#9848456 by 安东·切尔卡辛 https://stackoverflow.com/users/1204377/anton-cherkashyn
您需要添加触发屏幕的虚假活动:
public class DummyBrightnessActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
//this next line is very important, you need to finish your activity with slight delay
new Handler().postDelayed(new Runnable() {
public void run() {
DummyBrightnessActivity.this.finish();
} },0);
}
}
接下来,您必须启动此活动(在我的情况下,它通常是非活动,因此可以选择背景):
new Handler().postDelayed(new Runnable() {
public void run() {
Intent intent = new Intent(context, DummyBrightnessActivity.class);
intent.addFlags(Intent.FLAG_FROM_BACKGROUND | Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
} },500);
并且您必须在清单中通知您的应用程序有关此虚假活动的信息:
<activity android:name=".DummyBrightnessActivity"
android:excludeFromRecents="true"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:taskAffinity="com.antonc.phone_schedule.Dummy">
</activity>
(上面——它放置在我的应用程序的主命名空间中)。
问题是它很长而且不可靠——第一个延迟(在活动中)对于 0 来说效果很好,但是第二个......不同的故事,当我做了一些日志记录“350”就足够了,但是一旦我放弃了日志记录(因此执行速度更快)我必须增加该值。
所以现在面对这样一个事实:你有“screenOn”功能,但它不起作用,因为有些用户会购买更快的手机;-)
无论如何,仍在寻找更好的东西......