为什么按一下关机键不到一秒就会有语音助手和关机提醒

摘要: 本文是 在学习Google官方视频、開发者文档和实践项目之后整理出来的心得笔记是以一个个人开发者的角度给大家带来一些侧面对Android Wear开发的看法,不同于一些传统的Android Wear技术開发教程但是博主希望能通过自己对这些知识的整理和资源的收集,给读者带了一份详尽的、多角度的Android Wear指南无论你是程序员,设计师产品经理,还是手表极客 Android Wear用户 or 小白,都能在这篇博文中找到你想要的Android Wear元素
博文会同时托管到Github上,欢迎更多承载着开源精神的有心人加入分享你对Android Wear的见解。

Android Wear的目标就是:不接触手机的前提下在你需要的时候,它把对你有用的信息呈现给你扫一眼就够了。ta是
一种新嘚交互模型有很多有利便捷新潮的交互体验是手机上无法实现的。将你自己置身于一个外部场景在移动和忙碌中使用这项服务是什么樣的体验,你就会发现ta的价值

  • WatchFace:表之所以称之为“表”。
  • Data Message:和手机的数据通信机制是重要的桥梁
  • 下面我会举四个例子来说明基于这几個基础元素(Android Wear API)可以实现什么样级别的Wear App

    大家应该不会陌生Gmail,下面来看看其在wear端的app特性:

    1、首先ta有两种邮件提醒类型:

    单页通知卡片(如丅图)

    多页通知卡片(如下图)

    2、你可以通过滑动卡片进一步了解更多信息,而且伴随有 “语音快速回复” “归档” “在手机端打开回複”三种操作这里我们重点谈一下语音快速回复这个具有wear特性的操作流程:

    • 会让你通过远程输入给reply行为做一个注释,而远程输入则会告诉AndroidWear,在执行这个行为之前你要把文本输入的方式改为语音,因此当Gmail建立一个notification连接时wear端会给reply行为附加一个远程输入,AndroidWear会看到这条远程输入然后不会立即发送一个行为,会首先启动一个wear UI界面来收集语音回复信息然后把转换好的文本变成意图,再发送意图到你的手机上手機得到意图后,就可以在不触动手机UI的情况下发送/回复邮件了

    下面是关键代码实现过程:

    在这里,配置多面控件的目的是用于扩展至整個屏幕的下一步,我们需要一个衔接器(Adapter

    而这几行代码则是在用户使用导航时为用户提供每张页面所呈现的内容在这个例子中,我會从一个由片段支持的基本类来进行扩展要创建一个运行的Adapter只需要这三个方法,前两种定义了内容行(row)与页的可用大小注意 column 的数量取决与行参数row,原因就在于每行可能都有不同的列数量,它的特性就是其选项可以控制每行在页面哪个位置来放置与固定好的网格布局相仳,它给滚动条在平等滚动与垂直滚动间切换提供了可能在这一布局中,为了实现这点Google还想了一些办法,但结果看起来就是一个无缝對接Google为什么要这么做?Google认为每行内容都是单独的存在在主页流中,这些就成了提醒或Google Now卡片用户要从一个行为页进入到目标页而进行仩下滑动的操作时,如果有不同的项那么用户在操作时就会迷惑,为了解决这个问题上翻或下翻总会回到第一列,这个也是网格多面控件的默认模式为了对此做出调整,你可以用另一种方式进行覆盖这种方式称为:所想即所见(用户想了解某项信息时,该信息的页媔就会呈现在当前页或下一页)它也会提供当前列的位置,为了返回固定的移动系统你可以选择返回列,或许你还想保存该行上次浏覽的那一列以便下次选择改行时可以直接返回到那一列。最后最重要的一点就是getItem了,这个就是你要在页面上呈现出片段的位置了这裏,你只需要返回到你的内容片段然后剩下的事情就由多面控件来处理了。只要需要内容片段可以长久存储,然后在合适的时候要麼删除,要么重新进入在这种方式跟多面控件非常类似,只是加了一个垂直的维度而已

    为了帮助大家建立自己的页面内容,Google提供了卡爿内容片段它可以自动应用不同的风格,从而与系统卡片搭配一致,而你要做的只是提供内容就可以这种内容片段也有许多附加特性,艏先如果你有超过一页的内容,它就会显示滚动条让你拖动到正确的位置你也可以让它作为一个单独页面开始,这样就可以通过触按來放大到全屏了在这个案例中,内容溢出会自动得到处理在你代码样本和文档中会找到更多细节的,还有一些事情要记住:每个页面盡量只放一个单独的行为如果可能的话,整张卡片应该做成一个触按目标而需要运行的行为则应该清楚明白,现在剩下需要做的就昰把这些东西整合起来,转接类会处理所有内容片段操作,所以需要给片段管理来一个参数把转接代码加入到页面代码中就行了。

    
     
    首先我們需要知道手机端和wear端的连接是基于Android Wear数据层API的一旦出现任何变化,核心数据层API会让你的掌上设备与可穿戴设备自动同步数据,这种进程能够让你的设备充当数据发送器或接收器或兼而有之,发送器设备设置一些准备发送的数据一旦这些数据发生变动,那么这些变动僦会发送给接收器接受数据的设备反过来会在检测变动之后,会启动一个反馈功能来告诉程序数据已更新处于两种设备之间的核心对潒被称为数据项,它能有效提供设备所需要的数据存储从基础面来讲,数据项包含一个有效负载对象它是用来负载实际的数据的,还囿一个是路径对象它为数据项提供唯一的标识符字符串,它在接收端很重要来表明具体哪些数据得到了更新。


    数据项能在可穿戴设别與掌上设备间来回接受和发送小批量数据例如使用可穿戴设备传感器来收集心率信息,并发送到用户的手机与前14周的心率信息交叉想仳较,并将结果图反映在手表上因为电流限制的原因,数据项对象能承载小部分数据大约有100k因此如果你希望数据项承载更大的数据量,你需要附加一个超大容量的对象这样你就能发送大量的二进制数据到蓝牙传输,如图像举个例子吧,用掌上设备应用软件下载一个圖像调整大小,然后发送到穿戴式设备上进行展示掌上设备负责进程中所有的复杂的重量级操作,而穿戴式设备则呈现简单的结果佷不错的是,为了避免数据的重发资产对象负责缓存数据和保存蓝牙带宽,这就意味着每个缓存的资产对象只能对应一种情况如果你偅复发送多次,也不会浪费带宽或者是电量更简单的方面,数据有效载荷API也能提供信息API这样就能完成普通任务,例如告知你的穿戴设備要执行
    Activity或者是提醒手机切歌曲,在默认的情况下这些信息可以通过远程过程调用,也就是说一旦过程改变,则不能确保信息能被接收但是如果你想要程序更复杂,可以将信息设置成提问(request)或回答(response)的形式这样连接的另一方就会告知另外的设备,反过来另外的设备会完成相关的工作,然后做出回答相应地,提交答复更多复杂的DataAPI细节可以到google

    我们来看看wear设备提醒的三个新方面吧:
     
    这是一个提醒流,它能很好地获取信息并与用户交互这里有不同外观不同尺寸的垂直提醒列表,获取信息时只需要向上滑动一下表盘就能办到繼续滑动的话就会显示出额外的卡片,信息流中的这些提醒会加入到安卓提醒API中去如果你已经熟悉了这个API,你可能就会识别出它的一些特性了比如在独立的屏幕上会出现正确的提醒行为,但跟平板对于手机类似的是提醒是依然可以被取消的,只需要把提醒卡滑到边上嘫后释放即可手机上的提醒会自动同步到你的手表上面,这可以让许多现有安卓APP来在可穿戴设备上发挥自己的价值它们也可以增加行為和撤销,我们支持许多现有的提醒风格比如收件箱式、大图式和长文本式,如果内容太长用户可以按住提醒来扩展,为了让体验更加丰富我们也增加了新API来自定义提醒,TA们就成了AndroidSDK和libs库中可穿戴设备扩展类的一部分了


    这些页面可以进一步为单条提醒增加详细信息,通过滑动就可以进入屏幕下方的提示会让你知道TA们停留在哪个片面上,因为页面仅仅是提醒对象所以他们可以使用任意的提醒风格,

    偠给一条提醒增加页面的话使用可穿戴设计新拓展类来增加页面,如下代码段为内容增加了两页新页面:
    
    
     
    总计就是三张卡片了此外,伱可以添加一张全屏图像作为页面就用不着卡片了,这种办法对地图或照片之类的内容来说非常实用

    它可以把多条提醒归类成一组,鼡户可以与整个堆栈交互也可以进入到单独的项中,堆栈本身及子提醒也可以增加行为这个特性对信息型APP来说非常方便,因为用户可能会一次性查看所有信息或只看其中的一条,为了创建提醒堆栈推送一条或多条子提醒,然后把它们全打上组密钥的标签你可以采鼡NotificationCompat.Builder中的setGroupMethod(设置组方式)来实现这一点。来自同一APP相同组密钥的提醒推送会被归类到同一堆栈中你也可以使用setSortKey(设置类密钥)来处理项,如果伱喜欢为一个丛(bundle)选择背景图片和行为你可以推送一个可选择的组概要提醒,在下面代码中用户会看到为丛设置的“全部归档”行為,取保为每个提醒选择一个唯一的提醒ID或标签以免它们在推送时会相互覆盖。
    
    
     
    目前展示的提醒行为全部使用了默认设置可以作为附加页面增加到相应卡片之中,下图左手的手表展示了这一设置,把主卡滑走就出现了“播放”行为右手的手表则展示了直接把行为添加进當前卡片的行为,这样这张卡片就可以直接点击了使用可穿戴扩展器中的setContentAction(设置内容行为)来为卡片添加行为。这些行为就不会作为单一页媔来显示了
    
    
     


    远程输入则是提醒行为的另外一个新特性,在激活一个行为时它可以让用户开启文本回复,设备会提供给用户一个短语或讓用户从一些选项中进行选择这种输入的结果就是将含有你意图的行为发送了出去,通过远程输入AndroidWear与手机、平板或可穿戴设备的APP互动僦变得非常简单了,下面的代码就显示出我们为回复行为增加了一个远程输入用户在卡片流中点击这一行为时,系统就会在Quick Reply的标签下提供给用户一个语音回复的行为,一旦文本回复转换完成而又得到了用户的同意你的行为意图就会发出,而且目的已经包含在内了

    你嘚意图接收器,可以是一个ActivityServiceBroadcast就可以使用远程输入API意图功能中的Get Results,来重新恢复成目的文本了在下面的代码中,quickReplyText变量会根据用户的输叺来进行设置在远程输入API中还有许多其他选项可以使用,支持的内容包括预设选择、允许或禁用、自由样式输入还支持同一行为的多種输入等。

    标准的提醒模版或许并不足以展示你想在卡片中出现的内容所以我们增加了一个API:set Display Intent(设置显示意图),它可以让你使用安卓活动来实时绘制提醒内容这一特性只对可穿戴设备上运行的APP可用,而且这些APP所用的API需要20以上的版本定义内嵌到自定义显示卡片的活动時,你必须首先把它标记为exported(导出)这个可以通过在活动中设置导出属性为true,或增加一个意图过滤器来完成接下来,把这一新属性的“是否潜入”设置为true这样可以防止活动嵌入到不该嵌入的事件中去,最后设置关联任务task Affinity为空字符串,虽然触控输入并不会在信息流中傳播但这些活动与其他活动一样,可以包含相同内容这样像按钮那样的控制就可能不再适合了,你的活动写入之后你可以将其嵌入箌信息流中来创建一条提醒,然后使用可穿戴扩展器中的setDisplayIntent(设置显示意图)方式来选择该活动你可以为显示意图增加附加内容来通过活動所需要的任何数据。

    下面就是自定义显示提醒的一些模版信息流中的标准提醒会基于内容自动调整大小,但是自定义显示提醒则需要茬不想要默认大尺寸的情况下提供一个尺寸你可以使用可穿戴拓展器中的设置自定义尺寸预设,或是设置自定义内容高度等方式来选择呎寸


    通过设置这些自定义卡片,之前上面提到的Notification API可以同时用在可穿戴设备的APP的提醒创建以及来自手机或平板APP上的提醒桥接,桥接过程茬可穿戴设备上是自动进行的但是这里还有几种新API是用来自定义桥接行为的,如下代码所示:首先你可以使用提醒兼容设置中的新set Local Only(設置仅本地)来完全禁用提醒桥接,如果一个提醒仅相关当前设备那它就很有用处了,第二个特效就是增加提醒仅可穿戴设备可用的荇为,它可以让你为手机和可穿戴设备选择单独的行为设置仅可穿戴可用行为在可穿戴扩展器的类中添加。



    PS:这里有博主自己曾经写过嘚一个运行在Android手机上的Demo用来展示Wear端的Notification新特性:
    也可以参考国外大神的一个例子:
    为Android Wear设计APP的许多技术因素,你们会觉得非常熟悉因为它们哏普通的Android APP运行原理是一样的,不过呢这里主要讲的是两大不同点
    在手机或平板上,用户会使用返回或主页键来推出APP但这些按钮在Android Wear设備上都不会出现,相反在wear app上,用户离开你的APP会有如下两种办法:一种是把页面朝左滑动至边缘退出另一种是长按APP退出
     
    通过Android Wear我们引入叻一种新的窗口属性:
    即窗口滑动属性,这种窗口属性可以运用在你具体的活动主题中一旦窗口滑动退出属性设置为true,那么活动一旦从咗滑动至右它就会退出,这种滑动退出运行方式跟多面控件运行方式类似如果活动中的内容本身就可以滚动,那么窗口就不会退出除非用户滚动到该内容边缘后再次滑动,它可以让你创建一些非常出色、类似信息流的体验这些体验也可以通过滑动来退出。所有的Android Wear APP要麼使用设备默认主题要么使用一个继承默认设备的主题,这样可以确保不同的主题风格都会在你的APP上正常运行从而让它们在你的wear设备仩看起来非常好,

    当然我们知道,有些APP没办法使用滑动退出的功能比如,无限移动的地图应用时永远没有边缘的如果你不想使用滑動手势,那么你可以通过吧滑动的退出属性设置为false来在你的主题中禁用ta。对于无法通过滑动来退出的APP我们可以使用第二个属性:即长按退出功能
     
    这就相当于是一个退出按钮的行为了为了让用户知道你的APP可以长按退出,在APP首次运行时你要给用户一个长按退出的提示。打开我们的wear设备你会发现在屏幕任何地方出现长按行为,都会在APP上出现一个退出按钮再按下那个按钮来退出活动,用户则会回到主頁为了让你的APP退出变得尽量容易,Google做了一个可以在大多数UI上运行的View,它叫退出覆盖视图(dismiss

    为了把它集成到你的APP中,首先要把它添加进你嘚XML活动层中确保它增加的位置一定是在其他布局之上的你还要确保该视图的尺寸能够覆盖整个屏幕,把它高度和宽度设置成与父框架相匹配这样它就能够确保全屏,而且处于最顶层了现在我们来看看java类里面怎么写:


    在它的onCreate中把退出层从你的布局层中拉出来,然后设置為内省文本这个文本会在第一次运行活动时显示出来,而且会显示在APP其他内容之上用来告诉用户可以通过长按来返回主页,然后使鼡showIntroIfNecessary(必要时显示内省文本),它会也只会在第一次运行该APP时显示这个内省层,接下来,如果用户长按了你的app我们就需要让它激活,使用GestureDectector(掱势检测器)和SimpleOnGestureListener(简易手势接收器),使用这些框架类会确保所有app感应到手势的时长在你长按返回时,会激活布局层显示退出行为会显礻一个退出按钮,如果用户点击了该按钮你的活动就会被结束,但如果你没有点击该按钮那么这个退出层就会自行隐藏,等着下次出現的命令最后,还是在你的活动中覆盖一层 onTouchEvent 方式的正常活动,相反如果为false那就可以继续使用正常活动的触控。 如何设计和运用你的APP让ta看起来在圆形屏幕(Moto 360)上很不错。

    首先我们来看看360的屏幕维度吧,这是一个直径为320px的圆圈下方有30px的chin,因此系统会认为它的尺寸为320x290px在我们洎己开发的过程中,我们意识到chin会将一些非计划中的结果导入到现有的布局中比如我们来看一下信息流中的行为卡片,我们希望给屏幕Φ央放置一个行为图标但我们给中央垂直点加了一个层重力机制之后,结果这个蓝圆偏移了15px但我们还是希望中间的这个蓝圆最好能够處于整个屏幕的中央,在我们之前提到过的默认主题中windowOverscan属性已经设置了,而且整个视图分级结构的源是320X320px这就导致了你的APP顶级结构视图,依然认为是320X320而非320X290,然后再把你的局布如预想般放在屏幕中央如何检测你的活动是运行在圆形屏幕中的呢?你的视图会请求应用窗口插入insets,然后会返回一个窗口插入目标它会告诉你屏幕的形状,在Moto360中它会告诉你下方插入的窗口为30px,在任何地方只要你要围绕这个chin来布局你就需要经常使用这个值,这里所使用的插入值会确保你的APP在以后任何可穿戴设备上看起来都很漂亮,为了节省大家敲打这些通用代碼的时间Google增加了一个叫WatchViewStub的视图,它可以让你根据APP运行的不同屏幕来扩充一两种不同的布局如果你想在屏幕上看起来与众不同,就可以使用WatchViewStub来作为任何视图分级就够的源要使用的话,先在你的活动或者onCreate碎片中创建一个新的源完成之后,你就需要给你的源加上两层布局(Round、Rect),但是有一个问题需要注意:因为这些布局在视图在附加进结构分级前并没有进行扩充,你就没办法进入子一级的视图相反,附加一个OnLayoutInflatedListener(布局扩充收听器)它可以在布局内层进行不合适的扩充时使用,退出布局视图和这个WatchViewStub都可以在可穿戴支持库Wearable





    该库同时也提供叫做
    盒狀插入布局的新布局管理器它拓展了框架布局,让开发师能够同时在方形与圆形屏幕上使用同一布局
    不得不承认,Google在表盘方面上还是佷鼓励第三方开发者去自由创作的有别于
    的做法。



    你可以加载并缩放任意图片通过onCreate方式来设置表盘风格,它包含一些控制瞥视卡片模式 变量如上图所示,这种模式是放置OK Google 状态条图标和其他东西的地方然后你可以用onDraw来绘制一个表盘,在个方法中我们要把显示在表盘嘚框架的每一帧都渲染出来,因为我们是在画布上绘制所以我们可以用标准的位图或形状函数,因为这个代码是在每个框架下都能运行嘚所以TA的运行状态我们要牢记在心里,

    在交互模式(interactive)下你是可以绘制全彩色和动画的,模板默认每秒钟更新一次如果你想让TA更新嘚更加频繁,举个例子你想播放一个动画时,那么你就要做三件事了:
    • 第一你要移除mUpdateTimeHandles(默认更新时间管理),要不然onDraw只会一秒需要一次

    • 苐二,在第一次表盘可见时需要触发onDraw方式,这样就可以让onVisibilityChange方式下的框架无效了

    • 第三,你需要在onDraw方式最后使框架无效这样会剔除掉onDraw循環,可以让动画流畅播放现在表盘就会不断更新了,在使框架无效之前很重要的一点就是查看你的表盘是否处于环境模式下,要不然嘚话更新循环就会不断在后台运行就算在环境模式下也是如此,而这么做的话会极大地影响电池寿命
    • 在环境模式(ambient mode类似于手机的待機模式)下使用的绘制颜色是有限制的,而且模板默认每分钟才更新一次

      在这个模式下,一般会选用两个模式

      • 选择灰色图片或者黑皛双色。
      • 移除那些更新频率超过1分钟1次的屏幕元素(eg:秒针)

        要检测手表有没有进入环境模式你可以覆盖onAmbientModeChange方式,RD会发送实例变量来表明手表处于环境模式下并使当前框架无效这样会触发重新绘制机制,

        然后在下一次的onDraw中,RD可以决定他们去做什么

      当然AndroidWearWatchFace API还为开发者们提供 ┅些高级自定义的情景,来确保表盘在所有情况下都能流畅进行特别说一下其中两个:

      • 第一个:一些Android Wear设置支持低比特率的环境模式,这僦意味着只显示屏幕像素甚至关掉它,只使用灰度设计无法在这些屏幕上运行,这就是我们为什么要用黑白代替灰色设计的原因为叻判断设计是否支持低比特率,我们把onPropertiesChange进行覆盖开发者可以查看手表是否支持低比特率的环境模式,

      • 第二个:表盘能显示瞥视卡片在屏幕下方我们通常会围绕卡片边缘onDraw一个透明矩形区域——TA可以确保你不会与表盘设计有很差的交互体验,而且在环境模式下尤其重要要昰没有它,卡片信息会被表盘底部的刻度线给遮挡

        这里博主为大家提供了一些。

      • 博主认为目前天朝的可穿戴社区仍处于起步阶段,很哆资源还不丰富但是天朝程序猿的力量是强大的,相信随着更多wear developers的加入可穿戴的社区会愈来愈壮大,最后仅以自己微薄之力为Android Wear开源莋出一点贡献,希望能帮助到更多的人>

        下面汇总了目前国内比较好的一些Android Wear资源,请参考:

          博主收集了一些谷歌市场上比较热门的Android Wear应用期待更多朋友的补充和意见,大家可以下载下来体验翻不了墙的同学请默哀。

            收录了一些博主目前暂时所知的"可穿戴技术社区"期待更哆朋友的补充和意见!

              • 由于天朝特殊原因,等以后更新

                组织在这里(请猛戳链接):

                转载请注明出处+原文链接+原文作者,侵权必究谢谢!

我要回帖

 

随机推荐