---恢复内容开始---

今天准备开始写这个ApiDemos示例的学习日记了,放在网上以监督自己!

首先是导入该示例。如果我们在配置Android开发环境是,利用Android SDK 安装包中的SDK Manager.exe文件下载完整的包,里面包含各种API版本的Samples,这里使用的是API 16版本中的ApiDemos。

1、导入ApiDemos示例

  在eclipse中file->new->android sample project->next,然后在列出的不同版本示例中选择对应版本的ApiDemos示例即可导入示例。成功导入后,可以先看看该示例的结构,在运行该示例。示例结构如下:

可以清楚的看到该工程的目录结构,程序的入口是com.example.android.apis包(这个可以在AndroidManifest.xml文件中查看)的ApiDemos.java文件中。该文件的功能是完成整个示例(包括示例下的所用小示例)的结构设计,十分巧妙,在Mono For Android 的示例包android-app-master包中同样采用相似的结构实现了示例导航的功能。

现在具体分析一下该文件的功能:

 package com.example.android.apis;

 import android.app.ListActivity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleAdapter; import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map; public class ApiDemos extends ListActivity { @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); Intent intent = getIntent();
String path = intent.getStringExtra("com.example.android.apis.Path"); if (path == null) {
path = "";
} setListAdapter(new SimpleAdapter(this, getData(path),
android.R.layout.simple_list_item_1, new String[] { "title" },
new int[] { android.R.id.text1 }));
getListView().setTextFilterEnabled(true);
} protected List<Map<String, Object>> getData(String prefix) {
List<Map<String, Object>> myData = new ArrayList<Map<String, Object>>(); Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_SAMPLE_CODE); //通过PackageManager从AndroidManifest.xml中读取所有含有Intent.ACTION_MAIN
//和Intent.CATEGORY_SAMPLE_CODE的所有Activity信息
PackageManager pm = getPackageManager();
List<ResolveInfo> list = pm.queryIntentActivities(mainIntent, 0); if (null == list)
return myData; String[] prefixPath;
String prefixWithSlash = prefix; if (prefix.equals("")) {
prefixPath = null;
} else {
prefixPath = prefix.split("/");
prefixWithSlash = prefix + "/";
} //变量len 记录了满足条件的Activity个数
int len = list.size(); Map<String, Boolean> entries = new HashMap<String, Boolean>(); for (int i = 0; i < len; i++) {
ResolveInfo info = list.get(i);//获取对应activity的ResolveInfo信息
CharSequence labelSeq = info.loadLabel(pm);//获取对应activity的android:label属性值 //如果为空,则label初始化为activity对应的android:name属性值,否则直接转换为string赋值给label
String label = labelSeq != null
? labelSeq.toString()
: info.activityInfo.name;//anctivityInfo.name对应于属性android:name if (prefixWithSlash.length() == 0 || label.startsWith(prefixWithSlash)) { String[] labelPath = label.split("/"); //prefixPath为空时,nextLabel值为labelPath第一个字符串;否则为labelPath中索引为prefixPath长度的值,不会造成越界因为
//prefixPath的最大长度永远比labelPath最大长度小1
String nextLabel = prefixPath == null ? labelPath[0] : labelPath[prefixPath.length]; if ((prefixPath != null ? prefixPath.length : 0) == labelPath.length - 1) {
addItem(myData, nextLabel, activityIntent(
info.activityInfo.applicationInfo.packageName,
info.activityInfo.name));
} else {
if (entries.get(nextLabel) == null) {
addItem(myData, nextLabel, browseIntent(prefix.equals("") ? nextLabel : prefix + "/" + nextLabel));
entries.put(nextLabel, true);
}
}
}
} Collections.sort(myData, sDisplayNameComparator); return myData;
} private final static Comparator<Map<String, Object>> sDisplayNameComparator =
new Comparator<Map<String, Object>>() {
private final Collator collator = Collator.getInstance(); public int compare(Map<String, Object> map1, Map<String, Object> map2) {
return collator.compare(map1.get("title"), map2.get("title"));
}
}; //叶子列表项对应的Intent
protected Intent activityIntent(String pkg, String componentName) {
Intent result = new Intent();
result.setClassName(pkg, componentName);
return result;
} //分类列表项对应的Intent
protected Intent browseIntent(String path) {
Intent result = new Intent();
result.setClass(this, ApiDemos.class);
result.putExtra("com.example.android.apis.Path", path);
return result;
} protected void addItem(List<Map<String, Object>> data, String name, Intent intent) {
Map<String, Object> temp = new HashMap<String, Object>();
temp.put("title", name);
temp.put("intent", intent);
data.add(temp);
} @Override
protected void onListItemClick(ListView l, View v, int position, long id) {
Map<String, Object> map = (Map<String, Object>)l.getItemAtPosition(position); Intent intent = (Intent) map.get("intent");
startActivity(intent);
}
}

