技术开发 频道

实战:Android活动目录LiveFolder开发

  【IT168技术】活动目录(LiveFolder)是一种小型的应用层插件。它本身体现为桌面出现的图标,通过点击这些图标,将出现一个列表框,列表框中将显示数据信息。通过活动目录可以在不打开应用程序的情况下,在桌面就能查看其中的数据信息。

  在Android的桌面中长按桌面或者选择菜单,进入增加活动目录的界面,可以将LiveFolder增加到桌面,LiveFolder的增加界面和运行效果如图8-4所示。

  图8-4中左图为增加LiveFolder的界面,列表中的内容由各个应用程序实现的增加LiveFolder的入口决定。LiveFolder点击后不会启动Activity,而是在出现类似图8-4中右图的界面的对话框。这个对话框不是LiveFolder实现者的一部分,而是桌面程序提供的功能。对话框通常包含一个列表,LiveFolder实现者可以实现其中的每个项目显示的内容,还可以进一步实现每个内容被点击之后,出现的界面。如果仅仅出现活动目录列表项对话框,实际是LiveFolder实现者并没有提供运行的界面,而只是在桌面查看了其中的内容。


▲图8-4 活动目录增加界面和运行效果(左:增加界面;中:Contacts活动目录;

右:Contacts活动目录的点击效果)

  LiveFolder的程序组成

  LiveFolder插件的本质是一个特殊的Activity和一个特殊的ContentProvider。Activity需要支持特殊的Intent动作,负责创建LiveFolder,并通过URI关联到某个ContentProvider;ContentProvider负责提供LiveFolder中使用的各个项目的内容。

  android.provider包的LiveFolders类定义活动目录的Activity和ContentProvider中的特殊内容。

  1.LiveFolder的Activity

  在Activity方面,LiveFolders类中的ACTION_CREATE_LIVE_FOLDER动作,实际表示的字符串为“android.intent.action.CREATE_LIVE_FOLDER”。接受这个Intent-filter的Activity,将被桌面程序选择作为可以创建LiveFolder的程序。

  Activity在收到ACTION_CREATE_LIVE_FOLDER动作的Intent启动后,要通过setResult()调用的方式把活动目录的内容发回给它的调用者。返回的Intent的核心内容是需要设置一个Uri,表示活动目录要查询的ContentProvider的地址。

  LiveFolders类中的另外几个数值表示创建LiveFolder后返回的附加参数。

  EXTRA_LIVE_FOLDER_NAME:表示所建立的活动目录的名称(也就是出现在桌面的标签),为字符串“android.intent.extra.livefolder.NAME”,类型为String。

  EXTRA_LIVE_FOLDER_ICON:表示活动目录在桌面显示的图标,为字符串“android.intent.extra.livefolder.ICON”,类型为Intent.ShortcutIconResource(作为Parcelable传递)。

  EXTRA_LIVE_FOLDER_DISPLAY_MODE:表示活动目录的显示模式,为字符串“android.intent.extra.livefolder.DISPLAY_MODE”,类型为int ,具有两个数值可以使用:DISPLAY_MODE_GRID(网格)和DISPLAY_MODE_LIST(列表)。

  EXTRA_LIVE_INTENT:表示活动目录中某个项目被点击后,启动内容的Intent,为字符串“android.intent.extra.livefolder.BASE_INTENT”,类型为Intent。

  综合以上几个方面,LiveFolders被创建后,返回的Intent比较特殊,这个Intent实际上用于指向一个内容提供者,其中的Data域就是指向这个内容提供者的URI。它的额外参数定义了体现在桌面上的名称和图标,也体现了点击桌面图标后出现的对话框中的内容。

  LiveFolder增加到桌面后的图标和选择LiveFolder的图标可以不同。在习惯上,为了区别桌面的Shotcut,LiveFolder的图标通常做成类似文件夹的形式。

  2.LiveFolder的ContentProvider

  在ContentProvider方面,需要在查询(query())的时候,支持几个特殊的域。这些域由LiveFolders类的几个常量定义,如下所示。

  NAME:表示每个项目的名称,为字符串“name”,类型为String;

  DESCRIPTION:表示每个项目的描述,为字符串“description”,类型为String;

  INTENT:表示每个项目被选中后启动的内容,为字符串“intent”,类型为Intent;

  ICON_BITMAP:表示每个项目的图标,为字符串“icon_bitmap”,类型为Bitmap;

  ICON_PACKAGE:表示项目图标对应的应用程序包的名字,为字符串“icon_ package”,类型为String;

  ICON_RESOURCE:表示项目图标对应的资源名称,为字符串“icon_resource”,类型为Parcelable。

  对于LiveFolder的ContentProvider的实现,以上的几个域只有NAME必须实现,其他是可选的。

  LiveFolders实现了BaseColumns接口,因此其中也含有两个静态属性。

  _ID:内容的id,为字符串“_count”,类型为INTEGER;

  _COUNT:内容的数目,为字符串“_id”,类型为INTEGER。

  实现LiveFolder的ContentProvider也需要支持_ID和_COUNT两个域。

0
相关文章