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

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

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

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

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

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

  1. <intent-filter>
  2. <actionandroid:name="android.intent.action.MAIN"/>
  3. <categoryandroid:name="android.intent.category.HOME"/>
  4. <categoryandroid:name="android.intent.category.DEFAULT"/>
  5. <categoryandroid:name="android.intent.category.MONKEY"/>
  6. </intent-filter>
当 然,想要看到这段代码,你必须要有laucher的源代码。(关于android源代码的问题,前面的文章已经提到过很多次了,有源代码真的是件很好的事 情,不管是对应用程序开发者来说还是对底层开发者来说亦或是对android爱好者来说,都会受益匪浅的,所以这里再次建议大家不要仅仅局限于 android sdk和avd的使用来进行应用程序的开发,不管你有没有时间,下份源代码总是没有坏处的。)

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

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

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


更多相关文章

  1. 第1章 Android应用与开发环境
  2. ym——Android从零开始(5)(文件操作+日记+单元测试)(新)
  3. 定制替换Android桌面
  4. Android(安卓)Asynchronous Http Client-Android异步网络请求客
  5. android之蓝牙开发续(自动配对)
  6. android 运用取消默认的window preview
  7. 破解Xamarin
  8. Android(安卓)ui utils-简单实用的Android界面工具
  9. [Android(安卓)Training视频系列]1.2 Running Your App

随机推荐

  1. Android之网络请求1————HTTP协议
  2. Android(安卓)sdk manager无法启动之swt.
  3. Android[中级教程]第八章 Json数据的处理
  4. RMS认为Android没有尊重用户自由
  5. Android(安卓)Studio NDK JNI开发入门记
  6. Android(安卓)Building System 总结 收藏
  7. 创建Android虚拟设备(AVD)
  8. Android横竖屏布局总结
  9. Android中几种图像特效处理的集锦!!
  10. android介绍