使用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
}
};
}
答案 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分钟)