Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我想在所有android设备中接收GCM通知,即使该应用程序已关闭?_Android - Fatal编程技术网

我想在所有android设备中接收GCM通知,即使该应用程序已关闭?

我想在所有android设备中接收GCM通知,即使该应用程序已关闭?,android,Android,我已实施GCM推送通知: 案例1:当应用程序位于前台时,在所有设备上接收通知-确定 案例2:当应用程序处于后台时,在所有设备上接收通知-确定 案例3:当应用程序从任务管理器关闭或最近应用程序列表在某些设备上不会收到通知,在某些设备上也不会收到通知 那么,有谁能帮助我,当应用程序关闭时,我们如何实现在所有设备上接收通知 这是我的GCM代码片段: GCM?不是FCM?谷歌建议使用FCM——所以这个答案可能不适用于所有方面,但我还是想分享我所知道的 设备上发生的情况取决于通知的内容 基本上,您有两种类

我已实施GCM推送通知:

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

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

案例3:当应用程序从任务管理器关闭或最近应用程序列表在某些设备上不会收到通知,在某些设备上也不会收到通知

那么,有谁能帮助我,当应用程序关闭时,我们如何实现在所有设备上接收通知

这是我的GCM代码片段:


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

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

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

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

  • 如果json不包含
    “notification”
    对象,则可能发生两种不同的情况:

首先,如果你的应用程序没有运行,它将不会启动。相反,只有一个通知显示在设备的顶部栏上,并且只有当用户单击它时,应用程序才会启动

其次,如果您的应用正在运行,则将启动/调用包含通知的匹配意图筛选器的活动

下面是此类消息的json示例-注意
标记
-这将对类似消息进行分组,注意
单击操作
这是将触发的意图过滤器的意图操作

{
"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"
}
}
{
“致”:“,
“优先级”:“高”,
“通知”:{
“标题”:“发件人姓名”,
“正文”:“聊天信息”,
“图标”:“图标导航主聊天”,
“标记”:“XMPP_消息”,
“单击操作”:“XMPP消息”,
“声音”:“默认值”
},
“数据”:{
“正文”:“节内容”
}
}
因此,基本上,您可以通过发送适当的消息来决定将发生什么。 如果您希望始终接收该消息(无论应用程序是否运行),您可以省略
通知部分,然后消息将始终发送到您的服务

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

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

希望这有帮助, 干杯,朋友们先看一看。之后,您需要将代码更改为:

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" />
注意:

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);
    }
}

你应该考虑一下。你不能做太多的事情。自定义ROM设备对应用程序通知使用不同的规则。例如REDMI设备。@DivyeshPatel那么whatsapp、facebook应用程序即使关闭了也会如何工作。?GCM不受欢迎,请改用FCM。因为,由于其受欢迎程度,它们在设备中被列为白名单。@HarisQureshi R您确定FCM关闭后,应用程序也会关闭吗?thanxi对应用程序被迫停止(从设置|应用程序)但通过Firebase消息发送非通知类型的消息时仍接收对onMessageReceived()的调用的情况很感兴趣。在我自己的实验中,如果应用程序真的死了(硬停止),Firebase根本不会调用我的应用程序的onMessageReceived()。我可能做错了什么。我认为,你能提供的任何细节,使它在这个特殊的边缘案例中发挥作用,都会对回答原始海报的问题非常有帮助。这个边缘案例是问题的核心。要分析它,我需要看一些代码。我们在生产中有一个SIP应用程序,可以随时接收所有通知。除非您在“系统设置”中禁用该应用程序。您无法对禁用的应用程序执行任何操作。通过FCM,其他一切都可以正常工作。你需要一个Firebase项目、连接你的应用程序、正确的发件人id等等,但我认为你已经完成了基础工作,所以发布一些示例消息、你的服务和你的宣言,我在“Firebase Android快速入门”代码示例中看到了这种行为,可以在Android Studio中从以下位置下载:文件|新建|导入示例。。。(然后在它填充的列表中查找“Firebase Quickstarts for Android”)。它是该项目中的“消息传递”模块。(我相信谷歌在GitHub上也有同样的代码:)无论如何,一旦我发送了一条非通知消息,只有在应用程序启动后才会调用onMessageReceived。(即,其进程正在运行)。如果应用程序的进程已启动,则此示例消息会导致调用onMessageReceived,无论是后台还是前台,但如果应用程序被迫停止,则不会调用onMessageReceived:{“to”:“,“priority”:“normal”}只要您不向我显示您的实现,我就无能为力。