`
cloudtech
  • 浏览: 4605577 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

活动目录(LiveFolder)

 
阅读更多

活动目录(LiveFolder)

LiveFolder的概念和用途

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

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

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

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两个域。

LiveFolder的实现

本节中的LiveFolderSample程序实现了一个活动目录,增加后将在桌面出现一个图标。点击这个活动目录在桌面的图标,将在LiveFolder的列表框中显示一些内容。LiveFolder Sample的执行效果如图8-5所示。

图8-5中右图的列表项对话框共有8个项目,进一步点击每一个项目,还将出现浏览器显示空(blank)的网页。

LiveFolder Sample实现的AndroidMenifest.xml中定义的一个用于创建LiveFolder 的Activity和一个显示内容的ContentProvider,如下所示:

<activityandroid:name="LiveFolderSample"

android:icon="@drawable/app_icon"android:label="LiveFolder Sample">

<intent-filter>

<actionandroid:name="android.intent.action.CREATE_LIVE_FOLDER" />

<categoryandroid:name="android.intent.category.DEFAULT" />

</intent-filter>

</activity>

<providerandroid:name="LiveFolderSampleProvider"

android:authorities="livefoldersample"/>

这里声明的Activity支持“android.intent.action.CREATE_LIVE_FOLDER”动作,表示可以用它来创建活动目录,也就是可能在活动目录的增加列表中出现它这个项目。

public class LiveFolderSample extends Activity {

private static final String URI = //ContentProvider的URI

"content://" + "livefoldersample" +"/live_folders/virtual";

private static final UriCONTENT_URI = Uri.parse(URI);

@Override protected voidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

final Intent intent =getIntent(); // 获得其中的Intent

final String action =intent.getAction();

if(LiveFolders.ACTION_CREATE_LIVE_FOLDER.equals(action)) {

final IntentliveFolderIntent = new Intent(); // 返回结果中的Intent

final IntenturlIntent =

newIntent(Intent.ACTION_VIEW,Uri.parse("about://blank"));

returnIntent.setData(CONTENT_URI);// Intent中的URI

returnIntent.putExtra(// LiveFolder对话框的名称

LiveFolders.EXTRA_LIVE_FOLDER_NAME,"LiveFolderSample");

returnIntent.putExtra(// LiveFolder的图标

LiveFolders.EXTRA_LIVE_FOLDER_ICON,Intent.ShortcutIconResource.

fromContext(this,R.drawable.app_icon));

returnIntent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_DISPLAY_MODE,

LiveFolders.DISPLAY_MODE_LIST);

returnIntent.putExtra( // LiveFolder中的每个内容Intent

LiveFolders.EXTRA_LIVE_FOLDER_BASE_INTENT,urlIntent);

setResult(RESULT_OK, returnIntent); // 设置返回结果

} else { setResult(RESULT_CANCELED); }

finish();

}

}

在创建LiveFolder的过程中,涉及两个Intent。returnIntent是Activity返回的效果,在其中通过额外参数指定图标和活动目录的名称,其中主要的内容是指向ContentProvider的URI,并定义了其中的图标和名称。

返回内容returnIntent的一个特殊的域为urlIntent,也是一个Intent,它表示每一个项目被点击之后启动Activity的Intent。在这里将它定义为Intent.ACTION_VIEW 动作和以“about://blank”表示的Intent。当点击LiveFolder中的每一个项目的时候,将调用相应的程序(实际上是浏览器),对应的URI为“about://blank”再附加上每个内容的id。

这里的ContentProvider的实现内容如下所示:

publicclass LiveFolderSampleProvider extends ContentProvider {

private static final int VIRTUAL = 1; // 各个项目的id

private static final int VIRTUAL_ID = 2;

private static final int LIVE_FOLDER_SAMPLE= 3;

public static final String AUTHORITY ="livefoldersample"; // URI

private static final UriMatchersUriMatcher;

static {

sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); // 建立匹配器

sUriMatcher.addURI(AUTHORITY,"virtual/", VIRTUAL);

sUriMatcher.addURI(AUTHORITY,"virtual/#", VIRTUAL_ID);

sUriMatcher.addURI(AUTHORITY,"live_folders/virtual", LIVE_FOLDER_SAMPLE);

}

// ......省略部分内容:query()方法的实现

@Override public String getType(Uri uri) { // 获取类型的实现

switch (sUriMatcher.match(uri)) {

case VIRTUAL:

case VIRTUAL_ID:

return "";

case LIVE_FOLDER_SAMPLE:

return "";

default:

throw newIllegalArgumentException("Unknown URI " + uri);

}

}

@Override public boolean onCreate() { returntrue; }

@Override public Uri insert(Uri uri,ContentValues initialValues) {

return null; //LiveFolder不要求实现insert()

}

@Override public int delete(Uri uri, Stringwhere, String[] whereArgs) {

return 0; // LiveFolder不要求实现delete()

}

@Override public int update(Uri uri, ContentValuesvalues,

Stringwhere, String[] whereClause) {

return 0; // LiveFolder不要求实现update()

}

}

对于为LiveFolder使用的ContentProvider,需要实现getType()方法,而其他方法不是必需的,如果要实现,可以在其他的地方对ContentProvider进行操作。

query()方法的实现是主要的内容,如下所示:

@Override public Cursor query(Uri uri,String[] projection, String selection,

String[] selectionArgs,String sortOrder) {

switch (sUriMatcher.match(uri)) { // 查询操作的匹配

case VIRTUAL: // 不返回实际内容

case VIRTUAL_ID:

return null;

case LIVE_FOLDER_SAMPLE:

return getLivefolder(); // 调用返回内容

default:

throw new IllegalArgumentException("UnknownURI " + uri);

}

}

private Cursor getLivefolder() { // 返回具体的内容

int i = 0;

String[] columnNames ={LiveFolders._ID,LiveFolders.NAME}; //2个必要的列

String[] temp ={"",""};

MatrixCursor c = new MatrixCursor(columnNames);

for(i = 0 ;i < 8;i++){ // 循环返回8个项目

temp[0] = String.valueOf(i); // _ID的内容

temp[1] = LiveFolders.NAME + "= " + String.valueOf(i); // NAME的内容

c.addRow(temp);

}

return c;

}

在查询返回的时候,实际上只有一个项有效,联系ContentProvider和LiveFolder创建者的是名称为“content://livefoldersample/live_folders/virtual”的URI。

查询返回具有两列的内容,其中第一列为_ID,第二列为NAME。前者表示每列的id,这是必须具有的,后者也就是反映在LiveFolder对话框中的每个项目显示的内容。

由于在这里没有为每个项目设置Intent域(LiveFolders.INTENT),因此每个项目在被选择之后将根据LiveFolder的创建者中设置的Intent附加上每个项目的id,作为启动的内容。例如,点击第2个项目将打开名称为“about://blank/1”的地址的空网页。

——本段文字节选自《Android经典应用程序开发》

图书详细信息:http://blog.csdn.net/broadview2006/article/details/7276196

分享到:
评论

相关推荐

    shortcut+livefolder

    NULL 博文链接:https://griffinshi.iteye.com/blog/647341

    疯狂Android讲义(第2版)源代码 第14章~第17章

    14.5、实时文件夹(LiveFolder): 第15章、传感器应用开发 15.2、Android的常用传感器:方向传感器Orientation; 磁场传感器Magnetic Field; 温度传感器Temperature; 光传感器Light; 压力传感器Pressure; 第16章...

    Android实例代码

    目录结构: 第2章、Android应用程序界面设计,即View 2.2、布局管理(Layout):LinearLayout、TableLayout、FrameLayout、RelativeLayout; 2.3、基本界面组件:TextView、EditText; Button、ImageButton; 9Patch; ...

    疯狂Android讲义(第2版)源代码 第6章~第9章

    疯狂Android讲义目录结构: 第2章、Android应用程序界面设计,即View 2.2、布局管理(Layout):LinearLayout、TableLayout、FrameLayout、RelativeLayout; 2.3、基本界面组件:TextView、EditText; Button、...

    疯狂Android讲义源码

     1.5.3 res目录说明 27  1.5.4 Android应用的清单文件:  AndroidManifest.xml 28  1.5.5 应用程序权限说明 29  1.6 Android应用的基本组件  介绍 31  1.6.1 Activity和View 31  1.6.2 Service 32  1.6.3 ...

    疯狂Android讲义.part2

    1.5.3 res目录说明 27 1.5.4 Android应用的清单文件: AndroidManifest.xml 28 1.5.5 应用程序权限说明 29 1.6 Android应用的基本组件 介绍 31 1.6.1 Activity和View 31 1.6.2 Service 32 1.6.3 BroadcastReceiver ...

    疯狂Android讲义.part1

    1.5.3 res目录说明 27 1.5.4 Android应用的清单文件: AndroidManifest.xml 28 1.5.5 应用程序权限说明 29 1.6 Android应用的基本组件 介绍 31 1.6.1 Activity和View 31 1.6.2 Service 32 1.6.3 BroadcastReceiver ...

Global site tag (gtag.js) - Google Analytics