0

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.

  1. 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.
  2. 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.

+0

Est-ce que vous obtenez un rappel dans votre méthode onMessageReceived lorsque vous avez glissé une liste d'applications récente? – Gautam

+0

@Gautam Non. Si j'appuie simplement sur le bouton d'accueil, le rappel est déclenché. –

+0

Voir ma réponse [ici] (http://stackoverflow.com/a/39505298/4625829) –

Répondre

1

Certains des fabricants de téléphones, par ex. XiaoMi et Huawei interdisent à l'application de s'exécuter en arrière-plan à moins que l'utilisateur ne le permette. Cela signifie que le service d'arrière-plan sera supprimé lorsque l'utilisateur essuiera ou nettoiera la RAM

Pour XiaoMi, l'utilisateur peut accorder l'accès à l'application en l'ajoutant à la liste AutoStart.

Pour Huawei, il s'appelle TelephonyManager. Vous avez des options d'affichage où vous devez ajouter votre application à la liste blanche

+0

Comment les applications comme WhatsApp et Viber obtiennent cette autorisation par défaut? Y a-t-il des API provenant des fabricants pour demander la permission de l'utilisateur? –

+0

Il est bizarre mais les applications célèbres comme WhatsApp obtiendront l'autorisation par défaut. Je passais quelques jours pour résoudre ce problème. AFAIK, il n'y a pas d'API pour laisser l'application demander la permission, car elle est très spécifique à certains fabricants –