Intent简介

Intent是一种消息传递机制,作用:

  • 使用类名显示启动一个特定的Service或Activity
  • 启动Activity或Service来执行一个Intent
  • 广播某个事件已经发生

使用Intent启动Activity

显式启动Activity

Intent intent = new Intent(MyActivity.this, MyOtherActivity.class);
startActivity(intent);

调用新Activity的finish或按下返回按钮将关闭该Activity,并出栈。

隐式的Intent和运行时绑定

隐式调用,就是让匿名的应用程序组件响应动作请求。如拨打电话:

Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:xxxx"));
startActivity(intent);

隐式调用需要一个执行的动作,也可提供执行动作需要的数据URI。还可以通过向Intent添加extra来向目标Activity发送数据。

确定Intent能否解析

有的时候需要判断intent能否解析:

PackageManager pm = getPackageManager();
ComponentName cn = intent.resolveActivity(pm);

从Activity返回结果

调用startActivityForResult,回调为onActivity。如选取联系人:

Uri uri = Uri.parse("content://contacts/people");
Intent intent = new Intent(Intent.ACTION_PICK,uri);
startActivityForResult(intent,REQUEST_CODE);

然后请求完成后:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//处理返回的结果
}

Android 原生Action

  • ACTION_ALL_APPS 打开一个列出所有已安装应用程序的Activity
  • ACTION_ANSWER 打开一个处理来电的Activity
  • ACTION_BUG_REPORT 显示一个可以报告bug的Activity
  • ACTION_CALL 打开一个电话拨号程序
  • ACTION_CALL_BUTTON 用户按下拨打按钮触发,调用拨号Activity
  • ACTION_DELETE 启动一个Activity,允许删除Intent数据URI中指定的数据
  • ACTION_DIAL 打开一个拨号程序
  • ACTION_EDIT 请求一个Activity,要求该Activity可以编辑Intent的数据URI中的数据
  • ACTION_INSERT 打开一个能够在Intent的数据URI指定的游标处插入新项的Activity
  • ACTION_PICK 启动一个子Activity,可以从Intent的数据URI指定的Content Provider中选择
  • ACTION_SEARCH 通常用于启动特定的搜索Activity
  • ACTION_SEARCH_LONG_PRESS 允许截获对硬件搜索键的长按操作
  • ACTION_SENDTO 启动一个Activity来向Intent的数据URI所指定的联系人发送消息
  • ACTION_SEND 启动一个Activity,该Activity会发送Intent中指定的数据
  • ACTION_VIEW 视图要求以最合理的方式查看Intent的数据URI中提供的数据
  • ACTION_WEB_SEARCH 打开一个浏览器,进行搜索

使用Intent广播事件

Intent可以在进程之间发送结构化的消息,可以通过实现Broadcast Receiver来监听和响应应用程序内的Broadcast Intent。

广播Intent:

Intent intent = new Intent();
intent.putExtra(key, value);
sendBroadcast(intent);

处理广播Intent:

private class MyBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
//处理事件
}
}

注册广播两种方式:

代码中注册

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(action);
//注册
registerReceiver(receiver,intentFilter);
//取消注册
unregisterReceiver(receiver);

Manifest注册

<receiver android:name=".MyBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
</intent-filter>
</receiver>

这种方式Receiver总是活动的,并且一直可以接受广播事件。

广播有序的Intent

sendOrderdBroadcast可以按照优先级顺序发送广播事件。

<receiver android:name=".MyBroadcastReceiver">
<intent-filter>
android:priority = "100">
<action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
</intent-filter>
</receiver>

广播Sticky Intent

Sticky Intent可以保存它们最后一个广播的值,一旦有新的接收器被注册为接收该广播时,它们会把这些值作为Intent返回。使用sendStickyBroadcast广播,删除使用removeStickyBroadcast。

Pending Intent

Pending Intent用于包装在响应将来的事件时触发的Intent。

Intent intent = new Intent(this,MyOtherActivity.class);
PendingIntent.getActivity(this,requestCode,intent,flags); Intent intent = new Intent(this,MyService.class);
PendingIntent.getService(this,requestCode,intent,flags); Intent intent = new Intent();
PendingIntent.getBroadcast(this,requestCode,intent,flags);

创建Intent Filter

使用Intent Filter为隐式Intent提供服务

Intent Filter标签:

  1. action 服务的动作标签,唯一字串
  2. category 指定提供服务的情况
    • ALTERNATIVE 在特定数据类型上执行的默认动作的可选项
    • SELECTED_ALTERNATIVE 与ALTERNATIVE类似,但是要求可以有多种可能性
    • BROWSABLE 指定浏览器内部可用的动作
    • DEFAULT 默认动作
    • HOME 作为本地屏幕的可选项
  3. data data标签允许指定组件可以执行的数据类型:
    • android:host 指定一个有效的主机名
    • android:mimetype 指定组件可以执行的数据类型
    • android:path 指定URI的有效路径
    • android:port 指定主机的有效端口
    • android:scheme 要求一种特定的模式(如http)

Android解析Intent Filter

  1. Android将安装包的可用Filter放到一个列表中
  2. 从列表中移除在解析Intent时相关联的动作或者类别不匹配的Intent Filter
  3. Intent的数据URI的每一个部分都和Intent Filter的data标签进行比较

监听本地Broadcast Intent

