12

アララム(RTC_WAKEUPタイプ)によってトリガーされるBroadcastReceiverからアクティビティを開始します。そのアクティビティのonCreateで、これらのフラグを追加します

getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
    WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON |
    WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON        
);

問題は、画面がオンにならない場合があることです(約10%の場合)。アラームは正しくトリガーされます(ここでは通知の音が受信者のonReceive()でも鳴ります)。その後、電話の電源ボタンを押すと、画面がオンになり、アクティビティが表示され、すぐにオフになります。つまり、電源ボタンはうまく機能します。これはandroid 2.3.7で発生し、これがonReceive()メソッドです。

@Override
public void onReceive(Context context, Intent intent) {
    m_Context = context;

    Bundle extras = intent.getExtras();
    final int id = extras.getInt("timer_id");

    Intent activityIntent = new Intent(m_Context, MyActivity.class);
    activityIntent.putExtra("timer_id", id);
    activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    m_Context.startActivity(activityIntent);

    // and now load the alarm sound and play it for the desired time
    showFinishedNotification();
}

PowerManagerの使用は許可が必要であり、フラグが推奨される方法であるため、使用を避けたいと思います。

何が問題になる可能性がありますか?logcatは問題を示していません...

4

6 に答える 6

11

このトピックに関する私の経験と研究から:

  • FLAG_TURN_SCREEN_ONを使用して、アプリケーションで画面のオンとオフを複数回切り替えることはできません。

  • FLAG_TURN_SCREEN_ONは、新しいアクティビティを作成するとき(できれば onCreate() メソッドで)、またはビューを再作成するときに、画面をオンにするために 1 回だけ使用できます

現在、次の方法でこの制限を回避できます。

  • 新しいアクティビティを起動してフラグを設定し、(ユーザーまたはプログラムによって) アクティビティを終了して画面をオフにします。
  • params.screenBrightnessパラメータをできるだけ「暗い」に設定すると、画面が「オフ」に見えることがあります。次に、明るさを上げて画面を「オン」にすることができます。ただし、画面はまだ暗いが表示されているため、これは機能しないことが多く、ユーザーが電話をロックしている場合も機能しません。
  • Power Manager Wakelockの使用(これは引き続き機能しますが、Android ではこの機能が非推奨になっているため、この手法の使用は推奨されていません)。ただし、私が知る限り、これがアプリケーションで画面を確実にオン/オフできる唯一の方法です。

これらはどれも理想的ではありません (実際、ハックのように感じます) が、アプリケーションのニーズにより適したものを使用してください。

ここでもっと読むことができます:

于 2016-05-16T20:09:41.067 に答える
4

問題は、時々 (約 10% のケース) 画面がオンにならないことです。

推測する必要がある場合は、アクティビティが開始される前に、デバイスがスリープ状態に戻っています。onReceive()戻ると、デバイスはスリープ状態に戻る可能性があり、スリープ状態に戻ります。アクティビティが開始されるまでには、しばらく時間がonReceive()かかります。

これと同じシナリオですが、 をに置き換えstartActivity()startService()、 を記述しなければならなかった理由です。WakefulIntentServiceWakeLockWakeLock

于 2012-03-31T17:35:42.380 に答える