Intent实现组件之间通信

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);
}

@Override
protected 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>
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值