【问题标题】:When will InstanceIDListenerService be called and how to test it?InstanceIDListenerService 什么时候被调用,如何测试?
【发布时间】:2015-08-18 16:21:18
【问题描述】:

随着对 Android GCM 的最后一次更改,现在提供了一个 InstanceIDListenerService,以便能够通过覆盖 onTokenRefresh 方法来监听令牌刷新。

但是什么时候会调用这个方法呢?有什么方法可以手动测试吗?

【问题讨论】:

  • 没有简单的方法来手动测试它,但是从the Instance ID Lifecycle page,它指出Tokens are unique and secure, but your app or the Instance ID service may need to refresh tokens in the event of a security issue or when a user uninstalls and reinstalls your app during device restoration。因此,您可能想在设备恢复期间尝试重新安装您的应用。

标签: google-cloud-messaging token


【解决方案1】:

要从命令行运行手动测试它:

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

在哪里:

  • 您的应用程序包是 your.package.name
  • 您的 InstanceIDListenerService 实现的类名是 your.own.MyInstanceIDListenerService

这将向服务发送一个意图,其中包含基类所期望的额外内容。

为此,需要将服务设置为exported暂时

<service
    android:name="your.own.MyInstanceIDListenerService"
    android:exported="true">
    <intent-filter>
        <action android:name="com.google.android.gms.iid.InstanceID"/>
    </intent-filter>
</service>

注意:这应该只能暂时完成,切勿在生产中导出,否则其他应用可以访问您的服务。

【讨论】:

  • 如果有人得到Error: Requires permission not exported from uid - 您将需要临时在您的清单中更改android:exported="true" 为您的服务(并且不要忘记在完成测试后将其更改回来)。
  • 对于 gradle :your.package.name 必须是应用程序模块的 build.gradle 文件中提到的应用程序 ID,而不是 android 清单中提到的“包”属性。 (如果它们不同,它们可以是)
  • @VinayWadhwa 我浏览了一个反编译的 InstanceIDListenerService 类,看看它做了什么。代码被混淆了,但至少 Android Studio 让这个过程变得轻松。
  • 出现异常:错误:未找到;没有服务启动:/
  • 如果发现错误:未找到;没有服务启动。然后就做adb shell am startservice -a com.google.android.gms.iid.InstanceID --es "CMD" "RST" your.package.name
【解决方案2】:
如果您的应用程序的令牌已由实例 ID 服务更新,则将调用

onTokenRefresh()。调用 onTokenRefresh() 的主要原因是允许您使用新令牌更新您的应用服务器,以便它可以向您的应用发送消息。

您不必手动测试令牌值。令牌主要由您的应用程序服务器用来向您的应用程序发送消息。因此,当您的应用程序首次运行时,您应该调用 InstanceID.getToken() 并将令牌发送到您的服务器。然后稍后如果更新了令牌,您再次调用 InstanceID.getToken() 并将新值再次发送到您的服务器。

在此处查看example

【讨论】:

  • “你不应该测试”——当然应该。
  • 也不同意“不需要测试”。您当然应该手动测试触发 onTokenRefresh() 因为这是您的自定义代码。否则,您无法确定真正的 GCM 服务器刷新请求将来是否有效!
  • 是的,我认为需要测试您在 onTokenRefresh 中的代码,我的意思是没有办法使现有令牌无效,这会导致 onTokenRefresh 回调。但是没有什么能阻止你在 onTokenRefresh 中测试代码。
猜你喜欢
  • 2011-07-26
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-07
  • 1970-01-01
相关资源
最近更新 更多