2012-02-07 36 views
9

Với ICS, chúng tôi hiện có API cho Lịch! :)Cách tốt nhất để xử lý các cập nhật khi lịch đồng bộ hóa các sự kiện mới là gì?

Câu hỏi của tôi là, cách chúng tôi xác định xem sự kiện đã được cập nhật hay chưa. Lý tưởng nhất điều này có thể được thực hiện với một BroadcastReceiver, nhưng tôi không nghĩ rằng có một trong đó là công khai truy cập. Có một số sự kiện được phát sóng, nhưng tôi không nghĩ rằng nó có thể truy cập được vào các ứng dụng không thuộc hệ thống.

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) 

Đây là công việc của tôi bây giờ. Có cách nào tốt hơn? Người dùng có thể nhận được squimish nếu họ nhìn thấy một dịch vụ chạy theo thời gian và thường sẽ giết nó để tiết kiệm pin.

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

lớn việc xung quanh cho bây giờ. – Adam

+0

vì một lý do nào đó, mỗi lần tôi tạo sự kiện trong lịch, tôi được thông báo nhiều lần. tại sao nó lại xảy ra? –

Trả lời

6

tôi sử dụng một lớp singleton tĩnh (bạn cũng có thể mở rộng ứng dụng) với các phương pháp để đăng ký/unregister nhiều nhà quan sát cho các nhà cung cấp khác nhau như các nhà cung cấp lịch (s). Tôi lưu trữ điều này trong HashMap để tôi có thể xác định người quan sát nào được đăng ký sau đó.

Thật xấu xí nhưng dường như không có giải pháp nào tốt hơn.

EDIT thu này:

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)); 
    } 
} 

Với khai manifest này:

<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> 

sẽ bắt những thay đổi đến Sự kiện và Lịch trong ICS. Nếu bạn đang sử dụng nhà cung cấp lịch không có giấy tờ cũ, giải pháp duy nhất là ContentObserver (s) trong một lớp tĩnh hoặc dịch vụ.

+0

Hiện tại không có phát sóng, vì vậy tôi phải sử dụng một ContentObserver, điều đó có nghĩa là tôi phải có một dịch vụ chạy tất cả thời gian để nghe ... – runor49

+1

Bộ lọc đó sẽ bắt chương trình phát sóng bạn đã đề cập trong câu hỏi và dường như là một phương pháp mà ứng dụng lịch cổ phiếu sử dụng để cập nhật tiện ích con của nó (https://github.com/android/platform_packages_apps_calendar/blob/master/src/com/android/calendar/widget/CalendarAppWidgetService.java) xem LịchFactory lớp học. Nếu bạn sử dụng một lớp singleton tĩnh (hoặc mở rộng ứng dụng) thì bạn sẽ không phải sử dụng một dịch vụ. Điều này không nhất thiết phải tốt hơn, chỉ là một giải pháp thay thế có thể giúp người dùng giết dịch vụ của bạn. – roflharrison

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

sẽ chụp thông báo của EVENT (ví dụ: 30 phút trước khi sự kiện)

Các vấn đề liên quan