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. 从源码层面解析SpringIOC容器

    Spring IOC容器继承关系图 MessageSource支持消息国际化.ResouceLoader资源加载.BeanFactory创建Bean.ApplicationEventPublisher ...

  2. str_split 分隔中文出现乱码 替代函数

    function mbstringtoarray($str,$charset) { $strlen=mb_strlen($str); while($strlen){ $array[]=mb_subst ...

  3. 浅谈js中的垃圾两种回收机制

    一.标记清除 标记清除的主要思想是先建立各个对象的关联,然后从根节点出发,使用广度优先搜索依次标记所有对象,那些不能被标记的对象就应该作为垃圾回收. 这种方式的主要缺点就是如果某些对象被清理后,内存是 ...

  4. 实现Date函数属性中的format方法

    js中没有Date.format方法的,所以在date属性中加format方法 //js格式化属性 Date.prototype.format = function (format) { var o ...

  5. Oracle JDBC 连接方式

    格式一:  Oracle JDBC Thin using a ServiceName jdbc:oracle:thin:@//<host>:<port>/<service ...

  6. R语言数组array函数

    数组是一个可以在两个以上的维度存储数据的R数据对象.例如 - 如果创建尺寸(2,3,4)的数组,那么创建4个矩形矩阵每2行3列.数组只能存储数据类型. 使用 array()函数创建数组.它需要向量作为 ...

  7. Python 获取Kmeans聚类结果每一类的数据

    获取聚类结果中每一类的数据,该数据类型是DataFrame 思路:获取clf_KMeans的标签,我这里是聚三类,标签就是0,1,2 将Label转成Series类型,再筛选出指定标签的res0,我筛 ...

  8. 【C#高级】泛型(一)

    泛型,.net 2.0之后出现,基本只要代码中出现 ‘<>’ 尖括号就可以确定是泛型. 在2.0之前大多是使用Object来代替,因为所有类都是Object的派生类,根据继承的原理Obje ...

  9. 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用

    使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...

  10. jquery对象与dom对象之间互相转换的方法

    本文主要讲述jquery对象和js里的dom对象之间互相转换的方法,使jquery对象可以直接使用js里的方法,或js里的dom对象使用jquery里的方法. jquery对象和dom对象是不一样的, ...