web-dev-qa-db-ja.com

受信機/サービスから画面をオンにする

アプリで画面をオンにして、アプリを表示できるようにしたいと考えています。アラームを設定していて、毎時間、デバイスが自然にスリープする前に2分間アプリを表示したいとします。

WakeLock(FULL_LOCK)とKeyguardManagerは非推奨になっています。

WakefulBroadcastReceiverとサービスを作成しましたが、これらは機能しています。

@Override
protected void onHandleIntent(Intent intent) {
    // I need to show the screen here!

    for (int i=0; i<5; i++) {
        Log.i("SimpleWakefulReceiver", "Running service " + (i + 1)
                + "/5 @ " + SystemClock.elapsedRealtime());
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
        }
    }
    Log.i("SimpleWakefulReceiver", "Completed service @ " + 
          SystemClock.elapsedRealtime());
    SimpleWakefulReceiver.completeWakefulIntent(intent);
}

プログラムで画面をオンにし、ロックを超えて、IntentServiceからのアクティビティを表示するにはどうすればよいですか?

ありがとう

20
RuAware

このコードを使用して、画面をオンにすることができます。

_lock = ((KeyguardManager) getSystemService(Activity.KEYGUARD_SERVICE)).newKeyguardLock(KEYGUARD_SERVICE);
powerManager = ((PowerManager) getSystemService(Context.POWER_SERVICE));
wake = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG");

lock.disableKeyguard();
wake.acquire();
           getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);
_

AndroidManifest.xmlファイルで次の権限が必要です。

_<uses-permission Android:name="Android.permission.WAKE_LOCK" />
<uses-permission Android:name="Android.permission.DISABLE_KEYGUARD" />
_

編集(この1つを使用し、何もしないIS非推奨):
これを行うにはもう1つの方法があります。アクティビティを起動する必要があるためです。アクティビティonCreate()では、ウィンドウにフラグを追加する必要があります。例えば:

_   @Override
    protected void onCreate(Bundle savedInstanceState) {
      getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);`
}
_
25
Kartheek

何を言っているのかわかりませんが、wakelockは非推奨ではありません。特定のタイプはもはやGoogleが好む方法ではありませんが、通常のウェイクロックがまだあり、これを行う最も簡単な方法です。ロックを取得するときは、必ずACQUIRE_CAUSES_WAKEUPフラグを追加してください。実際、WakefulBroadcastReceiverはウェイクロックを使用して実装されていることに注意してください。

2
Gabe Sechan

このコードを使用して、画面をオンにすることができます。

private void turnScreenOn() {
    int flags = WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON;
    getWindow().addFlags(flags);
}

このコードを使用して、ウェイクロックが解除されるまでコードをオンに保つことができます。

<uses-permission Android:name="Android.permission.WAKE_LOCK" />

private PowerManager mPowerManager;
private PowerManager.WakeLock mWakeLock;

@Override
public void onCreate() {
super.onCreate();
    mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
    mWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "Service");
}

private void acquireWakeLock() {
    try {
        mWakeLock.acquire();
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}

private void releaseWakeLock() {
    try {
        mWakeLock.release();
    }
    catch (Exception e) {

    }
}
1
Bojan Kseneman