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代码中进行设置,而是使用
过滤器中包含的域与Intent对象中动作、数据和分类域相对应。过滤器对于隐式Intent在这3个方面分别进行测试。仅有通过全部测试时,Intent对象才能发送给拥有过滤器的组件。由于组件可以包含多个过滤器,Intent对象在一个过滤器上失败并不代表不能通过其他测试。下面对这些测试进行详细介绍。
1. 动作测试
配置文件中的
. . .
如上所示,尽管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与否均可)。