在后台更新设备令牌时未收到通知

时间:2017-02-08 10:04:22

标签: android google-cloud-messaging gcmlistenerservice device-instance-id android-devicetoken

我已使用https://developers.google.com的指南在我的项目中实施了GCM。

我采取的步骤是:

  1. 用于接收设备令牌:

    - >扩展GCMRegistrationIntentService的类IntentService,它是从我的mainActivity开始的。

    - >在这项服务中我使用过:

    InstanceID instanceID = InstanceID.getInstance(getApplicationContext());
    token = instanceID.getToken(AppConstants.SENDER_ID, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
    

    我已成功收到令牌。

  2. 我的主要活动中的LocalBroadcastListener获取在步骤1中生成的令牌并将其存储在共享首选项中(也将其发送到我的消息服务器)。

  3. GCMTokenRefreshListenerService扩展InstanceIDListenerService以获取令牌,以防旧日期过期。

    - >在此,我在GCMRegistrationIntentService

  4. 中致电onTokenRefresh()

    现在我的问题是:

    1. 在哪种情况下调用GCMTokenRefreshListenerService?
    2. 什么是instanceID?什么是instanceID的生命周期?
    3. 我使用以下方式从终端运行服务:

      ./adb shell am startservice -a com.google.android.gms.iid.InstanceID --es "CMD" "RST" -n package.name/service.name.
      

      每次给我新的令牌。如何在共享首选项中保存此新生成的令牌?

    4. 当我从此服务收到新令牌时,由于我的令牌已更改,因此我不会收到通知。我将不得不打开我的应用程序以更新令牌。如何更新此令牌?

    5. 每次我的应用程序打开以获取令牌时,是否必须调用GCM?

1 个答案:

答案 0 :(得分:3)

  1. 你不必打电话给GCMTokenRefreshListenerService,只要你的令牌被刷新,它就会由android系统自动调用。

  2. 实例ID为您的应用实例提供唯一ID。您可以找到有关它的更多信息here

  3. 首先,您不必运行您的服务,正如我之前所说,每次刷新令牌时都会自动调用它。要将令牌发送到您的服务器,您应该拨打单独的服务说RegistrationService。要在SharedPreference中保存令牌,您可以在收到令牌后从RegistrationService执行此操作。

  4. 您的GcmListenerService收到通知后,只有当您的服务器通过推送通知向您发送了一些数据时,才会调用此服务。每当您的令牌被更改/刷新时,您都会使用onTokenRefresh()方法接听电话。您应该让服务器知道这个新令牌,以便使用RegistrationService正确接收通知。而且,您无需打开应用即可获得刷新的令牌。

  5. 不,您不必打电话或启动推送通知所需的任何服务,您只需在清单中正确指定服务,所有操作都将由android系统处理