SmartWatch2开发-Notification API简介

原文地址:Sony Notification APIcss

概述

Notifaciton是Smart Extension API的一部分。Notification引擎收集不一样来源的事件数据到同一个位置,供配件主应用访问,主应用没必要去访问各个不一样的数据源。 事件数据的一个例子是社交网络上的活动流,新的短信和彩信提醒,未接来电提醒,等等。android

应用开发者想在配件上展现事件数据,须要按照Notification API的规则向应用提供数据。数据库

下图显示了Notification API的位置后端

Notification API

Notification API使用Android ContentProvider来定义和实现,并用数据库来存放数据。Extension想跟Notificaiton API交互,必须使用注册API向Extension表中插入相关数据。必要时, 会向Extension发送Intent以执行某项任务。安全

Extension使用Notification API规定的格式来提供数据。Extension做为独立的Android应用,随时可能被卸载或禁用,除非它位置system目录且操做过程当中随时可安装(unless they are part of the system image, and may be installed any time during the operation of the device)。当Extension被禁用时,其数据将不会在配件主应用中显示。服务器

配件主应用能够控制并显示Notification引擎收集的数据。实际应用中,Notification引擎可能不是惟一的数据源。配件主应用能够读取全部Extension的数据,甚至能够更新某些数据字段。因为这个缘由,须要权限才能读取数据。网络

Notification引擎充当用户感兴趣事件的数据中心。使用这种设计的目的是考虑到主应用的性能和安全。跨数据库的查询很是慢,可能严重影响配件的性能,破坏用户体验。当有过多的数据库时,容许"合法应用"访问其中的Extension数据,会很是困难以至不可行。注意:Notification引擎的目的不是成为全部类型数据的仓库,好比文件、多媒体等等。app

包含如下内容:less

1.概念阐述
2.应用间通讯
3.安全
4.Extension生命周期
5.添加一个数据源
6.获取事件数据
7.显示事件的详细信息
8.联系人连接
9.处理图片
10.性能ide

概念阐述

开发者须要理解关于Notification引擎的数据库的三个基本概念。

Extension, 是一个Android APK级别的概念。Registration数据库中的Extension表包含了每一个Extension的元数据。Extension表的目的是向Notification引擎提供必要的数据。而Extension的事件数据多是本身生成的,或者来自其余的ContentProvider,Web服务器等等。Extension是独立的应用,能够有本身的界面,且能够由主应用(使用Notification引擎)显示这些数据;或者也能够没有界面,彻底依靠主应用来显示数据。

Source,是逻辑上的抽象。引入这个概念是为了让开发者能够区别不一样来源的数据,但同时又可将这些来源打包到同一个独立的APK。一个用例是邮件聚合器Extension,它容许仅使用一个Android程序包就能让用户链接不一样的电子邮箱;每一个邮箱都是一个数据源,或者整个Extension自己仅是一个数据源。后者的话,来自不一样邮箱的邮件能够显示在同一个View中而非不一样的View。Notification.Source存储了Source相关的属性信息。主应用可使用Source来过滤事件数据,或者给用户提供配置项进行Source事件数据过滤。开发者想让主应用显示来自不一样Source的事件,须要添加Notification.Source信息。一个Extension最多能够关联8个Source。超过上限将致使抛出异常。一个Source必须跟一个Extension关联。

Event,表明一个须要显示给用户的重要提醒。好比短信提醒,未接电话提醒,社交网络上朋友们的状态更新等等。Notification.Event用于保存Extension提供的事件。主应用一般使用Event表中的信息来进行显示。Event老是来自于Source,但Source并非总有Event。每一个Source最多容许100个Event存放在Notification.Event中。到达上限后,以前的事件会被自动清除。

Source和Event以前的关系

应用间通讯

Extension使用Android ContentResolver API跟Notification引擎的ContentProvider通讯。为响应用户输入,Extension须要实现至少一个BroadcastReceiver来监听主应用发出的广播。

Extension可监听的广播列表及描述请参考Notification.Intents

安全

为使用Notification API,Extension必须首先向Extension表中添加信息。添加信息须要特定的权限,详细内容请参考Registration API

