基本看完Sony提供的SmartWatch2的文档和Demo,仍然没有弄懂如何从手机向SmartWatch2主动发消息。
可以使用Notification从手机向SmartWatch 2主动发送消息,即:向Notification.Event.URI对应的ContentProvider中插入数据即可。虽然不是非常完美(我想发的是一个数据,比如文本、二进制流等等,而不是会让手表振动的Notification),但毕竟可以解决问题。
但如何从SmartWatch2向手机主动发送消息?没有Demo实现了这个功能,也没找到相关文档。只能通过反编译分析类似的应用,看看它们是如何实现的。
1. FindMyPhone简介
Find my phone是Sony开发的一款适用于SmartWatch2的app。下载并试用这个应用,发现它实现了SmartWatch2主动向手机端发送消息的功能。Find my phone使用场景很简单:用户忘了手机放在哪里,可以通过手表发起命令,让手机振动并响铃提醒。
- 安装Find my phone
- SmartWatch2上启动Find my phone
- 点击左边的图标,手机开始响铃
- 手机响铃界面
2. FindMyPhone分析
2.1 反编译FindMyPhone
E:\apk_decompile>adb -s CB5124U78T pull /sdcard/Download/FindPhoneExtension_v1.0
.3.apk .
2350 KB/s (139584 bytes in 0.057s)
E:\apk_decompile>dex2jar-0.0.9.15\dex2jar.bat FindPhoneExtension_v1.0.3.apk
this cmd is deprecated, use the d2j-dex2jar if possible
dex2jar version: translator-0.0.9.15
dex2jar FindPhoneExtension_v1.0.3.apk -> FindPhoneExtension_v1.0.3_dex2jar.jar
Done.
用jd打开得到的jar文件,发现没有混淆,分析起来非常方便。
2.2. 功能分析
主要类
时序图
- 第1-5步: [手表端] 启动ControConfirmNewMan等待用户操作
- 第6-11步:[手表端] 启动ControlAlertNewMan
- 第12步: [手机端] Activity运行,振动并响铃
以上三步跟上面的图片正好对应。 FindMyPhone跟前面分析的几个Demo基本结构是一样的。所以这里不再赘述。
3. 总结
整体上,跟前面看的几个Demo没有什么区别。结合这个时序图,可以加深对以下几点的了解:
- Find my phone本质上是运行在手机上的,所以才可以执行上面的第12步
- ControlConfirmNewman和ControlAlertNewman继承自Sony的Control API中的ControlExtension。Control API的文档提到,ControlExtension可以显示在SmartWatch 2,并控制SmartWatch 2
- 第9步发送的广播是上述时序的关键,由这个广播联系SmartWatch 2和手机端
综上,如何在SmartWatch 2和手机之间发送消息其实非常简单:
-
SmartWatch 2向手机发送消息
直接发送Control API支持的Intent广播即可,或者使用Notification -
手机向SmartWatch 2发送消息
发送Intent启动ExtensionService,由ExtensionService处理即可
来源:oschina
链接:https://my.oschina.net/u/578279/blog/183770