2013-12-11 16 views
6

Tôi có một số DashClockExtension mà đôi khi không cập nhật.Tiện ích mở rộng Dashclock không cập nhật

Đang sử dụng LocalBroadcastReceiver để cập nhật tiện ích mở rộng tương tự như http://bit.ly/1e4uMl0. Người nhận được đăng ký trong phương pháp onInitialize():

@Override 
    protected void onInitialize(boolean isReconnect) { 
     super.onInitialize(isReconnect); 

     LocalBroadcastManager broadcastMgr = LocalBroadcastManager.getInstance(this); 
     if (mDashClockReceiver != null) { 
      try { 
       broadcastMgr.unregisterReceiver(mDashClockReceiver); 
      } catch (Exception ignore) {} 
     } 
     mDashClockReceiver = new DashClockUpdateReceiver(); 
     broadcastMgr.registerReceiver(mDashClockReceiver, new IntentFilter(UPDATE_DASHCLOCK)); 
    } 

Đó là cách tôi gửi phát sóng:

public static void updateDashClock() { 
    LocalBroadcastManager.getInstance(Application.getContext()).sendBroadcast(new Intent(UPDATE_DASHCLOCK)); 
}   

Đó là BroadcastReceiver tôi:

private class DashClockUpdateReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     retrieveDataAndUpdateWidget(); 
    } 
} 

tôi nhận thấy rằng trong khi phát sóng được kích hoạt các người nhận không nhận được sự kiện đôi khi.
Tôi đã thử nghiệm nó bằng cách giết chết ứng dụng của tôi nhưng điều đó không tái tạo vấn đề vì vậy tôi đang thua lỗ tại sao điều này sẽ xảy ra.

Bất kỳ ai?

+0

Bạn có thể đăng thêm mã không. Bạn đang cố cập nhật dữ liệu chính xác như thế nào? Nếu publishUpdate không thành công, dữ liệu cũ vẫn tồn tại trừ khi bạn gọi publishUpdate (null) –

+0

Vấn đề không phải là mã cập nhật mà thực tế là chương trình phát sóng không nhận được tín hiệu phát sóng. Thông thường nó hoạt động tốt nhưng "đôi khi" nó không và tôi muốn biết tại sao và những gì tôi có thể làm để ngăn chặn điều này xảy ra. Ban đầu tôi nghĩ rằng khi ứng dụng được tắt dịch vụ sẽ không bị ràng buộc một lần nữa bởi DashClock widget chính nó và do đó BroadcastReceiver sẽ không được đăng ký nhưng đó không phải là trường hợp. Dịch vụ này bắt đầu và bị ràng buộc bởi tiện ích con tốt. –

Trả lời

1

Trong khi câu trả lời đầu tiên của tôi hoạt động, nó có một số không mong muốn tác dụng phụ. Do đó tôi đã đưa ra một giải pháp tốt hơn mà không có tác dụng phụ.

Hướng dẫn, DashClockWidget để quan sát một Uri nhất định sử dụng addWatchContentUris và sau đó khi nó là thời gian để cập nhật widget chỉ cần gọi notifyChange vào đó Uri:

public class DashClockService extends DashClockExtension { 
    private static final Uri URI_BASE = Uri.parse("content://com.myauthority"); 
    private static final String URI_PATH_SEGMENT = "dashclock/update"; 

    public static void updateWidget(Context context) { 
     ContentResolver contentResolver = context.getContentResolver(); 
     Uri uri = Uri.withAppendedPath(URI_BASE, URI_PATH_SEGMENT); 
     contentResolver.notifyChange(uri, null); 
    } 