可以监听系统事件,然后进行自己程序的相应动作,经常使用的系统事件:

  • ACTION_BOOT_COMPLETED 系统完成启动后,会触发这个动作
  • ACTION_CAMERA_BUTTON 当单击拍照按键时触发
  • ACTION_DATE_CHANGED 和ACTION_TIME_CHANGED 日期和时间被手动修改,或触发
  • ACTION_MEDIA_EJECT 用户弹出外部存储,会触发,如果正在操作外部存储,记得保存和关闭文件句柄
  • ACTION_MEDIA_MOUNTED和ACTION_MEDIA_UNMOUNTED 新的外部存储成功添加或者移除,会触发
  • ACTION_NEW_OUTGOING_CALL 向外拨打电话就会触发
  • ACTION_SCREEN_OFF和ACTION_SCREEN_ON 屏幕关闭或者打开时触发
  • ACTION_TIMEZONE_CHANGED 时区改变会触发

有的时候需要在运行时管理Manifest Receiver

使用PackageManager.setComponentEnabledSetting(ReceiverName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED,PackageManager.DONT_KILL_APP)启用一个Receiver

使用PackageManager.setComponentEnabledSetting(ReceiverName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP)禁用一个Receiver

Intent和BroadcastReceiver的更多相关文章

  1. Android四大组件之—— BroadcastReceiver的使用

    BroadcastReceiver又名广播接收者.既然它用于接收广播,那一定就有人负责发送. Android系统中的广播: 在现实生活中,我们都知道广播是什么,用来做什么.例如公园里的广播,主要通知游 ...

  2. Android(java)学习笔记173:BroadcastReceiver之 静态注册 和 动态注册

    1. 广播接受者>什么是广播.收音机.电台:对外发送信号.收音机:接收电台的信号. >在android系统里面,系统有很多重要的事件: 电池电量低,插入充电器,sd卡被移除,有电话打出去, ...

  3. (八)Android广播接收器BroadcastReceiver

    一.使用Broadcast Reciver 1.右击java文件夹,new->other->Broadcast Receiver后会在AndroidManifest.xml文件中生成一个r ...

  4. 笔记:BroadcastReceiver的运行过程

    广播概述 广播用来在组件之间传递消息,可以是同进程或跨进程. 广播机制是基于发布订阅的事件驱动模型,使用上比Binder通信(跨进程接口回调)更低耦合.简单. ActivityManagerServi ...

  5. Android BroadcastReceiver解析

    目录   示意图 1. 定义 即 广播,是一个全局的监听器,属于Android四大组件之一 Android 广播分为两个角色:广播发送者.广播接收者 2. 作用 监听 / 接收 应用 App 发出的广 ...

  6. Android 四大组件之“ BroadcastReceiver ”

    前言 Android四大组件重要性已经不言而喻了,今天谈谈的是Android中的广播机制.在我们上学的时候,每个班级的教室里都会装有一个喇叭,这些喇叭都是接入到学校的广播室的,一旦有什么重要的通知,就 ...

  7. BroadcastReceiver广播相关 - 转

    BroadcastReceiver广播接收者用于接收系统或其他程序(包括自己程序)发送的广播. 一.注册广播 在android中,我们如果想接收到广播信息,必须自定义我们的广播接收者.要写一个类来继承 ...

  8. Android API之android.content.BroadcastReceiver

    android.content.BroadcastReceiver Base class for code that will receive intents sent by sendBroadcas ...

  9. Intent 对象在 Android 开发中的应用

    转自(http://www.ibm.com/developerworks/cn/opensource/os-cn-android-intent/) Android 是一个开放性移动开发平台,运行在该平 ...

随机推荐

  1. nRF51822EK_PRO

    ARMCC5LIB = C:\Keil\ARM\ARMCC\lib dd if=/dev/zero of=tmp.500M bs=500M count=1 Developer Home

  2. iterm自动登录ssh脚本

    经常在工作中需要切换到不同的服务器去部署,或者查看日志,每次登录都要去找对应的IP和地址,非常麻烦,最终决定使用iterm2+脚本来实现自动登录. 1.iterm2(下载安装不再介绍http://ww ...

  3. django notes 四: Writing views

    views 其实没什么可看的, 在  django  中 views 就是 controller, 是处理请求的, 就是一个普通的 python 方法. 一般从 request 中提取请求参数, 然后 ...

  4. 关于chrome下的bug

    最近看了大神的一篇文章,于是尝试了一下里面说的bug以及修复 1.Chrome下absolute绝对定位元素部分display属性值不渲染bug 首先还原一下bug.. ff下的下效果 点击按钮后的效 ...

  5. struts2 servlet之间通信

    Servlet之间通信的方式有两大类,每个类有三种不同的方法 1.request 2.session 3.application 不实现ServletContextAware,SessionAware ...

  6. oracle用plsql登陆出错,提示ORA-12170:TNS:链接超时 --------关闭防火墙试试

    oracle用plsql登陆出错,提示ORA-12170:TNS:链接超时 但是使用sqlplus可以连接 ping 本机127.0.0.1 显示一般故障 后关闭防火墙,问题解决. ps:登录时使用@ ...

  7. ES6常用七大特性

    ES6可谓是对JS语言的一个颠覆性改变,增加了Module改善JS一直被诟病的模块化.Promise解决异步函数的回调地狱.Class的面相对象编程... 在学习ES6的过程中,大家或多或少都有看过阮 ...

  8. 从父子组件的mounted钩子的同步执行与页面的异步渲染看nextTick的用法

    最近复习vue的时候遇到了一个很奇怪的问题,我们直接从实例中看: <div id="app"> <child ref="child">& ...

  9. Implicit super constructor xx() is undefined for default constructor. Must define an explicit constructor

      错误:Implicit super constructor xx() is undefined for default constructor. Must define an explicit c ...

  10. 基于node安装gulp-一些命令

    1.win+r:进入cdm 2.node -v:查询是否安装node 3.npm install -g gulp:安装gulp 4.gulp -v:查看是否安装gulp 5.cd desk:进入桌面 ...