受け入れられた答えに加えて:
このコードによってブロードキャストされるインテントは、カレンダーデータに変更が加えられたときに送信されます。
<receiver
android:name=".NativeEventChangeReceiver">
<intent-filter>
<action android:name="android.intent.action.PROVIDER_CHANGED"/>
<data android:scheme="content"/>
<data android:host="com.android.calendar"/>
</intent-filter>
</receiver>
残念ながら、デバイスの起動時、またはプロバイダーが作成され、これまでに何を読み取るためのExtraがない場合にもブロードキャストされます。
アプリがイベントインスタンスの挿入/削除のみを処理するようにするには:
イベントインスタンスの総数を追跡します(SagiLowが指摘しているように、これは追加/削除でのみ機能し、更新は考慮されません)。変更された場合は、ユーザーのカレンダーに基づいてデータを再検証します。
public class CalendarChangedReceiver extends BroadcastReceiver
{
private static final String TAG = "CalendarChangedReceiver";
@Override
public void onReceive(Context context, Intent intent) {
//Check number of instances
final SharedPreferences prefs = context.getSharedPreferences(Enums.Config.USER_CONSTANTS, Context.MODE_PRIVATE);`enter code here`
long lastTimeValidated = prefs.getLong(AppData.LONG_LAST_TIME_VALIDATED, 0);
int numRowsLastTimeValidated = prefs.getInt(AppData.INT_NUM_ROWS_LAST_TIME_VALIDATED, 0);
int numberOfInstances = getNumberOfInstances(lastTimeValidated, context);
if(numberOfInstances != numRowsLastTimeValidated) {
/* Do somethng here, for instance:
Intent serviceIntent = new Intent(context, ValidateCalendarEventsService.class);
context.startService(serviceIntent);
*/
}
}
private int getNumberOfInstances(long lastTimeValidated, Context context) {
Calendar beginTime = Calendar.getInstance();
beginTime.setTimeInMillis(lastTimeValidated);
Calendar endTime = Calendar.getInstance();
endTime.add(Calendar.YEAR, 1);
endTime.add(Calendar.DAY_OF_MONTH, 1);//now + 366
long startMillis = beginTime.getTimeInMillis();
long endMillis = endTime.getTimeInMillis();
Cursor cur = null;
ContentResolver cr = context.getContentResolver();
// Construct the query with the desired date range.
Uri.Builder builder = CalendarContract.Instances.CONTENT_URI.buildUpon();
ContentUris.appendId(builder, startMillis);
ContentUris.appendId(builder, endMillis);
// Submit the query
cur = cr.query(builder.build(), null, null, null, null);
//handle results
return cur.getCount();
}
}