SmartWatch2开发-Notification API简介

原创
2013/12/17 11:48
阅读数 738

原文地址:Sony Notification API

概述

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

应用开发者想在配件上展示事件数据,需要按照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引擎的目的不是成为所有类型数据的仓库,比如文件、多媒体等等。

包含以下内容:

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

概念阐述

开发者需要理解关于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方法

展开阅读全文
打赏
1
7 收藏
分享
加载中
更多评论
打赏
0 评论
7 收藏
1
分享
返回顶部
顶部