2015-08-17 3 views
4

Google рекомендует использовать GcmListenerService вместо GcmBroadcastReceiver.Несколько слушателей GCM, использующих GcmListenerService

Создание проекта библиотеки (плагин com.android.library), который использует GCM. Он отлично работает, когда Application project (плагин com.android.application) НЕ использует GCM для своего собственного.

Когда проект приложения использует GCM для своего собственного, приемник проекта библиотеки не вызван!

Модуль библиотеки определил разрешения и приемник GCM & служебные записи в его манифесте. Модуль приложения определил его служебную запись в своем собственном манифесте.

С GcmBroadcastReceiver это могло быть возможно, так как это трансляция. Здесь было много вопросов. Не хотите использовать GcmBroadcastReceiver из-за устаревания.

Есть ли способ сделать эту работу?

Редактировать: Какая служба будет вызвана, зависит от порядка, в котором она определена в объединенном манифесте xml. Если я отменил заказ, другая Служба будет вызвана! Есть ли способ вызвать обе службы?

+0

У вас проблема? [http://stackoverflow.com/questions/17212275/register-gcm-from-a-library-project][1] [1]: http://stackoverflow.com/questions/ 17212275/register-gcm-from-an-library-project –

+0

@NT Эта ссылка связана с GCMBroadcastReceiver. Google рекомендует перейти на реализацию на основе GcmListenerService, см. [Здесь] (https://developers.google.com/cloud-messaging/android/client). Если ничего не будет, у меня не будет выбора, кроме как использовать только GCMBroadcastReceiver. – sandeepd

ответ

1

Лучшим решением было бы просто реализовать одну реализацию GcmListenerService и иметь эти сообщения для обоих.

Если вы действительно хотите иметь две реализации, сделайте одну главную реализацию, увеличив ее приоритет (see here). Затем вы можете заставить эту службу вызвать вторую, создав намерение с данными, явно установив компонент, а затем запустив другую службу.

+0

Я буду распространять свою библиотеку для публичного использования в формате AAR с помощью ProGuard.Очевидно, что служба библиотеки не будет знать, какое приложение для вызова. Кроме того, я считаю, что атрибут Priority предназначен только для Activity и Broadcast. – sandeepd

+0

Хорошо, из любопытства я попытался использовать атрибут Priority, он работал, как вы сказали. Но моя проблема все еще остается прежней, я хочу, чтобы обе службы вызывались. Позвольте мне предоставить метод для клиентского приложения, чтобы предоставить его имя службы, а затем вызвать его из моего сервиса Lib, если SenderId не принадлежит мне. Большое спасибо! – sandeepd

+0

Можете ли вы предоставить более подробную информацию? У меня такая же проблема. Основная реализация может быть внутри библиотеки? Если я реализую этот путь, приложение должно измениться для поддержки этой новой реализации? –

4

@morepork ответила правильно. Просто отвечу на это, чтобы добавить фрагмент кода.

Это, безусловно, не идеальное решение, но на данный момент я не нашел лучшего.

Это как мой код выглядит следующим образом:

@Override 
public void onMessageReceived(String from, Bundle data) { 
    if(!"MY_SENDER_ID".equals(from)) { 
     data.putString("from", from); 

     Intent intent = new Intent(); 
     intent.putExtras(data); 
     intent.setAction("com.google.android.c2dm.intent.RECEIVE"); 
     intent.setComponent(new ComponentName(getPackageName(), "my.application.packageId.MyGcmListenerService")); 

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

Необходимо убедиться, чтобы начать все Слушателей службы, определенные в объединенном манифеста, и это Слушатель, имеющий наивысший приоритет. Я знаю какое-то ограничение.

Редактировать: Просто декомпилировал класс com.google.android.gms.gcm.GcmReceiver, он не делает ничего хорошего, чем предыдущий GcmBroadcastReceiver. Просто обновите токен. Так что лучше использовать GcmBroadcastReceiver только тогда, когда вам нужно несколько обратных вызовов.

Смежные вопросы