重复警告:此问题适用于服务和前端,有一些类似的帖子,但集中在GUI方法上。
问题
从任何状态开始(背景音乐播放,屏幕开启(sic!),屏幕关闭,手机锁定,手机解锁等),我想要改变状态中的一个事物-打开屏幕。不应更改其他任何内容。
尝试
为了从某个已知状态开始,我锁定手机并关闭屏幕:
DevicePolicyManager dpm = (DevicePolicyManager)context
.getSystemService(Context.DEVICE_POLICY_SERVICE);
dpm.lockNow();
从现在开始,开启屏幕将意味着实际上显示锁屏。我尝试使用以下方式实现:
- 强制
userActivity
-- 没有任何反应 - 使用不同的唤醒锁组合 -- 要么唤醒太微弱(例如
PARTIAL_WAKE_LOCK
-- 没有任何反应),要么触发了打开屏幕,但只要我保持锁定,在我释放锁定后屏幕就会回到关闭状态(即使我设置了ON_AFTER_RELEASE
);其中一个小问题是我必须在lockNow
后稍加延迟才能获取唤醒锁,因为否则lockNow
将被简单地取消
解决方法
这几乎是从 Changing the Screen Brightness System Setting Android by 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”足够了,但一旦我删除了日志记录(因此执行速度更快),我就必须增加该值。
所以现在你面临这样一个事实,即你有“屏幕开启”功能,但它无法工作,因为某些用户会购买更快的手机;-)
无论如何,仍在寻找更好的东西...