Android之ResolveInfo

来源:互联网 发布:淘宝客怎么注册买家 编辑:程序博客网 时间:2024/06/05 15:04

\samples\ApiDemos中含有大量的代码,其中首页ListActivity中核心代码如下:

List myData = new ArrayList();Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);mainIntent.addCategory(Intent.CATEGORY_SAMPLE_CODE);PackageManager pm = getPackageManager();List list = pm.queryIntentActivities(mainIntent, 0);

实际上就是设置Intent,检索我们可能需要的Activities,结果存放在一个List中。在这里需要说明下Intent.CATEGORY_SAMPLE_CODE ,

public static final String CATEGORY_SAMPLE_CODE = "android.intent.category.SAMPLE_CODE";

实际上是定义了一个新的Category,然后在AndroidMasnifest.xml定义Activity中增加这种新的定义:

<category android:name=”android.intent.category.SAMPLE_CODE” />

这就是我们检索的“特殊”标志。

看到ResolveInfo,想必应该就是Activity信息的集合,到Android SDK中查看其详细说明:ResolveInfo就是解析intent过程中返回的信息,实际上就是AndroidManifest.xml 标签的信息,例举AndroidManifest.xml 中一个具体Aactivity标签的信息,如下:

<activity android:name=”.app.HelloWorld” android:label=”@string/activity_hello_world”><intent-filter><action android:name=”android.intent.action.MAIN” /><category android:name=”android.intent.category.SAMPLE_CODE” /></intent-filter></activity>
ResolveInfo实际上就是一个数据的集合,主要数据结构如下:


看到这些数据结构,就明白多了,详细信息还是到Android SDK中仔细阅读吧!如果我们将Activity的信息输出,显示如下:


获取Activity的链表并读取Activity的信息后,剩下的就是信息的检索:按照当前的路径,在Activity的链表中检索包含在这个路径的子文件夹或Activity,代码如下:

Intent activityIntent(String pkg, String componentName) /*相当与子文件夹*/{Intent result = new Intent();result.setClassName(pkg, componentName);return result;}Intent browseIntent(String path) /*相当与子文件夹*/{Intent result = new Intent();result.setClass(this, ApiDemos.class);result.putExtra(“com.example.android.apis.Path”, path);return result;}
其中activityIntent ()相当与文件,单击后启动这个Activity;browseIntent()相当与子文件夹,单击后需要继续检索包含在这个路径下的子文件夹或者Activity。这里采用了递归算法,例如,当path =“ ..\content\”,检索的信息输出如下:


看了上面程序运行过程中的输出信息,以及代码核心的解析,估计大家对程序的整体都会有个比较全面的认识了,轻松阅读代码的细节。

总结说明

ApiDemos类似于检索文件夹中包含的子文件夹或文件(实际上是Java中的Package),有了这个思路,分析这个程序就简单多了。在其中也学习到了很多新的知识,这些都是在Android SDK中没有说明的,毕竟Android SDK不可能面面俱到的,所以去深入学习Android SDK中包含的例子,会有很多新的收获。
当然ApiDemos中包含了大量的使用实例例子,这里先介绍整个程序的核心,起到抛砖引玉的作用,学习过程中发现一些经典的实例与大家慢慢分享。


参考:http://www.moandroid.com/?p=1095