life02

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  197 随笔 :: 3 文章 :: 37 评论 :: 0 Trackbacks
http://blog.csdn.net/louiswangbing/article/details/6607612

Intent妙用之编写自己的android主界面

众所周知,android的主界面名为 laucher2,功能强大,会在android启动之后运行,也是所有其他应用程序的入口程序。那么,如何让自己的应用程序取代laucher2的位 置,成为android系统的主界面呢?其实说出来很简单,接下来,我就来为大家揭开这其中的神秘面纱。

首先,我们来看看一个普通的应用程序的intent声明:

  1. <intent-filter>  
  2.              <action android:name="android.intent.action.MAIN" />  
  3.              <category android:name="android.intent.category.LAUNCHER" />  
  4.          </intent-filter>  
是不是看着很眼熟呢?没错了,这段代码是在AndroidManifest.xml中相应activity的intent声明,相信大家目前缩写的应用程序的intent声明无一例外都是这样的吧。可能很多人都会对着两行代码有下面的理解:

第二行<action android:name="android.intent.action.MAIN" />表示这个activity是当前应用程序的主activity,而第二行表示当前activity在lancher中加载。

这么理解的却是没错,但事实上,有更加简单的理解方式。这里请容许我先卖个关子。我们继续往下看。

既然是想让我们自己的应用程序取代laucher的位置,那么我们就来看一下lancher的intent声明是怎么样的吧:

  1. <intent-filter>  
  2.         <action android:name="android.intent.action.MAIN" />  
  3.         <category android:name="android.intent.category.HOME"/>  
  4.         <category android:name="android.intent.category.DEFAULT" />  
  5.         <category android:name="android.intent.category.MONKEY" />  
  6.     </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选择系统中满足过滤条件:

  1. <action android:name="android.intent.action.MAIN" />  
  2.         <category android:name="android.intent.category.HOME"/>  
  3.         <category android:name="android.intent.category.DEFAULT" />  
  4.         <category android:name="android.intent.category.MONKEY" />  
的 activity作为系统启动的第一个activity,也就是主界面,任何一个满足这个过滤条件的activity都将进入候选名单,如果候选名单中仅 有一人,那么很荣幸,不战而胜,你就是系统的主界面了;如果候选名单中有多个人(比如刚才说的有laucher和你自己的应用程序),那么就进入残酷的” 民意选举“,也就是用户自己的选择,你选谁系统就会启动谁。但和民意选举不同的是,选举出来的结果通常会有一定的任期,而这个主界面的选举任期非常的短, 每当你按下一次Home键或者重启一下系统,系统就会重新安排一次”民意选举“。如果想要永远的成为主界面,那么唯一的办法就是--没错,虽然很残酷,但 不得不说--就是,干掉它......或者和谐一点,你可以让它活着,但是也必须将它贬为庶民或者是将其发配边疆,具体的实施手段就是--改掉它的 intent声明,使其不满足主界面的这个过滤条件。

在 整个intent妙用章节中,这一章算是比较特殊的,因为虽然所有的章节运用的原理基本相通,也就是我上面说到的原理,但是后续章节的intent过滤条 件都是可以由用户自己定义、手动修改的,而唯独只有这个是不能改的,你只能决定去适应或者不适应这个过滤条件,而不能去改变这个过滤条件,就像你只能去适 应这个社会,却很难改变它--或许不是不能,而是暂时还能找到途径......

有时候真的,生活跟计算机,居然有如此之多的相似之处......


posted on 2011-12-07 23:26 life02 阅读(352) 评论(0)  编辑 收藏 引用 所属分类: android组件学习

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理