3

カウントダウンタイマーがあり、オフになると(ゼロになると)アプリにフォーカスがあるかどうかを確認します。そうでない場合は、通知バーで通知を起動します。通知をクリックすると、アプリが再度開きます。これですべて正常に機能しますが、画面がオフになった場合、タイマーは継続して通知を適切なタイミングで利用できますが、画面をオンに戻すまで実際に振動したり鳴ったりすることはありません。次に、キューなどで待機していたかのように通知を表示します。

画面がオフになったときに通知マネージャーが実際にユーザーに警告するようにするにはどうすればよいですか?

更新:タイマーを2分に設定した場合、通知が実際に機能するまでにさらに2〜3分かかります。だからそれは動作しますが、それは非常に遅れています!

コード:アプリがフォーカスを失ったときに通知サービスを設定し、MyCount1が終了すると、アプリにフォーカスがあるかどうかを確認し、フォーカスがない場合は通知を表示します。これはすべて、画面のバックライトがオンのときに機能します。それが消えると、それは信頼できません。

@Override
    public void onWindowFocusChanged(boolean hasFocus){
        if(hasFocus == false){
            mFocusFlag = false;

            ns = Context.NOTIFICATION_SERVICE;
            mNotificationManager = (NotificationManager) getSystemService(ns);
            icon = R.drawable.statusbar;
            tickerText = "Check the timer!!!";
            when = System.currentTimeMillis();
            notification = new Notification(icon, tickerText, when);
            context = getApplicationContext();
            contentTitle = "Countdown Timer";
            contentText = "Click to Check the Timer";
            notification.defaults |= Notification.DEFAULT_SOUND;
            notification.defaults |= Notification.DEFAULT_VIBRATE;
            notification.flags |= Notification.FLAG_AUTO_CANCEL;
            notificationIntent = new Intent(this, StartTimer.class);
            contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
            notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);

        }else{
            mFocusFlag = true;
        }

    }

public class MyCount1 extends CountDownTimer {
        public MyCount1(long millisInFuture, long countDownInterval) {
          super(millisInFuture, countDownInterval);
        }
        public void onFinish() {
          if(mFocusFlag == false){
              mNotificationManager.notify(HELLO_ID, notification);
          }else{
              mVib.vibrate(1000);
              }
        }
        public void onTick(long millisUntilFinished) {
            if((millisUntilFinished/1000%60) < 10){
                mTime.setText("1st Side = " + millisUntilFinished/60000 + ":0" + (millisUntilFinished / 1000)%60);
            }else{
                mTime.setText("1st Side = " + millisUntilFinished/60000 + ":" + (millisUntilFinished / 1000)%60);
            }
        }
       }
4

2 に答える 2

2

電話が他のアプリケーションによってウェイクアップされると、おそらくオフになります。たとえば、電子メールアプリケーションは定期的に新しい電子メールをチェックします。必要なときに発火するように独自のアラームを設定する必要があります。http://developer.android.com/reference/android/app/AlarmManager.html

NotificationManagerには時間の概念がありません。どういうわけかトリガーする必要があります。あなたの場合の問題は、あなたが電話を眠らせれば、それはまさにそれをするということです。アラームは特に存在するため、必要なときにデバイスをウェイクアップできます。

于 2010-11-12T22:26:28.063 に答える
2

これですべて正常に動作しますが、画面がオフになった場合、タイマーは継続し、適切なタイミングで通知を利用できますが、画面をオンに戻すまで実際に振動したり鳴ったりすることはありません. 次に、キューなどで待機していたように通知を表示します。

画面がオフになったときに通知マネージャーが実際にユーザーに警告するようにするにはどうすればよいですか?

画面がオフになると、何かが保持されていない限り、CPU はその後すぐに動作を停止しWakeLockます。

これは、次の 2 つのいずれかを意味します。

  1. あなたはこれらすべてを理解し、WakeLock. これは、ユーザーが自分のデバイスで何を好むか (たとえば、優れたバッテリ寿命) の観点からは、良い考えかもしれませんし、そうでないかもしれません。WakeLockいずれにせよ、画面を少なくとも暗く保つ、より強力な を保持する必要がある場合があります。Notification私は aで a をレイズしようとしたことがないWakeLockので、すべてのルールが何であるかはわかりません。

  2. このすべてを理解していないため、実際にはデバイスがスリープ状態になり、CPU がオフになったときにタイマーが動いていると考えています。CPU が再びオンになると、タイマーはすぐにオフになります。

を使用AlarmManagerすると、デバイスをウェイクアップするタイマーベースのイベントを実行できます。その間、コードがメモリ内でぶらぶらしている必要はありません。あなたがここで何をしようとしているのかわかりませんが (あなたの説明からは奇妙に思えます)、AlarmManagerタイマーの代わりとして調査する価値があるかもしれません。

于 2010-11-12T23:02:17.497 に答える