Intent
Intent 会在运行时将各个组件相互绑定(您可以将 Intent 视为从其他组件请求操作的信使),无论组件属于您的应用还是其他应用。
- Intent是Android程序中各组件之间交互的重要方式,不仅可指明当前组件想要的动作,还能在不同组件间传递数据。
- Intent包含的部分:组件名称,操作,数据,类别,
Extra
,标志
显式Intent
- 显式Intent指定明确的上下文和要转到的活动的
class
对象1
2
3
4
5
6
7
8Intent(Context packageContext, Class<> cls)//第二个参数指定想要启动的目标活动
button1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this, SecondActivity.class); startActivity(intent);
}
});
隐式Intent
系统通过将接收到的 Intent 与设备上的其他应用的清单文件中提供的 Intent 过滤器进行比较来确定可以响应 Intent 的组件。
- 隐式Intent不会指定特定的组件,而是声明要执行的常规操作,从而允许其他应用中的组件来处理它。创建隐式Intent时,Android系统通过将Intent的内容与在设备上其他应用的清单文件中声明的Intent过滤器进行比较,从而找到要启动的相应组件。如果Intent与
Intent过滤器
匹配,则系统将启动该组件,并向其传递Intent对象。如果多个Intent过滤器
兼容,则系统会显示一个对话框,支持用户选取要使用的应用。Intent过滤器
是应用清单文件中的一个表达式,它指定该组件要接收的Intent类型。例如,通过为Activity声明Intent过滤器
,您可以使其他应用能够直接使用某一特定类型的Intent启动Activity。同样,如果您没有为Activity声明任何Intent过滤器
,则Activity只能通过显式Intent启动。只有Intent过滤器
的action
标签与catogory
标签同时与Intent中指定的action
和category
匹配时活动才能响应该Intent。
1
2
3
4
5
6
7
8
9
10 button1.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
Intent intent = new Intent("com.example.activitytest.ACTION_START");
//此处使用Intent的另一个构造函数,传入action字符串即可。
startActivity(intent);
//"android.intent.category.DEFAULT"是一种默认的category,调用startActivity()方法时会自动将其添加到Intent中。
//或intent.addCategory("categoryName");来添加category
}
});
还可以利用隐式Intent启动其他应用程序内的活动,比如分享到其他App,打开网页等操作。
1
2
3
4
5
6
7
8
9
10button1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_VIEW);
//这是Android系统内置的一个动作,其常量值为android.intent.action.VIEW
intent.setData(Uri.parse("http://www.baidu.com"));
//通过Uri.parse()方法将网址字符串解析成Uri对象,使用setData()方法把URI赋给Intent。(Intent的Data使用URI来表示)
startActivity(intent);
}
});在
AndroidManifest.xml
文件中,可以为活动的Intent过滤器
指定额外的<data>
标签限定活动能响应的URI类型。只有<data>
标签中指定的内容和Intent中携带的Data完全 一致时,当前活动才能够响应该Intent。以下是常用的标签内容:- android:scheme。用于指定数据的协议部分,如http,geo(地理位置),tel(拨打电话)等。
- android:host。用于指定数据的主机名部分,如www.baidu.com。
- android:port。用于指定数据的端口部分,一般紧随在主机名之后。
- android:path。用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容。
- android:mimeType。用于指定可以处理的数据类型,允许使用通配符的方式进行指定。
- 可以使用Intent在启动活动的同时传递数据。
- 把需要传递的数据用
putExtra()
方法存放在Extra
中 - 在另一个活动中用
getIntent()
方法取得传来的Intent - 用
getStringExtra()
方法取回数据(其他类型类似)
- 把需要传递的数据用
也可以使用Intent给上一个活动返回数据。开发文档中有一个
startActivityForResult()
方法用于启动活动并向上一个活动返回数据。- 给它传递一个启动活动用的Intent和一个唯一的
requestCode
参数 - 在另一个活动中用另一个Intent的
Extra
携带要返回的信息 - 用setResult()方法设置传回Intent和结果(
RESULT_OK
或RESULT_CANCELED
) - 用
finish()
方法结束当前活动并传回Intent - 返回到上一个活动后会回调
onActivityResult()
方法,重写该方法添加从中得到返回的数据的逻辑 - 注意“返回到上一个活动时”包含所有返回的情况,如按Back键等,在按Back键返回的情况下需要重写
onBackPressed()
方法来执行setResult()
方法。(此时super.onBackPressed()
要写在最后)
- 给它传递一个启动活动用的Intent和一个唯一的
更多Intent的例子会在之后的广播中遇到。