7

私はこれを達成したいと思います:

アプリケーションを最初にオンにした後、特定の条件が真である場合、ユーザーは毎日午後2時に通知を受け取ります。条件がfalseの場合、この日は通知を表示しません。状態は午後2時にチェックされ、インターネットからいくつかのデータをダウンロードします。

これまで、24時間間隔でAlarmManagerとそのメソッドsetRepeating()を使用しました。AlarmManagerはサービスを起動します。このサービスでは、データをダウンロードし、条件を確認し、それが真であるかどうかを確認します-通知を表示します。ダウンロードは5秒以上続く可能性があるandroid:process=":background"ため、UIをブロックせずに別のプロセスで実行するために、このサービスを宣言しました。

このアプローチには2つの欠点があります。


1:ユーザーがアプリケーションを開いた場合(たとえば午後4時に)(条件が真の場合)、ユーザーはすぐに通知を受け取ります。setRepeating()ドキュメントから:

過去の時間が発生した場合、アラームはすぐにトリガーされます。アラームカウントは、過去のトリガー時間が繰り返し間隔に対してどれだけ離れているかに応じて異なります。

そのユーザーには、この日は通知を受け取らず、翌日だけを受け取るようにしたいと思います。


2:ユーザーが電話をオフにした後、通知が表示されないのではないかと心配しています。AlarmManagerのドキュメントから:

登録されたアラームは、デバイスがスリープしている間は保持されます(また、その間にデバイスがオフになった場合は、オプションでデバイスをウェイクアップできます)が、オフにして再起動するとクリアされます。

それを常に機能させることが可能かどうかはわかりません。


それをより良くする方法について何かアイデアがあれば、大歓迎です。

4

1 に答える 1

6

1:あなたの質問を理解したかどうかはよくわかりませんが、あなたがしなければならないのは、すでに午後2時を過ぎている場合は、午後2時に1日を追加することだけだと思います。

GregorianCalendar twopm = new GregorianCalendar();
twopm.set(GregorianCalendar.HOUR_OF_DAY, 14);
twopm.set(GregorianCalendar.MINUTE, 0);
twopm.set(GregorianCalendar.SECOND, 0);
twopm.set(GregorianCalendar.MILLISECOND, 0);
if(twopm.before(new GregorianCalendar())){
    twopm.add(GregorianCalendar.DAY_OF_MONTH, 1);
}
alarmManager.setRepeating(type, twopm.getTimeInMillis(), 1000*60*60*24, intent);

2:BroadcastReceiverを起動用に登録し、そこでアラームを再開できます。これを見てください:起動時のAndroidBroadcastReceiver-アクティビティがバックグラウンドにあるときに実行を続けます

于 2012-08-25T21:10:55.820 に答える