GCM无法接收消息

时间:2017-03-30 12:16:02

标签: android firebase google-cloud-messaging

我的应用使用发送通知消息的GCM,我的问题是:

当应用程序处于前台时,我的应用程序可以收到通知消息,但当应用程序处于后台或被杀时,我的应用程序无法接收通知消息。

我想自定义通知视图,我不希望gcm发送通知。

2 个答案:

答案 0 :(得分:0)

最好切换到Firebase云消息传递(FCM)。它处理应用程序的前景和后台情况。

与GCM相比,其中还必须实现广播接收器以接收消息,在FCM中我们使用扩展FirebaseMessagingService的服务。您的服务应覆盖onMessageReceivedonDeletedMessages回调。

大多数邮件类型都提供了

onMessageReceived,但以下情况除外:

  • 当您的应用在后台时发送的通知。在这 如果是,通知将传送到设备的系统托盘。一个 用户点按通知会默认打开应用启动器。
  • 包含通知和数据有效负载的消息,包括背景和 前景即可。在这种情况下,通知将传递给 设备的系统托盘,数据有效负载在附加功能中提供 您的启动器活动的意图。

有关详细信息,请参阅FCM Notification for Android

答案 1 :(得分:0)

即使使用已关闭的应用,也可以使用Service在后​​台处理您的代码。

public class MyService extends Service {

 static Activity activity;

public void SendNotification(String message) {

   Intent  resultIntent = new Intent(this, YourActivity.class); //Display activity when user click notification
    resultIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    PendingIntent pIntent = PendingIntent.getActivity(this, (int) System.currentTimeMillis(), resultIntent, 0);

    Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
            .setSmallIcon(R.mipmap.ic_lancher)
            .setContentTitle("title")
            .setContentText(message)
            .setSound(alarmSound)
            .setContentIntent(pIntent);

    NotificationManager mNotificationManager =
            (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
    // mId allows you to update the notification later on.
    mNotificationManager.notify((int) System.currentTimeMillis(), mBuilder.build());
}


@Override
public void onCreate() {
    super.onCreate();

    // Start GCM code here 
    // or
    SendNotification("hi!);        
 }
}
AndroidManifest.xml

中的

 <service
        android:name=".MyService"
        android:exported="false" />

开始Service

Intent serviceIntent = new Intent(YourActivity.this, MyService.class);
startService(serviceIntent);