我想写一个监听像插入,编辑事件广播接收器,删除对原生的Android日历(ICS及以上)。 因此,一旦发生这些事件中的一个应用程序应该能够在最少知道这些事件的发生。
任何一个有一个想法,如何做到这一点或任何引用链接。
我写了从广播接收器,延伸着我自己的broadcasterReceiver类。 想不通清单中的值一样,目前我有这里面是不工作:
<receiver
android:name=".NativeEventChangeReceiver">
<intent-filter>
<action android:name="android.intent.action.EDIT"/>
<action android:name="android.intent.action.INSERT"/>
<action android:name="android.intent.action.DELETE"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="vnd.android.cursor.dir/event"/>
</intent-filter>
</receiver>
干杯,
编辑1:有谁知道数据标签的正确的琴弦?我想这还需要在意向过滤器。
编辑2:关于与ContentObserver工作的任何提示?
终于找到了大量的阅读后的解决方案,这可能会帮助寻找其他类似的解决方案。
在清单中,你需要写这些线能够捕捉到的变化:
<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>
干杯,
除了公认的答案:
这段代码广播的目的是当发送任何变化日历数据进行的:
<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>
不幸的是,在设备启动,或在创建提供程序时,当它也被广播,也没有额外的阅读都没有。
为了让您的应用程序只处理事件实例的插入/缺失:
跟踪事件的实例总数(如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();
}
}