2016-06-01 34 views
6

Próbowałem używać Google GCM, ale gdy aplikacja jest zamknięta (Swipe lub wyczyść z menedżera zadań), nie otrzyma żadnych powiadomień push. A kiedy ponownie otworzę aplikację, powiadomienie już zniknęło i zostało utracone.Otrzymuj powiadomienia Android Push, mimo że aplikacja jest zamknięta

GCM pracuje dla: - aplikacja jest otwarta - App jest zminimalizowane

nie działa: - App jest zamknięty (bezstykowa z menedżera zadań) - App jest zamknięty poprzez jasne wszystkich otwartych aplikacji w Menedżerze zadań

Chcę otrzymywać powiadomienia push, mimo że aplikacja jest zamknięta, podobnie jak Facebook lub instagram. Jak mogę to osiągnąć? Czy to możliwe w GCM? jeśli tak, to w jaki sposób? jeśli nie, to w jaki inny sposób to osiągnąć?

tutaj jest mój kod:

AndroidManifest.xml

<!-- [START gcm_receiver] --> 
    <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.airwyntin.notificationtest" /> 
     </intent-filter> 
    </receiver> 
    <!-- [END gcm_receiver] --> 

    <!-- [START gcm_listener] --> 
    <service 
     android:name=".MyGcmListenerService" 
     android:exported="false" > 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
     </intent-filter> 
    </service> 
    <!-- [END gcm_listener] --> 
    <!-- [START instanceId_listener] --> 
    <service 
     android:name=".MyInstanceIDListenerService" 
     android:exported="false"> 
     <intent-filter> 
      <action android:name="com.google.android.gms.iid.InstanceID"/> 
     </intent-filter> 
    </service> 
    <!-- [END instanceId_listener] --> 
    <service 
     android:name=".RegistrationIntentService" 
     android:exported="false"> 
    </service> 

MyGcmListenerService.java:

public class MyGcmListenerService extends GcmListenerService { 


private static int notifId = 0; 

private static final String TAG = "MyGcmListenerService"; 

/** 
* Called when message is received. 
* 
* @param from SenderID of the sender. 
* @param data Data bundle containing message data as key/value pairs. 
*    For Set of keys use data.keySet(). 
*/ 
// [START receive_message] 
@Override 
public void onMessageReceived(String from, Bundle data) { 
    String message = data.getString("alert"); 


    Log.i(TAG, "From: " + from); 

    if (message != null) { 
     Log.d(TAG, "From: " + from); 
     Log.d(TAG, "Message: " + message); 

     if (from.startsWith("/topics/")) { 
      // message received from some topic. 
     } else { 
      // normal downstream message. 
     } 

     // [START_EXCLUDE] 
     /** 
     * Production applications would usually process the message here. 
     * Eg: - Syncing with server. 
     *  - Store message in local database. 
     *  - Update UI. 
     */ 

     /** 
     * In some cases it may be useful to show a notification indicating to the user 
     * that a message was received. 
     */ 
     sendNotification(message); 
     // [END_EXCLUDE] 
    } 

} 
// [END receive_message] 

/** 
* Create and show a simple notification containing the received GCM message. 
* 
* @param message GCM message received. 
*/ 
private void sendNotification(String message) { 
    Intent intent = new Intent(this, NotificationView.class); 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, 
      PendingIntent.FLAG_ONE_SHOT); 

    Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) 
      .setSmallIcon(R.mipmap.ic_launcher) 
      .setContentTitle("GCM Tesst Message") 
      .setContentText(message) 
      .setAutoCancel(true) 
      .setSound(defaultSoundUri) 
      .setContentIntent(pendingIntent); 

    //Vibration 
    notificationBuilder.setVibrate(new long[] { 0, 200, 200, 200, 200, 200 }); 


    //LED 
    //notificationBuilder.setLights(Color.RED, 3000, 3000); 

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

    Notification notif = notificationBuilder.build(); 
    notif.flags |= Notification.FLAG_AUTO_CANCEL; 

    /*notif.ledARGB = 0xFFff0000; 
    notif.flags = Notification.FLAG_SHOW_LIGHTS; 
    notif.ledOnMS = 100; 
    notif.ledOffMS = 100;*/ 

    notificationManager.notify(notifId++ /* ID of notification */, notif); 

} 
} 

MyInstanceIDListenerService.java:

public class MyInstanceIDListenerService extends InstanceIDListenerService { 

private static final String TAG = "MyInstanceIDLS"; 

/** 
* Called if InstanceID token is updated. This may occur if the security of 
* the previous token had been compromised. This call is initiated by the 
* InstanceID provider. 
*/ 
// [START refresh_token] 
@Override 
public void onTokenRefresh() { 
    // Fetch updated Instance ID token and notify our app's server of any changes (if applicable). 
    Intent intent = new Intent(this, RegistrationIntentService.class); 
    startService(intent); 
} 
// [END refresh_token] 


} 

RegistrationInte ntService.java:

