即使该应用关闭,我想在所有Android设备上收到GCM通知?

时间:2017-05-17 12:49:19

标签: android

我已实施GCM推送通知:

案例1:当应用程序处于前台时,会在所有设备上收到通知 - 确定

案例2:当应用程序在后台接收所有设备上的通知时 - 确定

案例3:当应用程序从任务管理器关闭或最近应用程序列表未在某些设备上接收通知并在某些设备上接收时。

所以任何人都可以帮助我如何在应用关闭时在所有设备上接收通知

这是我的GCM代码段:

How to open android app on all devices when receive push notification (GCM) while app is closed?

2 个答案:

答案 0 :(得分:0)

GCM?不是FCM?谷歌建议使用FCM - 所以这个答案可能不适用于所有方面,但我想分享我所知道的。

设备上发生的事情取决于通知的内容。

基本上,您有两种类型的通知:

  • 如果邮件的json不包含"notification"对象(描述设备顶部工具栏中通知的可见部分),则您的应用始终接收通知(唤醒),无论是正在运行,在前台或后台,充电或屏幕打开或关闭,还是您能想到的任何其他状态。只要它连接到互联网当然。 这里重要的是,您已在清单中使用FCM正确注册了服务。 (您需要从FirebaseMessagingService派生的服务覆盖方法onMessageReceived)。如果需要,我可以提供样品。

  • 如果json 包含"notification"个对象,可能会发生两件事:

首先,如果您的应用未运行,则无法启动。相反,只需在您设备的顶部栏上显示通知,并且只有当用户点击它时,您的应用才会启动。

其次,如果您的应用正在运行,则会启动/调用包含该通知的匹配意图过滤器的活动。

以下是此类消息的json示例 - 请注意tag - 这将对类似的消息进行分组,并注意click_action这是意图过滤器意图的动作触发。

{
"to":"<<FCMToken>>",
"priority":"high",
"notification":{
    "title":"sender name",
    "body":"chat message",
    "icon":"icon_nav_main_chat",
    "tag":"XMPP_MESSAGE",
    "click_action":"XMPP_MESSAGE",
    "sound":"default"
},
"data":{
    "body":"stanza-content"
}
}

所以基本上,你决定通过发送适当的消息会发生什么。 如果您希望始终收到它(应用程序是否运行),您可以省略notification部分,然后该邮件将始终发送给您的服务。

缺点是,您必须在本地启动任何可见通知,并将所需的全部数据放在data对象的有效负载中。如果我没记错的话你在这里有大约4000字节。

但是有一些用例是有道理的。据我所知,Whatsapp就是这样做的,因为他们使用更强大的本地通知方式,直接回复等等。

希望这有帮助, 欢呼,格里斯

答案 1 :(得分:0)

首先看看WakefulBroadcastReceiver。之后,您需要将代码更改为:

<强>的AndroidManifest.xml

// add permission for wake lock
<uses-permission android:name="android.permission.WAKE_LOCK" />

<receiver
    android:name=".GcmBroadcastReceiver"
    android:permission="com.google.android.c2dm.permission.SEND" >
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <category android:name="YOUR_APPLICATION_PACKAGE_NAME" />
    </intent-filter>
</receiver>

<service android:name=".YourGcmIntentService" />

Java代码:

public class MyWakefulBroadcastReceiver extends WakefulBroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        ComponentName comp = new ComponentName(context.getPackageName(),
                YourGcmIntentService.class.getName());
        startWakefulService(context, (intent.setComponent(comp)));
        setResultCode(Activity.RESULT_OK);
    }
}

注意:

GCM已弃用,您应该考虑FCM