7

特定の時間に実行するようにスケジュールしたアラームを登録しますが、スケジュールされたリストのサイズによっては、多くのアラームが発生する可能性があります。しかし、私には不明な点が2つあります。

1)登録した保留中のインテントをOSに照会するにはどうすればよいですか?テストのためにこれが必要です。私が欲しいものの疑似コードは次のようになります:

List<PendingIntent> intentsInOS = context.getAllPendingIntentsOfType(AppConstants.INTENT_ALARM_SCHEDULE));

2)作成する保留中のインテントを確認し、アクションと追加データ(スケジュールID)を提供します。

private Intent getSchedeuleIntent(Integer id) {

    Intent intent = new Intent(AppConstants.INTENT_ALARM_SCHEDULE);
    intent.putExtra(AppConstants.INTENT_ALARM_SCHEDULE_EXTRA, id);

    return intent;
}

ただし、インテントにはFLAG_CANCEL_CURRENTがあるとも言います。同じアクションで保留中のすべてのインテントをキャンセルしますか、それとも同じアクションと追加データの両方をキャンセルする必要がありますか?

PendingIntent pendingIntent = PendingIntent.getBroadcast(context.getApplicationContext(), 0, getSchedeuleIntent(schedule.id), PendingIntent.FLAG_CANCEL_CURRENT);

私のコード

@Override
public void run() {

    List<ScheduledLocation> schedules = dbManager.getScheduledLocations();
    if(schedules == null || schedules.isEmpty()){
        return;
    }

    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    //alarmManager.

    // we need to get the number of milliseconds from current time till next hour:minute the next day.
    for(ScheduledLocation schedule : schedules){

        long triggerAtMillis = DateUtils.millisecondsBetweenNowAndNext(now, schedule.hour, schedule.minute, schedule.day);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context.getApplicationContext(), 0, getSchedeuleIntent(schedule.id), PendingIntent.FLAG_CANCEL_CURRENT);

        alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtMillis, MILLISECONDS_IN_WEEK, pendingIntent);
    }

    // List<PendingIntent> intentsInOS = context.getAllPendingIntentsOfType(AppConstants.INTENT_ALARM_SCHEDULE));

}


private Intent getSchedeuleIntent(Integer id) {

    Intent intent = new Intent(AppConstants.INTENT_ALARM_SCHEDULE);
    intent.putExtra(AppConstants.INTENT_ALARM_SCHEDULE_EXTRA, id);

    return intent;
}
4

1 に答える 1

9

1登録した保留中のインテントをOSに照会するにはどうすればよいですか?

できるかどうかはわかりませんが、特定のものPendingIntentが登録されているかどうかを確認できます。

private boolean checkIfPendingIntentIsRegistered() {
    Intent intent = new Intent(context, RingReceiver.class);
    // Build the exact same pending intent you want to check.
    // Everything has to match except extras.
    return (PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_NO_CREATE) != null);
}

2同じアクションで保留中のすべてのインテントをキャンセルしますか、それとも同じアクションと追加データの両方をキャンセルする必要がありますか?

PendingIntent等しくなるように解決されたすべてをキャンセルします。

等しいとはどういう意味ですか?

androidのjavadocには次のように書かれています。

インテント解決(フィルタリング)の目的で、2つのインテントが同じであるかどうかを判別します。つまり、アクション、データ、タイプ、クラス、およびカテゴリが同じである場合です。これは、インテントに含まれる追加のデータを比較しません。

ここで7391行で読むことができます:https ://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/content/Intent.java

要約すると、PendingIntent余分なものを除いてまったく同じように構築されたものはすべてキャンセルされます。

于 2012-11-08T15:45:13.640 に答える