3

アクティビティの起動が 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 は onPause で解放される PowerManager.WakeLock です。

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

このコードは onCreate と onRestart で実行されます。アクティビティがまだ開始されていない場合は、すべて正常に機能します。

ただし、以前に起動した場合、画面はオフになりません。

  • onRestart が最初に呼び出されます
  • 次に onResume が呼び出されます
  • onPause はすぐに呼び出されます

したがって、アクティビティは開始されません。私の質問は、そのような状況で画面をオンにする方法です。(私はAPI 15を使用しています)。

4

3 に答える 3

2

私は解決策を思いつきました。画面をオンにして、オンになる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で画面がオンにならない理由の説明をまだ探しています。

于 2013-05-02T19:40:12.750 に答える
1

「The Lighted Green Room」をご存知ですか?以下のコードをチェックしてください。探しているものかもしれません。

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 に答える