0

以前に回答があった場合は申し訳ありませんが、どこを見ても適切な解決策が得られませんでした

AlarmManager を使用して、毎日午前 9 時に自動的に通知を送信していますが、エミュレータで実行しようとすると、毎日午前 9 時に 1 回だけではなく、30 分ごと (正確には 31 ~ 32 分) にすぐに実行されます。

理由はありますか?助けていただければ幸いです。

コードは次のとおりです。

public class Home extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_bsheet);

    notificationAlert(savedInstanceState);

}

    private void notificationAlert(Bundle savedInstanceState) {

    AlarmManager manager;
    PendingIntent pendingIntent;
    Intent intent=new Intent(Home.this, Notify.class);
    manager=(AlarmManager)getSystemService(ALARM_SERVICE);
    pendingIntent=PendingIntent.getService(Home.this,
            0, intent, 0);
    GregorianCalendar gcal = new GregorianCalendar();
    gcal.set(Calendar.HOUR_OF_DAY, 9);
    gcal.set(Calendar.MINUTE, 0);
    gcal.set(Calendar.SECOND, 0);
    gcal.set(Calendar.MILLISECOND, 0);

    long initTime = gcal.getTimeInMillis();

    manager.setRepeating(AlarmManager.RTC_WAKEUP, initTime,
            24*60*60*1000, pendingIntent);
}

}

乾杯、

編集:私の意図は、アプリがインストールされると、午前 9 時にこのアラームを起動することです。私は onCreate にアラームを入れたので、アプリを起動するたびにアラームが作成されているだけで、アプリを非表示にすると何か奇妙なことが起こっているのかどうかはわかりません...再び洞察をいただければ幸いです!

4

2 に答える 2

0
manager.setRepeating(AlarmManager.RTC_WAKEUP, initTime, 24*60*60*1000, pendingIntent);

次の場合、アラーム マネージャはただちに起動します。initTime < System.currentTimeMillis()

ドキュメントから

時刻が過去に発生した場合、アラームはすぐにトリガーされ、トリガー時刻が繰り返し間隔に対してどれだけ過去にあるかに応じてアラーム数が決まります。

あなたが提供したコードによると、Today 9.00gcal.getTimeInMillis()に対応するミリ秒を返します。したがって、この時間以降にコードを実行しようとすると、initTimeは現在のシステム時間よりも短くなり、AlarmManager の即時実行がトリガーされます。

これを修正するには、たとえば、カレンダーに 1 日を追加してから、その日gcal.getTimeInMillis()が既に過ぎている場合は、明日の朝に実行できるように明日 9.00を指すようにします。

アップデート1

このようなコードを試してみたところ、期待どおりに機能しました-10秒ごとにサービスを起動しました:

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    initManager();
}
private void initManager() {
    AlarmManager manager;
    PendingIntent pendingIntent;
    Intent intent = new Intent(this, NotifyService.class);
    manager=(AlarmManager)getSystemService(ALARM_SERVICE);
    pendingIntent=PendingIntent.getService(this, 0, intent, 0);

    long initTime = System.currentTimeMillis() + 5000;

    manager.setRepeating(AlarmManager.RTC_WAKEUP, initTime,
            10*1000, pendingIntent);        
}

ただし、別のオプションを使用できます。AlarmManager.set()メソッドがあります。このように起動できます

long runTime = /* your calendar time + 24 hours in millis*/
manager.set(AlarmManager.RTC_WAKEUP, runTime, pendingIntent);       

でサービスを起動しますrunTime。そして、サービスで、runTime別の日に再計算された同じメソッドを呼び出すので、次のようになります。

public MainActivity extends Activity{

    protected onCreate(Bundle bundle){
        ....
        initManager();
    }

    private initManager(){
        ...
        long runTime = /* time of your first alarm/notification/whatever you develope */

        Intent intent = new Intent(this, NotifyService.class);
        pendingIntent=PendingIntent.getService(this, 0, intent, 0);
        manager.set(AlarmManager.RTC_WAKEUP, runTime, pendingIntent);
    }
}

そしてサービス:

public NotifyService extends Service{
    ...
    public int onStartCommand(...){
         ...
        /* do stuff */

        Intent intent = new Intent(getApplicationContext(), NotifyService.class);
        pendingIntent=PendingIntent.getService(this, 0, intent, 0);
        long runTime = /* recalculate it according to the next time of firing this service*/
        manager.set(AlarmManager.RTC_WAKEUP, runTime, pendingIntent);

    }

}

したがって、サービスは、サービスが起動するたびに AlarmManager 自体にインテントを登録します。

于 2013-07-18T13:07:24.280 に答える