    @Override 
    protected void onInitialize(boolean isReconnect) { 
     super.onInitialize(isReconnect); 

     removeAllWatchContentUris(); 
     Uri uri = Uri.withAppendedPath(URI_BASE, URI_PATH_SEGMENT); 
     addWatchContentUris(new String[] {uri.toString()}); 
    } 

updateWidget thể được gọi từ bất cứ nơi nào trong mã để cập nhật các widget. Quan trọng nhất là nó có thể được gọi khi ứng dụng bắt đầu, ví dụ: sau khi nó đã bị Android giết và đang khởi động lại (tôi đang gọi bản cập nhật trong Application.onCreate()).

2

Vui lòng xem cách bộ tiếp sóng phát sóng GCM được triển khai trong Google's GCM Client example.

Có thể là do application was killed by the Android OS vì nó cần thêm bộ nhớ (hoặc vì bất kỳ lý do gì) và sau đó bạn sẽ không nhận được chương trình phát sóng trong bộ thu phát sóng của mình.

Tôi hy vọng điều đó sẽ hữu ích, nếu không, vui lòng cung cấp cho chúng tôi một số nhật ký và thông tin khác.

Chúc bạn may mắn!

+0

BroadcastReceiver cần phải được đăng ký động vì nó phải là một lớp thành viên hoặc chúng tôi sẽ không thể gọi publishUpdate (ExtensionData) (một phương thức của DashClockExtension là một Dịch vụ). Xem thêm: http://stackoverflow.com/a/15571547/534471). Có BroadcastReceiver được xác định trong tệp kê khai sẽ cho phép chúng tôi nhận phát nhưng chúng tôi không thể cập nhật tiện ích vì không có cách nào để gọi publicationUpdate (ExtensionData). –

1

Sau khi chạy thử nghiệm rộng rãi, tôi có một số kết quả có thể được interessting các nhà phát triển khác quá:

  • Nó xảy ra thực sự khi ứng dụng được giết bởi Android (Tôi không chờ đợi cho Android để tắt ứng dụng nhưng giết nó bằng tay tất nhiên)
  • DashClock Widget sẽ liên kết lại dịch vụ sau một thời gian. Tôi đoán là nó liên kết các dịch vụ một lần nữa khi nó chạy cập nhật ui theo lịch trình đó là khoảng một lần một giờ (theo DashclockExtension javadoc). Tôi đã không xác nhận rằng đoán bằng cách đi qua mã nguồn mặc dù.
  • Phần mở rộng do đó sẽ cập nhật cuối cùng nhưng chỉ sau khi chu kỳ cập nhật thường xuyên đã chạy mà có thể không xảy ra trong tối đa một giờ.

Dưới đây là cách giải quyết của tôi:

  • DashClock Widget nghe ACTION_PACKAGE_CHANGED Intents (http://developer.android.com/reference/android/content/Intent.html#ACTION_PACKAGE_CHANGED) để tìm tất cả DashClockExtensions (dịch vụ với ACTION_EXTENSION lọc ý)
  • Bằng cách vô hiệu hóa và tái tạo điều kiện cho dịch vụ DashClockExtension khi tôi ứng dụng bắt đầu, tôi có thể "buộc" DashClock Widget để ràng buộc dịch vụ ngay lập tức.
  • Tôi đã thử nghiệm điều này và phải mất một vài giây sau khi ứng dụng bị giết và khởi động lại cho đến khi cập nhật tiện ích DashClock ui một lần nữa.

Đây là cách tôi vô hiệu hóa, kích hoạt dịch vụ:

configureComponent("mypackagename.DashClockService", false); // disable 
configureComponent("mypackagename.DashClockService", true); // enable 

private void configureComponent(Context context, String className, boolean enable) { 
    PackageManager pkMgr = context.getPackageManager(); 
    String packageName = context.getPackageName(); 
    ComponentName component = new ComponentName(packageName, className); 
    int newState = enable ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED; 
    pkMgr.setComponentEnabledSetting(component, newState, PackageManager.DONT_KILL_APP); 
} 
+0

Trong khi giải pháp này hoạt động cho phép và vô hiệu hóa dịch vụ có tác dụng phụ không mong muốn trên các thiết bị Samsung. Lối tắt, ví dụ: có thể mất biểu tượng tùy chỉnh và/hoặc mô tả (nó hoàn nguyên về biểu tượng và tên ứng dụng). Tuy nhiên tôi đã tìm thấy một cách tốt hơn để đáng tin cậy lại kết nối với DashClockWidget sau khi ứng dụng đã bị rơi (xem câu trả lời mới của tôi). –

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