【问题标题】:How to turn the screen on?如何打开屏幕?
【发布时间】:2012-09-27 10:55:30
【问题描述】:

重复警告:此问题适用于服务和前端,有一些类似的线程,但侧重于 GUI 方法。

问题

从任何状态开始(音乐在后台播放、屏幕打开(原文如此!)、屏幕关闭、手机锁定、手机解锁等)我只想更改状态中的一件事——转屏幕上。其他都不应改变。

尝试

要从某个已知状态开始,我会锁定手机并关闭屏幕:

DevicePolicyManager dpm = (DevicePolicyManager)context
                .getSystemService(Context.DEVICE_POLICY_SERVICE);
dpm.lockNow();

所以从现在开始,打开屏幕将意味着实际显示键盘保护。我尝试这样做:

  • 强制userActivity -- 什么也没有发生
  • 唤醒锁的各种组合——唤醒太弱(如PARTIAL_WAKE_LOCK——什么都没有发生)或者它触发屏幕,但只要我保持锁定。一旦我释放它,屏幕就会回到关闭状态(尽管我设置了ON_AFTER_RELEASE);小问题是我必须在lockNow 之后延迟一些时间来获取唤醒锁,否则lockNow 将被简单地取消

解决方法

这几乎是 Anton CherkashynChanging the Screen Brightness System Setting Android的复制粘贴

您需要添加触发屏幕的虚假活动:

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”功能的事实,但它不起作用,因为有些用户会购买更快的手机;-)

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

【问题讨论】:

  • 你试过类似这篇文章的答案吗? stackoverflow.com/questions/5712849/…
  • @ziziana,正如我在开头所写的,我尝试了唤醒锁的组合——它们不能作为“switchScreenOn”工作。它们要么被忽略,要么让屏幕保持“开启”状态。

标签: android screen


【解决方案1】:

希望下面的示例对您有所帮助,不要忘记释放您的唤醒锁!

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()

你也可以使用 // when - time when 这发生 SystemClock.uptimeMillis(); pm.userActivity(何时, true/false)

【讨论】:

    猜你喜欢
    • 2013-07-25
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多