Some notes on Android Wear development.
TO BE COMPLETED…
可以使用专有的
Action.WearableExtender
为Notification增加Inline Action
,具体可以参考Add Wearable Specific-features to a Notification。
开发的模式与手机上的Wallpaper类似,都是继承一个
Service
来进行自己的逻辑开发。
对于表盘,要继承的是CanvasWatchFaceService
。
对于Watch Face,同样也有省电的ambient
模式。
具体可以参考官方的教程Designing Watch Faces。
关于Watch Face的ambient
,可以参考Update the watch face in ambient mode。
注意,这里直接继承自Activity就好了。创建向导默认会为你的Activity / Application使用
Theme.DeviceDefault
主题,而不是手机上常用的AppCompat
系列主题了。
同时支持
ambient
和interactive
模式的app,称之为Always-on app
。
interactive
模式即是我们平常看到的activity的正常交互。
ambient
模式会让你的activity变为黑色,并且要求你只显示一些最基本的信息,但是不会关闭屏幕,可以达到省电的同时又为你提供基本的信息。如果要开启
ambient
模式的支持,我们需要将activity继承自WearableActivity
。
具体可以参考Keeping Your App Visible。
由于Android Wear的屏幕有方形和圆形两种,所以Google为我们提供了自动适配这两种屏幕的布局,即BoxInsetLayout
。
具体可以参考Use a BoxInsetLayout。
它的作用原理很简单,探测到当前屏幕为圆形,则会使用屏幕的内接正方形作为它的绘制区域,即你所有的布局都在这个正方形里边。在实际使用当中,需要测试实际效果才可以定最终的布局,否则它呈现出来的效果很可能并不是你想要的。(比如四周留的空白太多等等)
严格意义上来说这并不是一种新的布局,而是特定针对圆形屏幕做的优化,是列表内容看起来是这样的
要实现这样的效果,需要
WearableRecyclerView
CurvedChildLayoutManager
setCenterEdgeItems(boolean)
方法为true
具体可以参考Creating a Curved Layout。
如果你只是使用
WearableRecyclerView
来实现自适应圆形和方形屏幕,建议你将setCenterEdgeItems
设置为false
。因为前者虽然会在圆形屏幕上将List自动居中,但是空白太大,并不美观。
都在Support wear lib中,等待你去发掘。
Android Wear目前有两个大版本,即1.x与2.0。
中国版最新的1.x是1.4,而国际版是1.5。
2.0的设备目前不是太多,除了一些刚发布的设备。
2.0最大的特点就是可以独立运行(可以直接进行联网操作,不需要经过Data Layer
的API),并且有自己独立的Play商店,不需要有一个companion phone app
来作为部署的载体。
其实对于开发调试来说,1.x也是可以独立运行的。你可以直接将wear app安装到手表上,但是对于正式发布的应用,则不行。
也就是说,对于1.x的设备,手表的apk包需要打包进手机apk包。
自动方式
dependencies {
compile 'com.google.android.gms:play-services-wearable:10.0.1'
compile 'com.android.support:support-compat:25.1.0'
wearApp project(':wearable')
}
// 或者
dependencies {
...
wearApp files('/path/to/wearable_app.apk')
}
手动方式步骤较多,具体参考官方文档 - Package a Wear 1.x app manually。
指定App为Standalone
...
"com.google.android.wearable.standalone"
android:value="true" />
...
具体参考:Specifying an App as Standalone。
由于众所周知的原因,Android Wear针对中国市场定制了中国版的Android Wear操作系统,与国际版(标准版)最大的差别是前者将语音等GMS替换为了”出门问问”语音服务,并阉割掉了一些东西(比如WIFI)。
出于开发上的考虑,对外暴露的接口还是使用GMS,只是要使用一个特定的中国版 - 7.8.87版本的Google Play Service。
下载好之后,将解压的google-play-services-7-8-87/
目录存放到项目根目录下,然后在顶级的build.gradle
文件中添加本地maven
库:
allprojects {
repositories {
maven {
url "${rootProject.projectDir}/google-play-services-7-8-87"
}
// ... other repositories may go here ...
}
接下来在手表和手机模块的build.gradle
文件中使用该版本的GMS服务,如下
compile 'com.google.android.gms:play-services-wearable:7.8.87'
测试发现,对于中国版的手表,手表端必须要使用这个版本的GMS,但是手机端使用不同的版本也可以进行通信。尤其是手机端的应用同时使用了其它GMS提供的服务,那么它们的版本必须要保持一致(否则会编译失败),而且很大的可能性不是这个版本。
具体细节,参考 - 创建面向中国市场的 Android Wear 应用。
它们的KeyCode如下表所示
Button | KeyEvent |
---|---|
MF button 1 | KEYCODE_STEM_1 |
MF button 2 | KEYCODE_STEM_2 |
MF button 3 | KEYCODE_STEM_3 |
具体请参考Multi-function Buttons。
顾名思义,旋转输入。这种按钮只在部分Android Wear中有,类似于Apple Watch,表冠是可以旋转的,用它可以达到滚动列表布局的目的。
SDK提供的ScrollView
, ListView
, HorizontalScrollView
, 或者WearableRecyclerView
,默认支持这种输入。
如果你想让自定义的布局支持这种输入的话,参考Rotary Input。
并不是所有设备都具有GSP或者Speaker,你在使用它们之前需要运行时判断是否具有相应的硬件。
可以参考以下链接来实现对应的功能