public class RegistrationIntentService extends IntentService { 

private static final String TAG = "RegIntentService"; 
private static final String[] TOPICS = {"global"}; 

public RegistrationIntentService() { 
    super(TAG); 
} 

@Override 
protected void onHandleIntent(Intent intent) { 
    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); 

    try { 
     // [START register_for_gcm] 
     // Initially this call goes out to the network to retrieve the token, subsequent calls 
     // are local. 
     // R.string.gcm_defaultSenderId (the Sender ID) is typically derived from google-services.json. 
     // See https://developers.google.com/cloud-messaging/android/start for details on this file. 
     // [START get_token] 
     InstanceID instanceID = InstanceID.getInstance(this); 
     String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId), 
       GoogleCloudMessaging.INSTANCE_ID_SCOPE, null); 
     // [END get_token] 
     Log.i(TAG, "GCM Registration Token: " + token); 

     // TODO: Implement this method to send any registration to your app's servers. 
     sendRegistrationToServer(token); 

     // Subscribe to topic channels 
     subscribeTopics(token); 

     // You should store a boolean that indicates whether the generated token has been 
     // sent to your server. If the boolean is false, send the token to your server, 
     // otherwise your server should have already received the token. 
     sharedPreferences.edit().putBoolean(QuickstartPreferences.SENT_TOKEN_TO_SERVER, true).apply(); 
     // [END register_for_gcm] 
    } catch (Exception e) { 
     Log.d(TAG, "Failed to complete token refresh", e); 
     // If an exception happens while fetching the new token or updating our registration data 
     // on a third-party server, this ensures that we'll attempt the update at a later time. 
     sharedPreferences.edit().putBoolean(QuickstartPreferences.SENT_TOKEN_TO_SERVER, false).apply(); 
    } 
    // Notify UI that registration has completed, so the progress indicator can be hidden. 
    Intent registrationComplete = new Intent(QuickstartPreferences.REGISTRATION_COMPLETE); 
    LocalBroadcastManager.getInstance(this).sendBroadcast(registrationComplete); 
} 

/** 
* Persist registration to third-party servers. 
* 
* Modify this method to associate the user's GCM registration token with any server-side account 
* maintained by your application. 
* 
* @param token The new token. 
*/ 
private void sendRegistrationToServer(String token) { 
    // Add custom implementation, as needed. 
} 

/** 
* Subscribe to any GCM topics of interest, as defined by the TOPICS constant. 
* 
* @param token GCM token 
* @throws IOException if unable to reach the GCM PubSub service 
*/ 
// [START subscribe_topics] 
private void subscribeTopics(String token) throws IOException { 
    GcmPubSub pubSub = GcmPubSub.getInstance(this); 
    for (String topic : TOPICS) { 
     pubSub.subscribe(token, "/topics/" + topic, null); 
    } 
} 
// [END subscribe_topics] 

} 
+0

Skorzystaj z usługi w tym celu lub z najlepszego możliwego pomysłu skorzystaj z odbiornika Broadcast z menedżerem alarmów. Ustaw swój czas na powiadomienie lub cokolwiek, co chcesz ustawić w klasie –

+0

czy napisałeś odbiornik? –

+0

wystarczy tylko odbiornik telewizyjny. –

Odpowiedz

0

Zgodnie z oficjalnym oświadczeniu GCM to współpracuje z Google Play bibliotekę więc starają się sprawdzić, czy mobile najnowsze aktualizacje z usługi Google Play zainstalowane również czasami problem z połączeniem do internetu conject przyczyn sieciowych problem z powiadomieniem wypychanym GCM lub możesz sprawdzić potwierdzenie dostawy, jeśli odbiorca rzeczywiście otrzyma wiadomość lub nie. Ale co można powiedzieć, że GCM nie będzie działać, gdy aplikacja nie jest na pierwszym planie jest nieprawidłowy

+1

Mam najnowsze i aktualne usługi Google Play. Również nie ma problemu z połączeniem z Internetem, mogę otrzymywać powiadomienia na Facebooku. Gdy aplikacja jest otwarta i jest zminimalizowana lub znajduje się w tle, to działałoby, ale jeśli ją zamkniesz, to nie będzie już działać – heyou

0

Gdy aplikacja jest zamknięty siłą przez użytkownika: powiadomienia nie docierają

Jest to cechą platformy Android . Wymuś zatrzymanie aplikacji przez użytkownika powoduje, że aplikacja jest zatrzymana i żaden z jej kodów nie jest uruchamiany, w tym: broadcast receivers zadeklarowany w manifest. Tylko wtedy, gdy użytkownik jawnie uruchamia aplikację, jest ona ustawiana w stan, w którym odbiorniki są uruchamiane.

Więcej dokumentacji dotyczącej Force Stop, proszę poniższy linki:

+0

To nie jest poprawne, ponieważ powiadomienie o usłudze whatsap przychodzi dobrze –

0

Prostym rozwiązaniem tego problemu jest to, że "Ustaw priorytet wysoki budując swoje zgłoszenie" . Stała priorytetu zmienia się w zakresie od -2 do 2 (od najniższego do najwyższego), a 0 jest wartością domyślną dla tego pola. Mam nadzieję, że to pomoże. Dzięki.