3

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

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

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 是在 onPause 中释放的 PowerManager.WakeLock

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

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

但是,如果它较早启动,则屏幕不会关闭。

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

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

4

3 回答 3

2

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

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

于 2013-05-02T19:40:12.750 回答
1

只需使用您的代码:

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

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

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

于 2013-05-03T07:53:21.530 回答
1

你听说过“点亮的绿色房间”吗?看看下面的代码,它可能就是你要找的。

http://code.google.com/p/ch-bfh-fbi-mobicomp-2011/source/browse/ch_simplix_android_repetitive_service/src/com/androidbook/longrun/LightedGreenRoom.java?spec=svn38&r=37

于 2013-05-02T18:40:52.213 回答