У меня возникла проблема с моей реализацией GCM на Android, min SDK 15. Я отлично могу получать push-уведомления от GCM, а моя реализация GcmListenerService
функционирует onMessageReceived(...)
callback. Моя проблема, однако, в том, что всякий раз, когда кто-то выполняет прием, он заставляет приложение на передний план!Android GcmReceiver/GcmListenerService Принудительное приложение для Foreground при получении
Ожидаемое поведение: я могу получать эти push-уведомления по мере их поступления, независимо от того, находится ли приложение в фоновом режиме, а затем создать уведомление в лотке, который запускает действие, если это потребует полезная нагрузка.
Поток, который вызывает проблему, это (физическое устройство, Motorola Razr M xt907):
1. Запустить приложение. Ключ устройства проверяется с помощью экземпляра GCM.
2. Нажмите «Домой» на Android.
3. Нажмите кнопку «Последние приложения»; удалите приложение; подождите несколько секунд
4. Вручную отправить уведомление толчок к устройству через GCM
5. Применение получает уведомление, а само приложение силы обратно на первый план
Если это поможет, я бросил главное приложение и приемники на отдельные процессы, чтобы получить представление о том, что на самом деле происходит в фоновом режиме, и усеченный вариант это ниже:
NotificationsProcess I/MultiDex﹕ VM with version 1.6.0 does not have multidex support
NotificationsProcess I/MultiDex﹕ install
NotificationsProcess I/MultiDex﹕ MultiDexExtractor.load(/data/app/com.MyApp.MyAppmobile.alpha-1.apk, false)
NotificationsProcess I/MultiDex﹕ loading existing secondary dex files
NotificationsProcess I/MultiDex﹕ load found 1 secondary dex files
NotificationsProcess I/MultiDex﹕ install done
...
[... Main Application Code ... ]
...
PrivateProcess I/MultiDex﹕ VM with version 1.6.0 does not have multidex support
PrivateProcess I/MultiDex﹕ install
PrivateProcess I/MultiDex﹕ MultiDexExtractor.load(/data/app/com.MyApp.MyAppmobile.alpha-1.apk, false)
PrivateProcess I/MultiDex﹕ loading existing secondary dex files
PrivateProcess I/MultiDex﹕ load found 1 secondary dex files
PrivateProcess I/MultiDex﹕ install done
NotificationsProcess D/MyApp﹕ Network is connected via WIFI
NotificationsProcess D/MyApp﹕ Executing networkWentOnline() callbacks
NotificationsProcess D/MyApp﹕ Successfully connected to GoogleApiServices for Location Awareness.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
GcmListenerService finally comes alive
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
NotificationsProcess D/GCMMessageHandler﹕ From: 149994375514
NotificationsProcess D/GCMMessageHandler﹕ Message: null
NotificationsProcess D/GCMMessageHandler﹕ Data: Bundle[{gcm.notification.body=Hey there dude, I like text =), collapse_key=com.MyApp.MyAppmobile.alpha}]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
GcmListenerService is finished
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
NotificationsProcess D/MyApp﹕ [... Main Application Code ... ]
NotificationsProcess D/MyApp﹕ [... Main Application Code ... ]
PrivateProcess D/MyApp﹕ [... Main Application Code ... ]
PrivateProcess D/MyApp﹕ [... Main Application Code ... ]
PrivateProcess D/MyApp﹕ [... Main Application Code ... ]
PrivateProcess D/MyApp﹕ [... Main Application Code ... ]
PrivateProcess D/MyApp﹕ [... Main Application Code ... ]
PrivateProcess V/TDCollateJSON﹕ SQLite3 handle is 1417181168
PrivateProcess D/MyApp﹕ [... Main Application Code ... ]
PrivateProcess D/MyApp﹕ [... Main Application Code ... ]
PrivateProcess D/MyApp﹕ [... Main Application Code ... ]
PrivateProcess D/MyApp﹕ [... Main Application Code ... ]
PrivateProcess D/MyApp﹕ [... Main Application Code ... ]
Моего Android манифест установка как таковые, со следующими пунктами найденных под главными <application>
тег:
<receiver
android:name="com.google.android.gms.gcm.GcmReceiver"
android:process="NotificationsProcess"
android:exported="true"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter
android:process="NotificationsProcess">
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
</intent-filter>
</receiver>
<service
android:name=".GCMMessageHandler"
android:process="NotificationsProcess"
android:exported="false">
<intent-filter
android:process="NotificationsProcess">
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
</intent-filter>
</service>
<service
android:name=".GCMInstanceIDListenerService"
android:process="NotificationsProcess"
android:exported="false">
<intent-filter
android:process="NotificationsProcess">
<action android:name="com.google.android.gms.iid.InstanceID"/>
</intent-filter>
</service>
<service
android:name=".RegistrationIntentService"
android:process="NotificationsProcess"
android:exported="false">
</service>
[... Other app activities ...]
<activity
android:name=".activities.SyncActivity"
android:label="@string/app_name"
android:theme="@style/Theme.AppCompat.NoActionBar"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
У меня отличное чувство, что это простая проблема, но я не удивлюсь, если это будет гораздо более тонкая проблема. Если я могу предложить больше вывода приложений, пожалуйста, дайте мне знать!
Любые опыт, мудрость или пути, чтобы попробовать для этого, очень признательны!
EDIT:
Я в том числе реализацию GcmListenerService. Обратите внимание, что единственное, что я делаю, это на самом деле создать уведомление и опубликовать его. С no взаимодействие с пользователем, приложение просто выходит на передний план - нет крана, нет салфетки, только poof переднего плана.
@Override
public void onMessageReceived(String from, Bundle data) {
String message = data.getString("gcm.notification.body");
Log.d("GCMMessageHandler", "From: " + from);
Log.d("GCMMessageHandler", "Message: " + message);
MyApp.WAS_STARTED_FROM_NOTIFICATION = true;
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_launcher)
.setContentTitle("Hello from MyApp")
.setContentText(message);
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(MY_APP_NOTIFICATION_ID, mBuilder.build());
}
Canyou разместить код для класса, который»... создайте уведомление в лотке, в котором начинается действие, если требуется его полезная нагрузка ... ». Мое первое предположение заключается в том, что вы не используете ожидающее намерения при создании уведомления в лотке – petey
Лучше, если вы разместите свой gcmlistenerservice, где будете обрабатывать сообщение gcm. Я написал много приложений, но я не видел такого поведения, и нет необходимости запускать его в другом процессе. – 7383
@petey Спасибо за комментарии! Я добавил экземпляр GcmListenerService к основному сообщению. –