万书网 > 文学作品 > Android从入门到精通 > 第73页

第73页




protected  void  onCreate(Bundle  savedInstanceState)  {



super.onCreate(savedInstanceState);



setContentView(R.layout.main);  //设置页面布局



Button  home  =  (Button)  findViewById(R.id.home_button);  //通过id值获得按钮对象



home.setOnClickListener(new  View.OnClickListener()  {  //为按钮增加单击事件监听器



@Override



public  void  onClick(View  v)  {



Intent  intent  =  new  Intent();  //创建Intent对象



intent.setAction(Intent.ACTION_MAIN);  //设置Intent动作



intent.addCategory(Intent.CATEGORY_HOME);  //设置Intent种类



startActivity(intent);  //将Intent传递给Activity



}



});



}



}





启动程序后,将显示如图6.3所示的界面。单击“返回Home”按钮,将显示如图6.4所示的系统Home桌面。





图6.3 应用主界面  图6.4 系统Home桌面





6.2 Intent使用

教学录像:光盘\TM\lx\6\Intent使用.exe

Intent可以分成显式和隐式两类。

显式Intent通过组件名称来指定目标组件。由于其他应用程序的组件名称对于开发人员通常是未知的,显式Intent通常用于应用程序内部消息,例如Activity启动子Service或其他Activity。

隐式Intent不指定组件名称,通常用于激活其他应用程序中的组件。

Android发送显式Intent到指定目标类的实例。Intent对象中,仅有组件名称对于发送给哪个组件影响至关重要。

对于隐式Intent,则需要使用不同的策略。在缺乏指定目标时,Android系统必须找到处理Intent的最佳组件——单个Activity或者Service来执行请求动作或者一组BroadcastReceiver来响应广播通知。它是通过比较Intent对象内容和Intent过滤器来实现的。Intent过滤器是与组件关联的结构,它能潜在地接收Intent。过滤器宣传组件的能力并划分可以处理的Intent,它们打开可能接收宣传类型的隐式Intent的组件。如果组件没有任何Intent过滤器,但仅能接收显式Intent;如果组件包含过滤器,则可以接收显式和隐式类型的Intent。

在使用Intent过滤器测试Intent对象时,对象中仅有3个方面与其相关:

[√]动作。



[√]数据(包括URI和数据类型)。



[√]种类。

额外和标记在决定哪个组件可以接收Intent时并无作用。

6.2.1 Intent过滤器

Activity、Service和BroadcastReceiver能定义多个Intent过滤器来通知系统它们可以处理哪些隐式Intent。每个过滤器描述组件的一种能力以及该组件可以接收的一组Intent。实际上,过滤器接收需要类型的Intent、拒绝不需要类型的Intent仅限于隐式Intent。对于显式Intent,无论内容如何,总可以发送给其目标,过滤器并不干预。

对于能够完成的工作及显示给用户的界面,组件都有独立的过滤器。

Intent过滤器是IntentFilter类的实例。然而,由于Android系统在启动组件前必须了解组件的能力,Intent过滤器通常不在Java代码中进行设置,而是使用标签写在应用程序的配置文件(AndroidManifest.xml)中(唯一的例外是调用Context.registerReceiver()方法动态注册BroadcastReceiver的过滤器,它们通常直接创建为IntentFilter对象)。

过滤器中包含的域与Intent对象中动作、数据和分类域相对应。过滤器对于隐式Intent在这3个方面分别进行测试。仅有通过全部测试时,Intent对象才能发送给拥有过滤器的组件。由于组件可以包含多个过滤器,Intent对象在一个过滤器上失败并不代表不能通过其他测试。下面对这些测试进行详细介绍。

1.  动作测试

配置文件中的标签将动作作为子标签列出,例如:

















.  .  .





如上所示,尽管Intent对象仅定义一个动作,在过滤器中却可以列出多个。列表不能为空,即过滤器中必须包含至少一个标签,否则会阻塞所有Intent。

为了通过该测试,Intent对象中定义的动作必须与过滤器中列出的一个动作匹配。如果对象或者过滤器没有指定动作,结果如下:

[√]如果过滤器没有包含任何动作,即没有让对象匹配的东西,则任何对象都无法通过该测试。



[√]如果过滤器至少包含一个动作,则没有指定动作的对象自动通过该测试。

2.  种类测试

配置文件中的标签将分类作为子标签列出,例如:













.  .  .





为了让Intent通过种类测试,Intent对象中每个种类都必须与过滤器中定义的种类匹配。在过滤器中可以增加额外的种类,但是不能删除任何Intent中的种类。

因此原则上讲,无论过滤器中如何定义,没有定义种类的Intent总是可以通过该项测试。然而,有一个例外。Android默认所有通过startActivity()方法传递的隐式Intent包含一个种类android.intent.  category.DEFAULT(CATEGORY_DEFAULT常量)。因此,接收隐式Intent的Activity必须在过滤器中包含android.intent.category.DEFAULT(包含android.intent.action.MAIN和android.intent.category.  LAUNCHER设置的是一个例外。它们标示Activity作为新任务启动并且显示在启动屏幕上,包含android.intent.category.DEFAULT与否均可)。