Extension仅能访问它本身的数据:增长、删除、修改、查找它本身存放在Notification引擎中的数据。当先前已注册为Extension的应用从Android系统中卸载后,存放在引擎中的数据相应也会自动被删除。

若是想容许其余应用访问当前Extension的数据,可使用shareUserId(不建议这么作)。当有shareUserId相同的几个Extension安装后,Notification引擎的安全机制会认为它们是同一个Extension。

Extension生命周期

应用在使用Notification引擎前须要告诉引擎它本身的存在,即注册。成功注册后,Notification引擎会认为该应用是一个Extension。实现上,Extension注册过程不过是使用注册API向数据库中插入几条关于Extension自身的数据。

从Notification引擎的角度,Extension的生命周期从成功注册开始,直到从Android系统中卸载结束(或者Extension将本身从系统中反注册)。在此期间,Extension能够访问事件流引擎并从它接收Intent。

添加一个数据源

如前面所说,Source是一个逻辑抽象概念,便于展现来自于不一样的后端的事件数据。由开发者肯定如何划分Extension的事件数据,但全部的事件数据必须跟某个Source产生联系,不然插入事件数据的操做会失败。

应该在Extension成功注册后、插入任何数据以前设置Source信息。

ContentValues values = new ContentValues();
    Builder iconUriBuilder = new
	Uri.Builder().scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
                                   .authority(getPackageName())
                                   .appendPath(Integer.toString(R.drawable.icon));

    values.put(SourceColumns.NAME, "RSS news feed");
    values.put(SourceColumns.ENABLED, "1");
    values.put(SourceColumns.ICON_URI_1,iconUriBuilder.toString());

    ...

    uri = cr.insert(Source.URI, values);

可参考Sony AddOn SDK中演示Notification用法的例子: SampleNotificationExtension

获取事件数据

Extension能够周期性地自动从Source获取事件数据, 或者依赖主应用发出的Intent来触发获取数据的过程。

这个Intent名为REFRESH_REQUEST_INTENT。 若是依赖这个Intent来触发获取事件数据的操做,须要定义BroadcastReceiver。程序不该依赖Intent的时间间隔,由于其顺序是任意的。固然,主应用启动时必定会发出一个Intent,Extension能够利用这一特色。

当Extension有事件数据须要插入到 Notification引擎的ContentProvider中时,能够用insert(Uri, ContentValues)或bulkInsert(Uri, ContentValues[])。当有大量事件数据须要插入时,考虑到性能问题建议使用后一种方法。

ContentResolver cr = getContentResolver();
    ContentValues[] valueArray = new ContentValues[count];
    < fill valueArray with data >
    cr.bulkInsert(Event.URI, valueArray);

从数据源接收到事件数据时,强烈建议Extension也从同一数据源获取相关的数据更新,好比用户最近的状态更新。这种作法能够最小化网络流量以及网络延迟。频繁的网络操做会过多地消耗电量。

若是须要周期性地从网络服务器同步数据,可考虑使用AlarmManager。这里有一篇博文给出了使用方法。

显示事件的详细信息

Notification.Event中提供的的事件数据可能只是一个信息快照(a snapshot of the information),用户跟主应用上展现的信息交互很是有限。用户可能想看到事件的详情并进行操做,好比添加为喜欢,回复,或者观看视频等等。若是Extension提供在应用内或在网站上的交互,请监听VIEW_EVENT_INTENT。 当用户查看事件详情时主应用会发送这种Intent。该Intent包含特定的事件数据,可让Extension启动事件详情页面。

处理图片

图片的位置是一个字符串。图片能够存放在本地SD卡上。

支持如下URI模式:

  • android.resource://
  • content://

数据完整性

为保证数据库的完整性,Notification引擎会在Extension插入或更新时保证完整性。尤为是外键的完整性。好比,Event的source_id是一个外键,它关联到Source表中的_id列。因此source_id必须是Source表中一个有效的_id。If values for the stated mandatory columns are not provided,将抛出SQLException。

性能

为了达到最好的性能,建议开发者使用在更新Event Stream ContentProvider时使用bulkInsert或applyBatch方法

相关文章
相关标签/搜索