2016-04-11 17 views
5

Tôi đang viết một ứng dụng tích hợp với SmoochCarnival. Cả hai thư viện này nhận được tin nhắn push GCM bằng cách sử dụng cách tiếp cận chuẩn để xác định một Dịch vụ Intent GCM để nhận tin nhắn.Sử dụng 2 hoặc nhiều Dịch vụ Intent GCM trong một Ứng dụng

Khi tôi chỉ sử dụng Smooch, mọi thứ đều hoạt động tuyệt vời. Khi tôi chỉ sử dụng Carnival, mọi thứ đều tuyệt vời. Vấn đề xuất hiện khi tôi cố gắng sử dụng cả hai. Những gì tôi đã tìm thấy là người nhận GCM sẽ chỉ đơn giản là bắt đầu dịch vụ đầu tiên được liệt kê trong tệp kê khai xác định mục đích com.google.android.c2dm.intent.RECEIVE.

Thực tế, tôi thấy rằng thứ tự các thư viện được liệt kê trong số build.gradle của tôi ảnh hưởng đến thứ tự các tệp kê khai của chúng được hợp nhất vào tệp kê khai ứng dụng. Vì vậy, nếu tôi đặt smooch đầu tiên, nó hoạt động (nhưng Carnival không nhận được bất cứ điều gì). Và nếu tôi đặt Carnival đầu tiên, nó hoạt động (nhưng Smooch không bao giờ nhận được bất cứ điều gì).

Làm cách nào để xử lý nhiều dịch vụ mục đích GCM khi tôi không kiểm soát một trong hai dịch vụ này? Nói chung, các ứng dụng nên xác định và quản lý nhiều dịch vụ ý định GCM như thế nào?

Trả lời

6

Lý do bạn không thể thúc đẩy làm việc trong cả Carnival và Smooch là cả hai thư viện đều đăng ký GcmListenerService của riêng họ và trong Android GcmListenerService đầu tiên được xác định trong tệp kê khai của bạn sẽ nhận tất cả thư GCM.

Tôi có một giải pháp cho bạn chủ yếu dựa tắt bài viết sau SO: Multiple GCM listeners using GcmListenerService

Giải pháp tốt nhất là nên chỉ có một thi GcmListenerService, và có xử lý này thông điệp cho cả hai.

Để chỉ định GcmListenerService của riêng bạn, hãy làm theo hướng dẫn từ Google's Cloud Messaging Documentation.

Smooch cung cấp các công cụ cần thiết để bạn vô hiệu hóa đăng ký GCM nội bộ của mình khi bạn có.

Để làm như vậy, chỉ cần gọi setGoogleCloudMessagingAutoRegistrationEnabled khi khởi tạo âu yếm:

Settings settings = new Settings("<your_app_token>"); 
settings.setGoogleCloudMessagingAutoRegistrationEnabled(false); 
Smooch.init(this, settings); 

Và trong riêng GcmRegistrationIntentService của bạn, hãy gọi Smooch.setGoogleCloudMessagingToken(token); với thẻ của bạn.

Sau khi hoàn tất, bạn sẽ có thể chuyển thông báo GCM tới bất kỳ Thiết bị thu GCM nào bạn muốn.

@Override 
public void onMessageReceived(String from, Bundle data) { 
    final String smoochNotification = data.getString("smoochNotification"); 

    if (smoochNotification != null && smoochNotification.equals("true")) { 
     data.putString("from", from); 

     Intent intent = new Intent(); 
     intent.putExtras(data); 
     intent.setAction("com.google.android.c2dm.intent.RECEIVE"); 
     intent.setComponent(new ComponentName(getPackageName(), "io.smooch.core.GcmService")); 

     GcmReceiver.startWakefulService(getApplicationContext(), intent); 
    } 
} 

EDIT

Tính đến nụ hôn phiên bản 3.2.0, bạn có thể dễ dàng hơn kích hoạt thông báo âu yếm bằng cách gọi GcmService.triggerSmoochGcm trong onMessageReceived của bạn.

@Override 
public void onMessageReceived(String from, Bundle data) { 
    final String smoochNotification = data.getString("smoochNotification"); 

    if (smoochNotification != null && smoochNotification.equals("true")) { 
     GcmService.triggerSmoochGcm(data, this); 
    } 
} 
+0

Cảm ơn, thật tuyệt khi thấy Smooch cung cấp khả năng thực hiện điều này. Thật không may tôi chắc chắn lễ hội không. Tuy nhiên, tôi có thể sử dụng cùng một cách tiếp cận và gọi 'startWakefulService' hai lần với mỗi dịch vụ và đảm bảo rằng dịch vụ chuyển tiếp ý định của tôi được liệt kê đầu tiên trong tệp kê khai. Sẽ thử điều này và cập nhật ở đây. –

+0

Tính năng này hoạt động. Tôi thực sự không cần phải vô hiệu hóa đăng ký GCM và làm của riêng tôi, bởi vì tôi đang sử dụng cùng một ID người gửi và khóa API cho cả hai dịch vụ. Ngoài ra tôi có thể sử dụng lá cờ smoochNotification để gửi tin nhắn đến đúng nơi và không chỉ gửi một cách mù quáng cho cả hai. Vì vậy, tất cả đều tốt ... Cảm ơn! –

0

Bạn đang sử dụng cả hai dưới dạng phụ thuộc gradle? Bạn sẽ phải tải xuống cả hai thư viện và sử dụng chúng làm mô-đun, có thể họ đang sử dụng cùng một dịch vụ, nếu bạn tải chúng xuống, bạn có thể thay đổi tên dịch vụ và giải quyết bất kỳ vấn đề nào có thể được corelating cả.

Tôi đoán là bạn có thể sẽ phải tạo bộ thu phát sóng GCM từ với mô-đun ứng dụng của bạn (ngay cả khi nó gọi các dịch vụ libs).

+0

Xin lỗi, tôi không hiểu câu trả lời của bạn. Tên dịch vụ không phải là vấn đề - cả hai đều có tên duy nhất. Tôi đã xem xét việc xác định dịch vụ của riêng mình để gọi hai dịch vụ kia nhưng có vẻ như đầy những vấn đề. –

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