[High]android应用开发之intent的妙用一
相信做android应用开发的朋友对intent组件都已经是相当熟悉了,这里鄙人总结一下intent的妙用,希望对大家有帮助。
intent妙用之编写自己的android主界面
众所周知,android的主界面名为laucher2,功能强大,会在android启动之后运行,也是所有其他应用程序的入口程序。那么,如何让自己的应用程序取代laucher2的位置,成为android系统的主界面呢?其实说出来很简单,接下来,我就来为大家揭开这其中的神秘面纱。
首先,我们来看看一个普通的应用程序的intent声明:
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
是不是看着很眼熟呢?没错了,这段代码是在AndroidManifest.xml中相应activity的intent声明,相信大家目前缩写的应用程序的intent声明无一例外都是这样的吧。可能很多人都会对着两行代码有下面的理解:
第二行<action android:name="android.intent.action.MAIN" />表示这个activity是当前应用程序的主activity,而第二行表示当前activity在lancher中加载。
这么理解的却是没错,但事实上,有更加简单的理解方式。这里请容许我先卖个关子。我们继续往下看。
既然是想让我们自己的应用程序取代laucher的位置,那么我们就来看一下lancher的intent声明是怎么样的吧:
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.HOME"/>
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.MONKEY" />
- </intent-filter>
当然,想要看到这段代码,你必须要有laucher的源代码。(关于android源代码的问题,前面的文章已经提到过很多次了,有源代码真的是件很好的事情,不管是对应用程序开发者来说还是对底层开发者来说亦或是对android爱好者来说,都会受益匪浅的,所以这里再次建议大家不要仅仅局限于android sdk和avd的使用来进行应用程序的开发,不管你有没有时间,下份源代码总是没有坏处的。)
大家看出这两个intent声明之间的差别了吗?没错,当出现 <category android:name="android.intent.category.HOME"/> 的时候,我们的应用程序就会变成跟lancher具有相同功能的(当然,我指的仅仅是主界面,laucher的功能是在是太强大了),成为android系统的主界面,并且,当我们按下Home键的时候,会出现一个选择界面,是不是发现你的应用程序和laucher同时出现在了选择框中呢?如果是,那么恭喜你,从功能上来说,你已经实现了。如果没有看到,请email我louiswangbing@gmail.com。
但是,所谓一山不容二虎,同时有两个主界面存在当然不是我们想要的。
如果你有android源代码的话,你甚至可以把laucher删掉,直接将你自己的应用程序编译到android系统中,这样,系统启动的时候就会直接运行你的应用程序,而你的应用程序就会堂而皇之地鸠占鹊巢,顺理成章的成为系统的主界面,并且当你按下Home键的时候,就会跳到你的应用程序的主activity了!!
如果你只是一个功能上的追求者,那么看到这里你就可以关掉这个页面去试试上面的功能了。
如果你是一个好奇心比较强的人,那么请跟着我继续往下看。
刚才我说过,intent声明的理解问题。事实上,你可以有更好的理解方式,当然,这要建立在你对android系统的启动进程有一定的了解的基础上。
简单来说,intent其实就是一个条件过滤器,activity的intent声明的每一条都可以作为一个过滤条件,条目越多,过滤条件也就越强,定位起来也就越容易。相信这个原理学过数据库的朋友理解起来更加容易。你可以将整个android系统中所有的activity都集中起来当成是一个数据库,而intent本身就是一条select语句,其中每一项声明都是一项过滤条件,而过滤之后剩下的,就是将要被调用的activity。当过滤条件足够强大或者过滤条件比较特殊的时候,最后剩下的只有一个activity,那么系统会毫不犹豫地启动它;当过滤条件不足导致过滤之后还剩下比较多的activity的时候,系统会将满足这些条件的所有的activity用一个listview列出来让你选择。
相信原理大家都已经很清楚了,那么上面所述的这个功能就很好理解了。没错,android在启动的时候会有一个PackageManager选择系统中满足过滤条件:
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.HOME"/>
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.MONKEY" />
的activity作为系统启动的第一个activity,也就是主界面,任何一个满足这个过滤条件的activity都将进入候选名单,如果候选名单中仅有一人,那么很荣幸,不战而胜,你就是系统的主界面了;如果候选名单中有多个人(比如刚才说的有laucher和你自己的应用程序),那么就进入残酷的”民意选举“,也就是用户自己的选择,你选谁系统就会启动谁。但和民意选举不同的是,选举出来的结果通常会有一定的任期,而这个主界面的选举任期非常的短,每当你按下一次Home键或者重启一下系统,系统就会重新安排一次”民意选举“。如果想要永远的成为主界面,那么唯一的办法就是--没错,虽然很残酷,但不得不说--就是,干掉它......或者和谐一点,你可以让它活着,但是也必须将它贬为庶民或者是将其发配边疆,具体的实施手段就是--改掉它的intent声明,使其不满足主界面的这个过滤条件。
在整个intent妙用章节中,这一章算是比较特殊的,因为虽然所有的章节运用的原理基本相通,也就是我上面说到的原理,但是后续章节的intent过滤条件都是可以由用户自己定义、手动修改的,而唯独只有这个是不能改的,你只能决定去适应或者不适应这个过滤条件,而不能去改变这个过滤条件,就像你只能去适应这个社会,却很难改变它--或许不是不能,而是暂时还能找到途径......
有时候真的,生活跟计算机,居然有如此之多的相似之处......