日历同步新事件时处理更新的最佳方式是什么?

有了ICS,我们现在有了日历的API! 🙂

我的问题是,我们如何确定事件是否已经更新。 理想情况下,这可以用BroadcastReceiver来完成,但是我不认为有一个可公开访问。 有一些事件播出,但我不认为这是非系统应用程序访问。

02-06 23:05:05.316: I/CalendarProvider2(9201): Sending notification intent: Intent { act=android.intent.action.PROVIDER_CHANGED dat=content://com.android.calendar } 02-06 23:05:05.320: W/ContentResolver(9201): Failed to get type for: content://com.android.calendar (Unknown URL content://com.android.calendar) 

这是我现在的工作。 有没有更好的办法? 如果用户看到随着时间的推移而运行的服务,他们通常会杀死它以节省电池寿命。

 public class CalendarUpdatedService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { int returnValue = super.onStartCommand(intent, flags, startId); getContentResolver().registerContentObserver( CalendarContract.Events.CONTENT_URI, true, observer); return returnValue; } @Override public IBinder onBind(Intent intent) { return null; } ContentObserver observer = new ContentObserver(new Handler()) { @Override public boolean deliverSelfNotifications() { return true; } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); //code goes here to update } }; } 

Solutions Collecting From Web of "日历同步新事件时处理更新的最佳方式是什么?"

我使用一个静态单例类(你也可以扩展应用程序)与方法注册/注销不同的提供者,如日历提供程序的多个观察员。 我把它存储在一个HashMap中,这样我就可以确定哪些观察者在以后注册了。

这是丑陋的,但似乎没有更好的解决scheme。

编辑这个接收器:

 public class CalendarChangedReceiver extends BroadcastReceiver { private static final String TAG = "CalendarChangedReceiver"; @Override public void onReceive(Context context, Intent intent) { Log.d(TAG, "calendar changed! "+intent.toUri(Intent.URI_INTENT_SCHEME)); } } 

有了这个清单声明:

 <receiver android:name=".CalendarChangedReceiver"> <intent-filter> <action android:name="android.intent.action.PROVIDER_CHANGED"/> <data android:scheme="content"/> <data android:host="com.android.calendar"/> </intent-filter> </receiver> 

将捕捉ICS中事件和日历的更改。 如果您正在使用旧的未公开日历提供程序,则唯一的解决scheme是静态类或服务中的ContentObserver。

 <intent-filter> <action android:name="android.intent.action.EVENT_REMINDER" /> <data android:scheme="content"/> <data android:host="com.android.calendar"/> </intent-filter> 

将捕获EVENT的通知(例如:事件发生前30分钟)