如何开启屏幕?(关于IT技术)

6

重复警告:此问题适用于服务和前端,有一些类似的帖子,但集中在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”足够了,但一旦我删除了日志记录(因此执行速度更快),我就必须增加该值。

所以现在你面临这样一个事实,即你有“屏幕开启”功能,但它无法工作,因为某些用户会购买更快的手机;-)

无论如何,仍在寻找更好的东西...


1
你尝试过像这篇帖子中的答案吗?https://dev59.com/72025IYBdhLWcg3w76hq - Laura
@ziziana,正如我在开头所写的那样,我尝试了唤醒锁的组合——它们不能像“switchScreenOn”一样工作。它们要么被忽略,要么保持屏幕处于“开启”状态。 - greenoldman
1个回答

0
希望下面的示例能够帮助您,不要忘记释放您的唤醒锁!
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "wakelock_event_name");

wl.acquire();
 // Your Code
wl.release()

你也可以使用 // 当 - 时间 发生这种情况时 SystemClock.uptimeMillis(); pm.userActivity(when, true/false)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接