代码的103-109行自定义了一个比较器,用来对列表项进行排序。

注意:

ListActivity中的listView的每个Item都包含以下内容:

1、  title,显示出来的内容;

2、  intent,隐藏的内容,Intent类型主要有两种:

  一种指向叶子列表项,点击后运行具体的Activity;

  一种指向分类列表项,即点击后仍运行ApiDemos这个继承自ListActivity的Activity,只是此时该Activity对应的SimpleAdapter不一样了,因而类表显示的内容也不一样了。

可以在eclipse中调试运行,这样可以更快的理解具体的流程:

第一次获取数据源后(通过getData()获得),数据源的title项如下:

  Accessibility

  Animation

  App

  Content

  Graphics

  Media

  NFC

  OS

  Preference

  Text

  Views

点击上面列出的项目后,如点击App后,将会启动App项隐藏的Intent 对应的Activity, 而该Activity仍为ApiDemos,所以进入之后就重新创建并初始化myData,其对应的内容为:

  ActionBar

  Activity

  Alarm

  …

点击上面列出的项目后,如点击Activity后,将会启动Activity项隐藏的Intent对应的Activity,而该Activity仍为ApiDemos,所以进入之后重新创建并初始化myData,其对应的内容为:

  Animation

  Custom Dialog

  Custom Title

  …

点击上面列出的项目后,如Custom Title后,将会启动Custom Title项隐藏的Intent对应的Activity,这是情况不一样了,此时的Activity对应的名称为ResolveInfo对象info中保存的名称为info.activityInfo.name的Activity,这是就可以看到效果!(此时就会呈现具体的界面)

我们看到的列表显示效果都是按字典序排列的,这是因为在结尾调用了自定义的比较器sDisplayNameComparator的缘故!

通过以上比较笨的步骤就能大致了解整个示例安排的结构了,噢耶!

