收到GCM信息但未显示 - 广播接收结果=已取消 - 服务部门停止

时间:2016-01-26 15:16:58

标签: android google-cloud-messaging android-service android-broadcastreceiver

我已经在我的应用和服务器上实现了GCM消息传递,一切正常但不是每部手机都有效!

主要问题是:

  • 当应用程序打开时,我收到GCM消息并按照预期生成通知,但是当应用程序关闭时,我可以看到(通过LOGCAT)消息已收到但已取消 - &gt ; "广播接收器,结果=取消"。

  • 接下来就是我无法让我的app-services在后台运行。只要我"关闭"我的应用程序来自"最近的活动"菜单也会在后台停止(进入设置 - >应用程序 - >" MY_APP" - >禁用强制停止)。

我已经做了很多研究,我认为原因可能是华为P8(主要测试设备)强行关闭所有应用程序,当你将它们从最近的活动中移开时#34;标签。但是,如果是这样的话,其他应用就像" Facebook"," Viber"等等不会发送推送通知。

的Manifest.xml

SlingAllMethodsServlet

GCMBroadCastReceiver

  CREATE TRIGGER dbo.SetLastUpdateOnTableB
  ON dbo.TableA 
  AFTER UPDATE
  AS
  BEGIN

   IF (NOT EXISTS(SELECT * FROM TableB WHERE personId = (SELECT TableA.Id From TableA INNER JOIN inserted ON TableA.Id = inserted.Id))) 
   BEGIN 
       INSERT INTO TableB(PersonId, LastUpdate) 
       VALUES((SELECT TableA.Id From TableA INNER JOIN inserted ON TableA.Id = inserted.Id), CURRENT_TIMESTAMP) 
   END 
   ELSE 
   BEGIN 
       UPDATE TableB 
       SET LastUpdate = CURRENT_TIMESTAMP
       WHERE personId = (SELECT TableA.Id From TableA INNER JOIN inserted ON TableA.Id = inserted.Id)
   END
  END
  GO

GCMIntentService

<receiver
        android:name="com.happyhour.gcm.GcmBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
            <action android:name="android.intent.action.REBOOT"/>
            <action android:name="android.intent.action.PACKAGE_REPLACED"/>
            <action android:name="android.intent.action.BATTERY_CHANGED"/>
            <action android:name="android.intent.action.USER_PRESENT"/>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />                
            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
            <category android:name="com.happyhour.main" />
        </intent-filter>
    </receiver>
    <service
        android:name="com.happyhour.gcm.GcmIntentService" >
    </service>

    <receiver android:name="com.happyhour.gcm.UpdateReceiver">
        <intent-filter>
            <action android:name="android.intent.action.PACKAGE_REPLACED" />
            <action android:name="android.intent.action.PACKAGE_INSTALL"/>
            <data android:path="com.happyhour.main"
                 android:scheme="package" />
        </intent-filter>
    </receiver>

我很困惑!我无法找到原因的根源。

提前致谢。

2 个答案:

答案 0 :(得分:3)

所以看起来华为的EMUI接口(在我的情况下是P8)有一种特殊的处理方式。

安装完每个应用后,它会提示切换按钮,询问您是否允许此特定应用在后台运行。

enter image description here

  • 因此,如果某个应用直接来自Google Play商店,则不会提示您这样做&#34;在后台运行&#34;津贴按钮,因为它是一个受信任的来源&#34;

  • 如果您只是从Android Studio导出.apk并将其直接安装到手机上,它会提示如上所示的按钮,因为直接安装在手机上的情况属于&#34;不受信任的来源&# 34;

  • 最后,如果您使用USB调试器选项在手机上安装.apk,它将永远不会提示按钮,它将始终表现得就像您已经按下&#34; off&#34;。每次关闭应用程序时,它都会强制关闭所有任务。

所以,我做的是将我的Android-Studio生成的.apk转移到我的手机中并手动安装。当它提示按钮时,我将其切换为&#34; ON&#34;就是这样。当应用关闭时,我终于可以收到GCM消息了!

我认为这是一个EMUI错误/特殊应用处理问题。

特别感谢@TeChNo_DeViL的帮助。

答案 1 :(得分:2)

您使用的是非常旧的库。考虑切换到最新的官方GCM库。让您的侦听器扩展GcmListenerService。查找相同的官方文档。它也更容易维护。

确保下面提到的所有TODO都已正确完成:

  1. 使用唯一的项目名称和程序包名称在Google Developer Console中注册项目,您的应用程序和应用程序项目名称的程序包名称必须与控制台中的名称相匹配。
  2. 将google_services.json配置文件放在app /目录中。打开它并验证文件中的API_KEY和Google Developer Console中配置中显示的API_KEY是否匹配,您的包名称也是如此。同时检查谷歌云消息的状态必须为2。
  3. 按照Set up a GCM Client App on Android中的详细步骤操作。必须正确实施所有听众。
  4. 一旦您的应用程序运行,请记录生成的GCM注册令牌,将其发送到您的服务器并交叉检查adb控制台中登录的那个与服务器上收到的令牌,两者都必须匹配。
  5. 如果无效,请使用this示例应用作为参考。您可以复制监听器,RegistrationIntentService.java文件和清单,但不要忘记将软件包名称更改为您的软件包名称(在AndroidManifest.xml软件包名称引用中也是如此,特别是对于监听器)