Intent实现组件之间通信

来源:互联网 发布:windows的应用 编辑:程序博客网 时间:2024/05/26 09:54

1、Intent定义

    Intent是一个消息传递对象,通过Intent可以从其他应用组件请求操作。也就是说Intent(意图)是Android四大组件的通信桥梁。

2、Intent实现组件之间通信的三种基本方式

1、启动Activity
(1)通过startActivity()的形式,Intent还可能携带少量供所启动Activity使用的数据
Intent itent = new Intent(this,SecondActivity.class);
intent.putExtra(Intent.EXTRA_EMALL,recipientArray);
startActivity(intent);

(2)通过startActivityForResult()的形式,这种方式要在 Activity 的 onActivityResult() 回调中
举个栗子:有如下需求,用户要在某个时刻去获得联系人中的一个联系人

    private void pickContact() {    Intent intent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI);    startActivityForResult(intent, PICK_CONTACT_REQUEST);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {    //如果请求没有异常,并且requestCode是PICK_CONTACT_REQUEST    if (resultCode == Activity.RESULT_OK && requestCode == PICK_CONTACT_REQUEST) {       //在这里查询联系人的content provider并实现自己想要的功能}

2、启动 Service
Service 是一个不使用用户界面而在后台执行操作的组件。通过将 Intent 传递给 startService(),您可以启动服务执行一次性操作(例如,下载文件)。Intent 描述了要启动的服务,并携带了任何必要的数据。
ps:为了安全性,启动Service的时候,要始终使用显示Intent,而且不能为Service声明Intent-filter。从Android 5.0(API级别21)开始,使用隐式Intent调用bindService(),系统会发生异常。

3、传递广播
Service 是一个不使用用户界面而在后台执行操作的组件。通过将 Intent 传递给 startService(),您可以启动服务执行一次性操作(例如,下载文件)。Intent 描述了要启动的服务,并携带了任何必要的数据。


3、Intent的主要属性

1、ComponentName(组件名称)
指的就是目标组件的名称,由包名+组件全限定类名组成,只有在显示Intent中才需要指定ComponentName;

ComponentName componentName = new(MainActivity.this,SecondActivity.class);Intent intent = new Intent();intent.setComponent(componentName);//在本质上和下面的语句是等价的Intent intent = new Intent(MainActivity.this,SecondActivity.class);

2、Action(操作)
指定要执行的通用操作的字符串。这个“操作”往往是抽象的,至于哪个组件来完整就要交给Intent-filter来筛选了
ps: 在Java中的Action和Intent-filter中的格式是不一样的

intent.setAction(Intent.CALL_ACTION);

3、Data(数据)
引用待操作数据和/或该数据 MIME 类型的 URI(Uri 对象)。创建 Intent 时,除了指定 URI 以外,指定数据类型(其 MIME 类型)往往也很重要。例如,能够显示图像的 Activity 可能无法播放音频文件。因此,指定数据的 MIME 类型有助于 Android 系统找到接收 Intent 的最佳组件。但有时,MIME 类型可以从 URI 中推断得出,特别当数据是 content: URI 时尤其如此。这表明数据位于设备中,且由 ContentProvider 控制,这使得数据 MIME 类型对系统可见。

要仅设置数据 URI,请调用 setData()。Data的URI对象格式:scheme://host:port/path
要仅设置 MIME 类型,请调用 setType()。只要是xxx/xxx的格式就行。
在Java代码中同时调用上述函数,会相互覆盖,可以使用 setDataAndType() 同时显式设置二者。
在AndroidManifest.xml中,着两个属性都是在data标签中的:

4、显式Intent和隐式Intent比较

显式Intent:
要通过显式的指定组件名来启动组件startActivity(MainActivity.this,SecondActivity.class);第一个参数是Context上下文,第二个参数就是组件名,每次只能指定一个。
核心代码:

Intent intent = new Intent();intent.setAction(Intent.ACTION_VIEW);intent.setData(Uri.parse("http://www.baidu.com"));startActivity(intent);

这里写图片描述

隐式Intent:
通过为Intent指定的Action,Data和Category属性,逐个匹配AndroidManifest.xml相关组件的Intent-filter,只有一个满足时,就跳转;多个满足时,就弹出对话框进行选择。
栗子:
MainActivity中的核心代码:

 Intent intent = new Intent(); intent.setAction("my_action"); intent.addCategory("my_category"); startActivity(intent);

SecondActivity中的intent-filter

<intent-filter>     <action android:name="my_action"/>     <category android:name="android.intent.category.DEFAULT"/>     <category android:name="my_category"/></intent-filter>
  • 参考
  • http://www.runoob.com/w3cnote/android-tutorial-intent-base.html
  • 郭霖《第一行代码》(第二版)
  • Bill Phillips 《Android编程权威指南》(第二版)
0 0
原创粉丝点击