2016-03-19 16 views
2

Ich muss einige benutzerdefinierte Push-Benachrichtigungen erstellen und anzeigen (müssen einige Daten weitergeben und öffnen bestimmte Aktivitäten, wenn Sie darauf klicken) in meiner Anwendung. Ich habe alles wie beschrieben here getan.Warum wird mein GcmListenerService.onMessageReceived nicht aufgerufen, wenn App nicht ausgeführt wird?

Wenn die Anwendung läuft, funktioniert alles wie erwartet. Aber wenn es im Hintergrund ist, wird mein Dienst nicht gestartet und ich bekomme eine Push-Benachrichtigung, die mich zum Startbildschirm der App bringt.

Ich recherchierte viel, fand aber keine Erklärung für dieses Verhalten. Kann mir bitte jemand sagen, warum mein Service ignoriert wird, wenn die Anwendung im Hintergrund läuft?

Dies ist in meiner Manifest-Datei:

<permission 
    android:name="com.locdel.permission.C2D_MESSAGE" 
    android:protectionLevel="signature" /> 

<uses-permission android:name="com.locdel.permission.C2D_MESSAGE" /> 
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 

...................... 

<application 
    android:name=".LocdelApplication" 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 

    <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.locdel" /> 
     </intent-filter> 
    </receiver> 

    <service 
     android:name="com.locdel.gcm.LocdelGcmListenerService" 
     android:exported="false"> 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
     </intent-filter> 
    </service> 
    <service 
     android:name="com.locdel.gcm.LocdelIDListenerService" 
     android:exported="false"> 
     <intent-filter> 
      <action android:name="com.google.android.gms.iid.InstanceID" /> 
     </intent-filter> 
    </service> 
    <service 
     android:name=".gcm.RegistrationIntentService" 
     android:exported="false" > 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
     </intent-filter> 
    </service> 

....................... 

Ich habe sogar versucht, meine eigenen wakeful Rundfunkempfänger zu erweitern und Service explizit starten. Dies ist OnReceive Methode des benutzerdefinierten Empfänger, die eigentlich genannt wird, aber der Service war wieder nicht gestartet:

@Override 
public void onReceive(Context context, Intent intent) { 
    Intent serviceIntent = new Intent(context, LocdelGcmListenerService.class); 
    serviceIntent.setAction("com.google.android.c2dm.intent.RECEIVE"); 
    serviceIntent.putExtras(intent.getExtras()); 
    startWakefulService(context, serviceIntent); 
    setResultCode(Activity.RESULT_OK); 
} 
+0

Hallo, Können Sie zeigen, wie Sie den Dienst in Ihrer manifest.xml und den Code des Dienstes auch erklärt haben? –

+0

Meine Frage wurde aktualisiert. Code im Service ist eigentlich egal. Ich habe die Methode onMessageReceived überschrieben und einige Logs dort eingefügt. Daher weiß ich, dass der Dienst überhaupt nicht gestartet wurde. – shift66

+0

Welche Berechtigungen haben Sie in der Manifestdatei angegeben? – AndiM

Antwort

0

müssen Sie prüfen, ob Aktivität ausgeführt wird oder nicht, wenn eine messsage wie auf diese Weise

erhielt
ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 
    List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1); 
    ComponentName componentInfo = taskInfo.get(0).topActivity; 
    if(componentInfo.getPackageName().equalsIgnoreCase("com.example.myapp")){ 

     updateMyActivity(message); //send broadcast to notify app 



     //Activity Running 
//   Send a broadcast with the intent-filter which you register in your activity 
//   where you want to have the updates 
     } 
     else{ 
      //Activity Not Running 
      //Generate Notification 
      sendNotification(message); 
     } 
+0

Wo? Das Problem ist, dass die Nachricht NICHT empfangen wird. – shift66

+0

@ shift66 Ich bin ein bisschen unklar ist onReceived aufgerufen, wenn die Anwendung im Hintergrund ist oder nicht? –

+0

Ja, onReceive von BroadcastReceiver wird aufgerufen und ich starte sogar manuell den Dienst dort, es ist aus irgendeinem Grund nicht gestartet – shift66

0

Versuch Benachrichtigung auf diese Weise rufen von OnReceive

private void sendNotification(String message) { 
      Intent intent = new Intent(this,FullMapActivity.class); 
      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    //  int color = getResources().getColor(R.color.my_notif_color); 
      PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
      /*PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 *//* Request code *//*, intent, 
        PendingIntent.FLAG_ONE_SHOT);*/ 

      Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
      if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { 



       NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) 
         .setSmallIcon(R.drawable.headerlogo) 
         .setContentTitle("hey..! your booking is confirmed") 
         .setContentText(message) 
         .setAutoCancel(true) 
         .setSound(defaultSoundUri) 
         .setContentIntent(pendingIntent); 


       NotificationManager notificationManager = 
         (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 

       notificationManager.notify(0 /* ID of notification */, notificationBuilder.build()); 
      } 
      else 
      { 

       NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) 
         .setSmallIcon(R.drawable.headerlogo) 
         .setContentTitle("hey..! your booking is confirmed") 
         .setContentText(message) 
         .setAutoCancel(true) 
    //     .setColor(color) 
         .setSound(defaultSoundUri) 
         .setContentIntent(pendingIntent); 


       NotificationManager notificationManager = 
         (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 

       notificationManager.notify(0 /* ID of notification */, notificationBuilder.build()); 
      } 
     } 
0

https://github.com/google/gcm/issues/63

In Der oben genannte Link ist eindeutig erwähnt, dass, wenn "Benachrichtigung" Payload vorhanden ist, dann Android die Benachrichtigung auslösen wird. Versuchen Sie, die "Benachrichtigung" Payload zu entfernen und senden Sie nur die "Daten" Payload, Ihre onMessageReceived sollte aufgerufen werden.

+0

wie mit iOS umgehen? es scheint, iOS nur "Benachrichtigung" Payload – yfsx

+0

Ja. Sie können die Benachrichtigung in IOS nicht steuern. Es ist der Server, der die Benachrichtigung initiiert hat und die Benachrichtigung wird nur im Telefon angezeigt. Der Server muss die Zielansicht und andere Informationen angeben. App kann sicher nicht damit umgehen, wenn es getötet wird. Es kann damit umgehen, wenn es im Hintergrundmodus ist (nicht sicher darüber).Das ist der Grund, warum Whatsapp für jede empfangene Nachricht eine andere Benachrichtigung sendet. Während in Android wird es sie ansammeln und sie als eins zeigen. Hoffe das hilft –