2016-06-01 4 views
6

Google GCM을 사용해 보았지만 앱이 닫히면 (작업 관리자에서 스 와이프하거나 지울 때) 푸시 알림을받지 못합니다. 그리고 앱을 다시 열면 알림이 이미 사라져 버렸습니다.앱이 닫혀 있어도 Android 푸시 알림 수신

GCM을 위해 노력하고 있습니다 : - 응용 프로그램이 열려 입니다 - 응용 프로그램이 작동하지

최소화 : 을 - 응용 프로그램은 (작업 관리자에서 슬쩍) 닫혀 - 응용 프로그램은 작업 관리자에서 일반 열려있는 모든 응용 프로그램을 통해 폐쇄

앱이 Facebook이나 인스 타 그램처럼 닫혀 있어도 푸시 알림을 받고 싶습니다. 나는 이것을 어떻게 얻을 수 있을까 ?? 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 :

그렇게 네트워크 원인 conject 가끔 인터넷 연결 문제도 설치 서비스를 모바일 구글의 최신 업데이트가 있는지 확인 재생하려고 구글 Play 서비스 라이브러리와 함께 작동 GCM의 공식 성명으로 당
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 푸시 알림의 문제 또는 수신자가 실제로 메시지를 수신했는지 여부를 확인할 수 있습니다. 응용 프로그램이 사용자에 의해 강제로 폐쇄 될 때 은 그러나 당신이 응용 프로그램이 포 그라운드에 있지 않을 때 GCM이 작동하지 않습니다라고하는 것은

+1

나는 최신 Google Play 서비스를 최신으로 제공합니다. 또한 인터넷 연결에는 문제가 없으며 Facebook 알림을받을 수 있습니다. 응용 프로그램이 열려 있고 최소화 또는 백그라운드에서 작동하면 작동하지만 닫으면 이미 작동하지 않습니다 – heyou

0

올바르지 않습니다 알림 그것은 안드로이드 플랫폼의 특징이다

도착하지 않습니다 . 사용자가 응용 프로그램을 강제 종료하면 응용 프로그램이 중지 상태가되고 에 선언 된 broadcast receivers을 포함하여 코드가 실행되지 않습니다. 사용자가 명시 적으로 앱을 시작한 경우에만 수신자가 해고당한 상태가됩니다. "알림을 구축하는 동안 설정 한 우선 순위가 높은"

+0

thats nots whatsap notification is fine –

0

이 문제에 대한 간단한 솔루션, 즉 : Force Stop을에 대한 자세한 문서에 대해서는

,이 링크를 따르십시오 . 우선 순위 상수는 -2에서 2까지 (최저에서 최고)까지 다양하며 0은이 필드의 기본값입니다. 희망이 도움이 될 것입니다. 감사.