Dans une application de messagerie instantanée/messagerie instantanée, je devais implémenter GCM afin d'envoyer des notifications lorsque le périphérique était en veille ou que mon service n'était pas en cours d'exécution. Tout fonctionne bien jusqu'à ce que je glisse fermer l'application ou effacer la mémoire de mon appareil Android. Après cela, mon service ne démarre pas et GCMListener ne se fait plus virer.Android GCM non reçu lorsque la mémoire RAM est effacée
J'ai lu presque toutes les questions et réponses sur le débordement de pile concernant ce problème mais aucune solution trouvée pour le moment.
simplifié Android.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.app">
<uses-sdk android:minSdkVersion="15" />
<supports-screens
android:largeScreens="true"
android:normalScreens="true"
android:resizeable="true"
android:smallScreens="true"
android:xlargeScreens="true" />
<uses-feature
android:name="android.hardware.telephony"
android:required="false" />
<uses-feature
android:name="android.hardware.touchscreen"
android:required="false" />
<uses-feature
android:name="android.hardware.wifi"
android:required="true" />
<uses-feature
android:name="android.hardware.sip.voip"
android:required="false" />
<uses-feature
android:name="android.hardware.microphone"
android:required="true" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<permission
android:name="com.example.app.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="com.example.app.permission.C2D_MESSAGE" />
<application
android:name="com.example.app.activity.MyApplication"
android:allowBackup="true"
android:hardwareAccelerated="true"
android:icon="@drawable/logo"
android:label="@string/app_name"
android:largeHeap="true"
android:logo="@drawable/logo"
android:theme="@style/AppTheme">
.... activity and other stuffs
<receiver
android:name="com.google.android.gms.gcm.GcmReceiver"
android:exported="true"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="com.example.app" />
</intent-filter>
</receiver>
<service
android:name="com.example.app.gcm.PushMessageReceiver"
android:exported="false" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
</intent-filter>
</service>
<service
android:name="com.example.app.gcm.GCMInstanceIDListenerService"
android:exported="false">
<intent-filter>
<action android:name="com.google.android.gms.iid.InstanceID" />
</intent-filter>
</service>
<service
android:name="com.example.app.gcm.RegistrationIntentService"
android:exported="false">
</service>
</application>
</manifest>
GCMListenerService
public class PushMessageReceiver extends GcmListenerService {
@Override
public void onMessageReceived(String from, Bundle data) {
Intent intent = new Intent(this, MyService.class);
intent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
intent.replaceExtras(data);
startService(intent);
}
}
}
je suis l'erreur suivante dans logcat -
05-11 14:47:59.278 23984-23984/? W/GCM-DMM: broadcast intent callback: result=CANCELLED forIntent { act=com.google.android.c2dm.intent.RECEIVE flg=0x10000000 pkg=com.example.app (has extras) }
J'ai en fait deux questions.
- Pourquoi mon service START_STICKY ne redémarre pas après un nettoyage de la mémoire dans un périphérique tel que miui et huawei.
- Après nettoyage de la mémoire ou après quelques heures, mon GCMListener ne se déclenche plus. Mais je suis sûr que je reçois GCM du serveur comme je vois cette erreur sur Logcat. Comment faire pour que mon GCMListener tire?
Toute suggestion sera vraiment utile.
Merci
Note: Mon application reçoit GCM si l'application en arrière-plan ou forground (maison pressée). Mais ne pas obtenir lorsque vous avez fermé l'application récente et effacer la mémoire. Je ne force pas la fermeture de mon application. Juste effacer la RAM.
Est-ce que vous obtenez un rappel dans votre méthode onMessageReceived lorsque vous avez glissé une liste d'applications récente? – Gautam
@Gautam Non. Si j'appuie simplement sur le bouton d'accueil, le rappel est déclenché. –
Voir ma réponse [ici] (http://stackoverflow.com/a/39505298/4625829) –