0

我使用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电话onTokenRefresh()

现在我的问题是:

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

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

    每次都给了我新的令牌。如何将这个新生成的令牌保存在我的共享首选项中?

  4. 当我从该服务收到新令牌时,我没有收到通知,因为我的令牌已更改。我必须打开我的应用程序才能更新令牌。如何更新此令牌?

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

1 回答 1

3
  1. 每当您的令牌被刷新时,您不必调用GCMTokenRefreshListenerService它由 android 系统自动调用。

  2. 实例 ID 为您的应用程序的每个实例提供一个唯一 ID。你可以在这里找到更多关于它的信息。

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

  4. GcmListenerService只有当您的服务器通过推送通知向您发送了一些数据时,您才会在调用此服务时收到通知。每当您的令牌更改/刷新时,您都会在您的onTokenRefresh()方法中收到一个调用。您应该让您的服务器知道这个新令牌,以便使用RegistrationService. 而且您不必打开您的应用程序来获取刷新的令牌。

  5. 不,您不必调用或启动推送通知所需的任何服务,您只需在清单中正确指定服务,其余所有事情都将由 android 系统处理

于 2017-02-08T10:57:25.813 回答