ApiDemos示例学习(1)——ApiDemos示例的导入的更多相关文章

  1. Spring 注解学习 详细代码示例

    学习Sping注解,编写示例,最终整理成文章.如有错误,请指出. 该文章主要是针对新手的简单使用示例,讲述如何使用该注释,没有过多的原理解析. 已整理的注解请看右侧目录.写的示例代码也会在结尾附出. ...

  2. MIL 多示例学习 特征选择

    一个主要的跟踪系统包含三个成分:1)外观模型,通过其可以估计目标的似然函数.2)运动模型,预测位置.3)搜索策略,寻找当前帧最有可能为目标的位置.MIL主要的贡献在第一条上. MIL与CT的不同在于后 ...

  3. html5游戏引擎phaser官方示例学习

    首发:个人博客,更新&纠错&回复 phaser官方示例学习进行中,把官方示例调整为简明的目录结构,学习过程中加了点中文注释,代码在这里. 目前把官方的完整游戏示例看了一大半, brea ...

  4. Delphi之通过代码示例学习XML解析、StringReplace的用法(异常控制 good)

    *Delphi之通过代码示例学习XML解析.StringReplace的用法 这个程序可以用于解析任何合法的XML字符串. 首先是看一下程序的运行效果: 以解析这样一个XML的字符串为例: <? ...

  5. 多示例学习 multiple instance learning (MIL)

    多示例学习:包(bags) 和 示例 (instance). 包是由多个示例组成的,举个例子,在图像分类中,一张图片就是一个包,图片分割出的patches就是示例.在多示例学习中,包带有类别标签而示例 ...

  6. 【原创】SpringBoot & SpringCloud 快速入门学习笔记(完整示例)

    [原创]SpringBoot & SpringCloud 快速入门学习笔记(完整示例) 1月前在系统的学习SpringBoot和SpringCloud,同时整理了快速入门示例,方便能针对每个知 ...

  7. QC学习三:Excel数据导入导出QC操作流程

    环境: QC9 WindowsXP Office2007   1. 准备 1.通过Excel导入QC,需要下载Microsoft Excel Add-in: http://update.externa ...

  8. 老李推荐:第3章3节《MonkeyRunner源码剖析》脚本编写示例: MonkeyImage API使用示例 1

    老李推荐:第3章3节<MonkeyRunner源码剖析>脚本编写示例: MonkeyImage API使用示例   在上一节的第一个“增加日记”的示例中,我们并没有看到日记是否真的增加成功 ...

  9. 老李推荐: 第3章1节《MonkeyRunner源码剖析》脚本编写示例: MonkeyRunner API使用示例

    老李推荐: 第3章1节<MonkeyRunner源码剖析>脚本编写示例: MonkeyRunner API使用示例   MonkeyRunner这个类可以说是编写monkeyrunner脚 ...

随机推荐

  1. oracle存储参数(storage子句)含义及设置技巧

    可用于:表空间.回滚段.表.索引.分区.快照.快照日志 参数名称 缺省值 最小值 最大值 说明 INITIAL 5(数据块) 2(数据块) 操作系统限定 分配给Segment的第一个Extent的大小 ...

  2. svg 文字

    <text>标签 在svg中用使用<text>标签去定义一段文字.如 Example 1 在svg中写下 在平坦的路上曲折前行 Example 1 Dome <svg h ...

  3. python socket 编程之一:编写socket的基本步骤

    一.socket 编写server的步骤: 1.第一步是创建socket对象.调用socket构造函数.如: socket = socket.socket( family, type ) family ...

  4. Turn the corner--hdu2438(3分法)

    Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...

  5. SQL Server 内存使用量下降问题

    SQL server这个程序是非喜欢内存这东西的.所以它的内存使用量下降,一定是被别人给抢去了.这件事的后果就是SQL Server 变的 非常慢.怎么样才可以让这件事不太容易发生呢? ------- ...

  6. If-Modified-Since和If-None-Match

    If-Modified-Since & If-None-MatchIf-Modified-Since,和 Last-Modified 一样都是用于记录页面最后修改时间的 HTTP 头信息,只是 ...

  7. Nginx 变量漫谈(八)

    与 $arg_XXX 类似,我们在 (二) 中提到过的内建变量 $cookie_XXX 变量也会在名为 XXX 的 cookie 不存在时返回特殊值“没找到”:     location /test  ...

  8. ArrayList的contains方法(转)

    今天在用ArrayList类的caontains方法是遇到了问题,我写了一个存放User类的ArrayList  但在调用list.contains(user)时总是返回false. 去看了下Arra ...

  9. Qt之QTemporaryFile(文件名唯一,且可以自动删除)

    简述 QTemporaryFile类是操作临时文件的I/O设备. QTemporaryFile用于安全地创建一个独一无二的临时文件.临时文件通过调用open()来创建,并且名称是唯一的(即:保证不覆盖 ...

  10. File.ReadAllText 读取中文乱码问题

    原文:File.ReadAllText 读取中文乱码问题 用 File.ReadAllText(filepath)   去读取中文txt文件会遇到乱码问题,我自己测试了一下,ANSI编码的txt才会出 ...