2016-06-01 2 views
6

Я пытался использовать Google GCM, но когда приложение закрыто (проведите или очистите его от диспетчера задач), он не получит никаких push-уведомлений. И когда я снова открою приложение, уведомление уже исчезло и потеряно.Получите уведомление Android Push, хотя приложение закрыто

GCM работает для: - приложение является открытым - приложение минимизируется

не работает: - приложение закрыто (салфетки из диспетчера задач) - приложение закрывается с помощью очистить все открытые приложения в диспетчере задач

Я хочу получать push-уведомления, даже если приложение закрыто так же, как Facebook или instagram. Как я могу достичь этого? Возможно ли это в GCM? если да, то как? если нет, то каков другой способ достичь этого?

вот мой код:

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

Использовать услугу для этой или наилучшей возможной идеи - использовать широковещательный приемник с диспетчером аварийных сигналов. Укажите время уведомления или что-либо, что вы хотите установить в классе –

+0

, вы писали вещательный приемник? –

+0

только радиовещание приемник достаточно. –

ответ

0

В соответствии с официальным заявлением о GCM он работает с Google играть библиотеку услуг, поэтому постарайтесь, чтобы проверить, если ваш мобильный есть последние обновления сервисов Google Play установлены также иногда интернет проблема подключения conject сетевых причин проблема с уведомлением GCM push, или вы можете проверить получение квитанции, если получатель действительно получил сообщение или нет. Но что вы скажете, что GCM не будет работать, если приложение не на переднем плане неверно

+1

У меня есть новейшие и современные сервисы Google Play. Также нет проблем в подключении к Интернету, я могу получать уведомления Facebook. Когда приложение открыто и оно сведено к минимуму или в фоновом режиме, оно будет работать, но если вы его закроете, то он не будет работать уже – heyou

0

Когда приложение закрывается принудительно пользователем: уведомления не приходят

Это особенность Android платформы , Принудительное прекращение приложения пользователем ставит приложение в состояние остановки и ни один из его кодов не запускается, включая любой broadcast receivers, объявленный в manifest. Только когда пользователь явно запускает приложение, он помещается в состояние, в котором приемники запускаются.

Для получения дополнительной документации о Force Stop, перейдите по ссылкам:

+0

, что неверно, потому что уведомление whatsap прекращается –

0

Простое решение этой проблемы является то, что, "набор приоритетов высоким при строительстве вашего уведомления" , Константа приоритета изменяется в диапазоне от -2 до 2 (от самого низкого до самого высокого), а 0 - значение по умолчанию для этого поля. Надеюсь, это поможет. Благодарю.

Смежные вопросы