【问题标题】:Android turn on the screen安卓打开屏幕
【发布时间】:2013-04-27 00:23:30
【问题描述】:

我制作了由 AlarmManager 安排活动启动的应用程序。即使屏幕关闭并且设备被锁定,我也想出现。

要实现这一点,请设置窗口标志

final Window win = getWindow();
win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
        | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
        | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
        | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);

并尝试获取屏幕锁定

if(_lock == null)
{
    PowerManager pm = (PowerManager)App.getAppContext()
            .getSystemService(Context.POWER_SERVICE);

    _lock = pm.newWakeLock(
            PowerManager.FULL_WAKE_LOCK, "ScreenOn");
    _lock.acquire();
}

_lock 是 PowerManager.WakeLock,在 onPause 中释放

protected void onPause()
{
     if(_lock != null)
     {
          _lock.release();
     }
}

此代码在 onCreate 和 onRestart 中执行。如果活动尚未启动,一切正常。

但如果之前启动过,屏幕不会关闭。

  • 首先调用onRestart
  • 然后调用 onResume
  • 立即调用 onPause

所以活动没有启动。我的问题是如何在这种情况下打开屏幕。 (我使用的是 API 15)。

【问题讨论】:

  • 发布更多代码 - 全部。什么 - _lock 在哪里?你可能的意思是“屏幕没有打开on
  • 那么锁是一个私有静态成员吗?您确定 如果活动尚未启动,一切正常?即使电话已经响起?尝试增加初始警报时间 - 我敢打赌该活动不会起作用。当我说更多代码时,我还指的是警报器和警报器接收器-您使用的是警报器接收器吗? 再次,您的意思可能是“屏幕未打开

标签: android android-wake-lock


【解决方案1】:

我想出了解决方案。我创建了一个新活动,它将尝试打开onCreate() 中的屏幕,然后等到它打开。当屏幕正常时,它将启动应该显示的活动。为了让Android总是创建这个activity

public class TurnOnScreen extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
        if (pm.isScreenOn()) openActivity();
        else {
            registerReceiver(mScreenOnReceiver, new IntentFilter(
                    Intent.ACTION_SCREEN_ON));
            reciever_registered = true;
            turnScreenOn();
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (reciever_registered) {
            unregisterReceiver(mScreenOnReceiver);
            reciever_registered = false;
        }
    }

    private boolean reciever_registered = false;
    private final BroadcastReceiver mScreenOnReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            openActivity();
        }
    };

    private void openActivity() {
        Intent intent = new Intent();
        // ....
        finish();
    }

    private void turnScreenOn() {
        final Window win = getWindow();
        win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
        win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);
    }
}

我仍在寻找 onRestart 中没有打开屏幕的原因。

【讨论】:

  • 您应该将您的代码移动到onResume 并在onPause 上取消注册
  • 我的意思是接收器注册码 - 它应该在 onResume 并在暂停时取消注册:stackoverflow.com/questions/7887169/…
【解决方案2】:

【讨论】:

    【解决方案3】:

    只需使用您的代码:

    final Window win = getWindow();
    win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
            | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
    

    仅在 onCreate() 中,并删除所有其他 Activity-Cycle 方法,如果它们没有做任何其他事情,那么这个。

    我认为您不需要更多代码来执行它。

    【讨论】:

    • 只有第一次才能完美运行。但是当我下次将此活动置于后台时,它不会做任何事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 2011-06-28
    • 2017-03-24
    • 2011-09-08
    • 2011-06-09
    • 2013-03-29
    • 1970-01-01
    相关资源
    最近更新 更多