2015-06-19 16 views
5

In meiner Anwendung habe ich Push-Benachrichtigung mit GCM integriert. Es funktioniert gut, wenn die Benachrichtigung erscheint. Push-Benachrichtigungen kommen jedoch auch dann, wenn sich der Benutzer in der App befindet. Ich möchte, dass Benachrichtigungen nur angezeigt werden, wenn sich der Nutzer außerhalb der App befindet.Push-Benachrichtigung nur anzeigen, wenn App nicht ausgeführt wird Android

Hier ist mein Code für Push-Benachrichtigung:

GcmBroadcastReceiver

public class GcmBroadcastReceiver extends WakefulBroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    ComponentName comp = new ComponentName(GCMNotificationIntentService.class.getPackage().getName(), 
      GCMNotificationIntentService.class.getName()); 
    startWakefulService(context, (intent.setComponent(comp))); 
    setResultCode(Activity.RESULT_OK); 
} 
} 

GCMnotificationIntentService.Class

public class GCMNotificationIntentService extends IntentService { 

public static int notificationId = 10; 
private NotificationManager mNotificationManager; 
NotificationCompat.Builder builder; 
private boolean login_status = false; 


public GCMNotificationIntentService() { 
    super("GcmIntentService"); 
} 

public static final String TAG = GCMNotificationIntentService.class.getSimpleName(); 

@Override 
protected void onHandleIntent(Intent intent) { 
    Bundle extras = intent.getExtras(); 
    GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this); 
    // The getMessageType() intent parameter must be the intent you received 
    // in your BroadcastReceiver. 
    String messageType = gcm.getMessageType(intent); 

    if (!extras.isEmpty()) { // has effect of unparcelling Bundle 
     /* 
     * Filter messages based on message type. Since it is likely that 
     * GCM will be extended in the future with new message types, just 
     * ignore any message types you're not interested in, or that you 
     * don't recognize. 
     */ 
     if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType)) { 
      sendNotification("Send error: " + extras.toString()); 
     } else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED.equals(messageType)) { 
      sendNotification("Deleted messages on server: " + extras.toString()); 
      // If it's a regular GCM message, do some work. 
     } else if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)) { 
      sendNotification(extras.getString("message")); 
      Log.i(TAG, "Received: " + extras.toString()); 
     } 
    } 
    // Release the wake lock provided by the WakefulBroadcastReceiver. 
    GcmBroadcastReceiver.completeWakefulIntent(intent); 
} 

private void sendNotification(String msg) { 

    mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE); 

    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this).setSmallIcon(R.drawable.ic_launcher) 
      .setContentTitle(getString(R.string.notification_title)) 
      .setStyle(new NotificationCompat.BigTextStyle().bigText(msg)).setContentText(msg); 
    Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
    mBuilder.setSound(uri); 
    mBuilder.setContentIntent(contentIntent); 
    mBuilder.setAutoCancel(true); 
    mNotificationManager.notify(notificationId++, mBuilder.build()); 
} 
} 

In ManifestFile

<receiver 
     android:name=".GcmBroadcastReceiver" 
     android:permission="com.google.android.c2dm.permission.SEND" > 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
      <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> 

      <category android:name="com.medlife.deliveryagent" /> 
     </intent-filter> 
    </receiver> 
    <service android:name=".GCMNotificationIntentService" /> 

Irgendwelche Vorschläge sehr geschätzt werden würde !!!

+0

Haben Sie hinzugefügt Erlaubnis für ? – Amit

+0

Sie können steuern, was angezeigt werden soll, oder anzeigen, dass sie nicht in Benachrichtigungen angezeigt werden sollen. Nur musst du App finden ist im Vordergrund, denke ich. Dieser Link von SO diskutiert darüber. Schau es dir einfach an. http://stackoverflow.com/questions/5504632/how-can-i-tell-if-android-app-is-running-in-the-foreground –

+0

@Amit Ich habe alle Berechtigungen in Manifest-Datei hinzugefügt. dann funktioniert nur noch – John

Antwort

2

etwas tun zu überprüfen, ob Sie App im Vordergrund ist oder nicht von unten Methode aufrufen und je nach Wert der Rückkehr wahr oder falsch tun, um Ihren Rest der Arbeit

public boolean checkApp(){ 
     ActivityManager am = (ActivityManager) this 
       .getSystemService(ACTIVITY_SERVICE); 

     // get the info from the currently running task 
     List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1); 

     ComponentName componentInfo = taskInfo.get(0).topActivity; 
     if (componentInfo.getPackageName().equalsIgnoreCase("YourPackage")) { 
      return true; 
     } else { 
      return false; 
     } 
    } 
+0

Ich habe noch einen Zweifel konnten Sie löschen? – John

+0

Für packageName kann ich bestimmten Klassennamen geben, – John

+0

Yeah können Sie Klassennamen auch Format wäre: 'pacakgename + Klassenname' – Pankaj

Verwandte Themen