ApiDemos(一) —— 初识ApiDemos
最近开始研究Android,基础部分看得个大概,在这方面的教程和心得也比较的杂,还是决定一步一步跟着官方的实例来逐步深入android.
官方实例可以在安装SDK时勾选下载,通过新建Android项目(从已有项目新建)来导入源代码。官方的实例分为许多大类,层层深入,其中Android开发最基础的包和类的运用几乎囊括在ApiDemos之中。
将ApiDemos在模拟器中启动,会发现其并不是按照每个单独的实例分别需要多次安装启动,ApiDemos有一个统一的管理界面,也就是所谓的ListActivity,其实现类就是ApiDemos项目的入口类ApiDemos.java(此处有两种解释,实际上ApiDemos只是一个入口Activity,从根本上来说,ApiDemosApplication才是整个项目的入口类,ApiDemosApplication中进行了程序的初始化操作,实际上它所作的是用户喜好设定等的初始化操作。)
ApiDemos代码如下,根据自身理解,已经为其添加了部分注释:
所有预先在AndroidMainfest.xml中定义的Activity都可以根据ApiDemos以特定的规则匹配的到,目前为止,所有的Activity实际上以一种直观的层级结构展现.这便是ApiDemos所做的工作.
现在问题是,如果需要重新写一个类似于ApiDemos的统一管理入口ListActivity,可以直接copy代码解决么?
实验了一下,如果直接copy代码,表面来看是可行的,但是深入了解,却发现这种方法在某种程度上还是有些许缺憾.
我的新项目MyActivity的AndroidMainfest.xml定义如下:
我定义了3个和Apidemos不同的Activity,获取Activity的代码如下:List<Map> myData = new ArrayList<Map>(); Intent intent = new Intent(Intent.ACTION_MAIN, null); intent.addCategory(Intent.CATEGORY_SAMPLE_CODE); intent.addCategory(Intent.CATEGORY_TEST); PackageManager pm = getPackageManager(); List<ResolveInfo> list = pm.queryIntentActivities(intent, 0);
一切就绪后,在模拟器上运行该程序.得到的结果有两种,但无非都不是预期的结果.
关键问题是在通过Intent查找Activity时,因为新项目中使用的IntentFilter和ApiDemos中相同,在查找Activity时,系统不仅会查找出新定义的3个Activity,还会一并查询出ApiDemos中定义的条件匹配的Activity,所以造成了可能会产生的非预期结果.
目前来说,我并未找到一个合适的方法来避免这种状况的发生,只能用一种很不贴切的方式来解决这一问题,那就是在.xml中Activity的intent-filter中添加另外的CATEGORY来作为查询条件,但是由此产生的Filter问题又会随之而生.目前还未发现合适的解决办法.
就到这里,这算是ApiDemos入口Activity的一个整体概述了. 1 楼 dwpcny 2011-04-23 很贴切的分析 不错的文章 希望楼主能够继续坚持 期待新的文章 谢谢