2015-06-19 27 views
5

W mojej aplikacji mam powiadomienie push zintegrowane z GCM. Działa dobrze, gdy pojawia się powiadomienie. Ale powiadomienia push przychodzą nawet wtedy, gdy użytkownik znajduje się w aplikacji. Chcę, aby powiadomienia były wyświetlane tylko wtedy, gdy użytkownik znajduje się poza aplikacją.Pokaż powiadomienie push tylko wtedy, gdy aplikacja nie działa na Androidzie

Oto mój kod do powiadomienia Push:

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()); 
} 
} 

W 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" /> 

Wszelkie sugestie będą bardzo mile widziane !!!

+0

byłaś dodany zgodę na ? – Amit

+0

Masz kontrolę nad tym, co pokazywać lub pokazywać, aby nie wyświetlać się w powiadomieniach. Trzeba tylko znaleźć aplikację na pierwszym planie. Ten link SO omawia o tym. Po prostu to sprawdź. http://stackoverflow.com/questions/5504632/how-can-i-tell-if-android-app-is-running-in-the-foreground –

+0

@Amit Dodałem wszystkie uprawnienia w pliku manifestu. to tylko działa – John

Odpowiedz

2

zrobić coś takiego, by sprawdzić, czy aplikacja jest w planie lub nie wywołując poniżej metody w zależności od zwrotu wartości prawda lub fałsz wykonać resztę pracy

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

Mam jeszcze jedną wątpliwość, czy jesteś w stanie ją usunąć? – John

+0

Dla packageName mogę podać konkretną nazwę klasy, – John

+0

Tak, możesz użyć nazwy klasy również format będzie: 'pacakgename + classname' – Pankaj

Powiązane problemy