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

时间:2012-02-07 04:11:58

标签: android android-4.0-ice-cream-sandwich

使用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
        }
    };

}

2 个答案:

答案 0 :(得分:6)

我使用静态单例类(您也可以扩展Application),使用方法为不同的提供程序(如日历提供程序)注册/取消注册多个观察者。我将它存储在HashMap中,以便我可以确定哪些观察者在以后注册。

这很难看,但似乎没有更好的解决方案。

EDIT 这个接收器:

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中事件和日历的更改。如果您使用的是旧的未记录的日历提供程序,则唯一的解决方案是静态类或服务中的ContentObserver。

答案 1 :(得分:0)

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

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