InstanceIDListenerService 会在什么时候被调用,以及如何测试它?

32

最近对 Android GCM 进行了最新更改,现在提供 InstanceIDListenerService 以便通过重写 onTokenRefresh 方法监听令牌刷新。

但是,这个方法什么时候被调用?有没有办法手动测试它?


3
手动测试并非易事,但从Instance ID生命周期页面可知,“Tokens是独一无二且安全的,但在安全问题或用户在设备恢复期间卸载并重新安装您的应用程序时,您的应用程序或Instance ID服务可能需要刷新tokens”。因此,在设备恢复期间尝试重新安装您的应用程序可能有所帮助。 - ztan
2个回答

42

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

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

这将向服务发送带有基类期望的额外信息的意图。

为了使其正常工作,服务需要临时设置为导出状态:

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

注意: 这个操作应该只在临时情况下执行,永远不要在生产环境中导出,否则其他应用程序可能会访问您的服务。


13
如果有人遇到“Error: Requires permission not exported from uid”这个错误,你需要 暂时 在你的清单文件中将服务的android:exported ="true"进行修改(在测试完成后别忘了改回来)。 - Ognyan
对于Gradle:your.package.name必须是应用程序模块build.gradle文件中提到的应用程序ID,而不是Android清单中提到的“package”属性。(如果它们不同,它们可能不同) - Vinay W
1
@VinayWadhwa 我查看了反编译的InstanceIDListenerService类以查看它的作用。代码是混淆的,但至少Android Studio使这个过程变得轻松。 - Hermit
8
出现了异常: 错误:未找到;没有启动的服务:/ - Nininea
3
如果你遇到了“Error: Not Found; no service started”的错误提示,那么只需要执行以下命令即可解决问题: adb shell am startservice -a com.google.android.gms.iid.InstanceID --es "CMD" "RST" 你的包名。请注意不要改变原文意思,使翻译更加通俗易懂,并且不要在回答中添加任何额外的内容。 - Muhammad Riyaz
显示剩余6条评论

2

如果实例ID服务更新了你的应用程序的令牌,就会调用onTokenRefresh()。onTokenRefresh() 被调用的主要原因是让您更新应用程序服务器的新令牌,使其能够向您的应用程序发送消息。

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

在这里查看一个示例:链接


6
“你不需要测试” - “当然你需要测试。” - sstn
1
同时不同意“不需要测试”的说法。你应该手动测试触发onTokenRefresh(),因为这是你的自定义代码。否则,你不能确定真正的GCM服务器刷新请求将来是否可行! - Gavin
1
是的,我明白你需要测试onTokenRefresh中的代码,我想表达的是没有办法使现有的令牌失效,从而触发onTokenRefresh回调。但是你完全可以在onTokenRefresh中测试代码,这并没有任何阻碍。 - Arthur Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接