[高级]android应用开发之intent的妙用二
相信做android应用开发的朋友对intent组件都已经是相当熟悉了,这里鄙人总结一下intent的妙用,希望对大家有帮助。
intent妙用之列出所有已安装的应用程序列表
装载:http://blog.csdn.net/android_tutor/article/details/5724634
这篇文章写的很好,既说明了方法,也给出了实例,但是很可惜的是,并没有说明其中的原理。
这里,看过我上一篇文章的朋友相信已经能够自己分析得出答案了!
没错,其实所有的这些应用程序列表也就是一个过滤之后满足过滤条件的activity!而这个过滤条件通常是:
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
即对应着上面转载文章当中的函数:
- public void bindAllApps(){
- //这里是关键哦,我们平时写的应用总有一个activity申明成这两个属性
- //也就是应用的入口
- Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
- mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
- //符合上面条件的全部查出来,并且排序
- mAllApps = mPackageManager.queryIntentActivities(mainIntent, 0);
- Collections.sort(mAllApps, new ResolveInfo.DisplayNameComparator(mPackageManager));
- }
很容易看明白,4、5两行就是定义的这个过滤条件,其中Intent.ACTION_MAIN对应着<action android:name="android.intent.action.MAIN" />,Intent.CATEGORY_LAUNCHER对应着<category android:name="android.intent.category.LAUNCHER" /> ,这个对应关系是系统定义的。当然,这个对应关系其实也可以自己自定义,后续章节会介绍,这里略过。而今跟着的后面两句就是查询和列出符合条件的activity了。这里需要注意到是,并不是所有的应用程序intent声明都能满足这个过滤条件的,比如说大家喜闻乐见的Adobe 的Flashplayer浏览器插件就不是这样的,这也是为什么大家将这个插件安装到手机上却不能显示在主界面应用程序列表里面的原因。
带着我上一篇文章里面讲到的原理,这部分的理解就显得异常简单了。
当然啊,到这里也只是完成了列出所有满足过滤条件的应用列表而已,想要点击这个列表就能进入相应的应用程序,还有接下来的工作要做。
参照我转载的这篇文章来说,函数功能是这样实现的:
- //gridview点击事件,点击进入相关应用
- @Override
- public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- // TODO Auto-generated method stub
- ResolveInfo res = mAllApps.get(position);
- //该应用的包名和主Activity
- String pkg = res.activityInfo.packageName;
- String cls = res.activityInfo.name;
- ComponentName componet = new ComponentName(pkg, cls);
- Intent i = new Intent();
- i.setComponent(componet);
- startActivity(i);
- }
在具体说明原理之前,有一个前提条件大家必须要记住,那就是在android系统中,是不允许有两个包名完全相同的应用程序存在的,如果两个程序的包名和包里面的内容完全一样,后来的将会覆盖原有的,这也是为什么android应用开发不需要卸载之前的应用程序而直接修改源代码再运行就可以覆盖的原因。
有了这个前提条件之后,接下来,我们看看这段代码。其实,这里也是intent的一个妙用。前面的那些过滤条件,我们称之为隐式intent,因为将会过滤出哪些或者多少满足条件的activity,我们都是不知道的。而这里的intent使用,我们称之为显示intent,因为它的过滤条件十分强大,近似一个指针,直接指向一个独一无二的应用,并且在指定的时候就已经知道它是谁,而且知道它肯定是独一无二的。
其实很简单,刚才已经说过 了,因为android中不允许有相同的包名出现,也就是说所有的包名都是独一无二的,那么只要指定intent过滤条件为相应的包名和activity名,一切也就迎刃而解了。从数据库原理的角度来理解,列出所有满足条件的列表之后,第N条的数据是什么已经可以看见了,这时候只需要将过滤条件设置主键值为第N条的那个主键值就可以唯一定位到那条数据了。
上面的代码到第13行的时候,intent i所包含的activity就只剩下一个了,剩下的工作只需要启动它就行了,startActivity(i),一切顺理成章。