Android在屏幕上打开

Android在屏幕上打开,android,android-wake-lock,Android,Android Wake Lock,我正在创建AlarmManager计划活动启动的应用程序。即使屏幕关闭且设备锁定,我也希望出现 要实现这一点,请设置窗口标志 final Window win = getWindow(); win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); win.addFlags(WindowManager.Layou

我正在创建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();
}
_锁是PowerManager.WakeLock,在onPause中释放

protected void onPause()
{
     if(_lock != null)
     {
          _lock.release();
     }
}
此代码在onCreate和onRestart中执行。如果活动尚未启动,一切正常

但如果更早启动,屏幕不会关闭

  • 首先调用onRestart
  • 然后调用onResume
  • 立即调用onPause
因此,该活动并未启动。我的问题是在这种情况下如何打开屏幕。(我使用的是API 15)。

你听说过“明亮的绿色房间”吗?查看下面的代码,它可能就是您正在寻找的


我想出了解决办法。我创建了一个新活动,它将尝试在
onCreate()
中打开屏幕,然后等待它打开。当屏幕正常时,它将启动应显示的活动。要使Android始终创建此活动

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中屏幕没有打开。

只需使用您的代码:

final Window win = getWindow();
win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
        | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
仅在onCreate()中,删除所有其他活动周期方法,如果它们不执行任何其他操作,则执行此操作


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

你应该在
onResume
中移动你的代码,并在
onPause
中注销,我是说接收者注册代码-它应该在
onResume
中,在暂停时注销:发布更多的代码-全部。什么-锁在哪里?你的意思可能是“屏幕未打开”,所以lock是一个私有静态成员?如果活动尚未启动,您确定一切正常吗?即使手机也在休眠?尝试增加初始警报时间-我打赌该活动将不起作用。当我说更多的代码时,我指的是警报和警报接收器——你是在用警报接收器吗?再说一次,你可能是说“屏幕没有打开”,它只有在第一次工作时才完美。但是,当我下次把这个活动放到后台时,它不会做任何事情。