Receive Android Push Alerts Even When The Application Is Closed

I tried to use Google GCM, but when the application is closed (swipe or clear it from the task manager), it will not receive any push notifications. And when I open the application again, the notification has already disappeared and is lost.

GCM works for: - The application is open - The application is minimized.

Does not work: - The application is closed (swipe from the task manager) - The application is closed by clearing all open applications in the task manager

I want to receive push notifications, even if the application is closed just like Facebook or instagram. How can I achieve this? Is this possible in GCM? if so, how? if not, what is the other way to achieve this?

here is my code:

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 server of any changes (if applicable). Intent intent = new Intent(this, RegistrationIntentService.class); startService(intent); } // [END refresh_token] } 

RegistrationIntentService.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 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 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] } 
+7
source share
3 answers

According to the official GCM statement, it works with the Google game services library, so try to check if the latest updates to the installed Google game services are installed on your mobile phone, sometimes the Internet connection problem is related to the problem caused by the failure of the GCM notification, or else you can check the receipt delivery if the recipient really received the message or not. But what you say that GCM will not work when the application is not in the foreground is incorrect.

0
source

When the application is closed by the user by the user: notifications are not received

This is a feature of the Android platform. Forcing an application to terminate the user puts the application in a stopped state and none of its codes starts, including any broadcast receivers declared in manifest . Only when the user explicitly launches the application is he placed in the state in which the receivers are started.

For more information about Force Stop , please follow the links:

0
source

A simple solution to this problem is "high priority when creating your notification." The priority constant ranges from -2 to 2 (from the lowest to the highest), and 0 is the default value for this field. Hope this helps. Thanks.

0
source

All Articles