Intent简介
Intent是一种轻量级的消息传递机制,有以下用途
- 用于组件之间的数据交换
Activity、Service和BroadcastReceiver的数据交互
启动Activity和Service - 发送广播消息
应用程序广播消息和系统广播消息(手机信号变化、电池电量变化)
启动Activity
应用程序一般都有多个Activity,Intent可以实现不同Activity之间的切换和数据传递
- 启动Activity方式
显式启动
必须在Intent中指明启动的Activity所在的类
Intent intent =new Intent(MainActivity.this,Second.class);
startActivity(intent);
隐式启动
根据Intent的动作和数据来决定启动哪一个Activity,选择权由Android系统和最终用户来决定。选择隐式启动Activity,Android系统会在程序运行时解析Intent,并根据一定的规则对Intent和Activity进行匹配,使Intent上的动作、数据与Activity完全吻合。
匹配的组件可以是程序本身的Activity,也可以是Android系统内置的Activity,还可以是第三方应用程序提供的Activity。
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.baidu.com"));
startActivity(intent);
获取Activity返回值
步骤如下:
1. 创建子Activity的xml文件;
2. 创建子Activity的java代码;
3. 在manifest文件中注册子Activity;
4. 在主Activity代码中启动子Activity;
int SUBACTIVITY1 = 1;
Intent intent = new Intent(this, SubActivity1.class);
startActivityForResult(intent, SUBACTIVITY1);
5. 设置子Activity的返回值;
Uri data = Uri.parse("tel:" + tel_number);
Intent result = new Intent(null, data);
result.putExtra("address", "JD Street");
setResult(RESULT_OK, result);
finish();
setResult()函数有两个参数,“结果码”和“返回值”。结果码表明了子Activity的返回状态,通常为Activity.RESULT_OK(正常返回数据)或者Activity.RESULT_CANCELED(取消返回数据),也可以是自定义的结果码,结果码均为整数类型。
返回值封装在Intent中,也就是说子Activity通过Intent将需要返回的数据传递给父Activity。数据主要以Uri形式返回给父Activity,此外还可以附加一些额外信息,这些额外信息用Extra的集合表示。
6. 在父Activity中获取返回值
当子Activity关闭后,父Activity会调用onActivityResult()函数,获取子Activity的返回值。
public void onActivityResult(int requestCode, int resultCode, Intent data);
第1个参数requestCode是“请求码”,用来判断是哪一个子Activity的返回值
第2个参数resultCode用于表示子Activity的数据返回状态
第3个参数Data是子Activity的返回数据,返回数据类型是Intent(所以上例获取Uri需要:Uri uriData = data.getData();)
Intent过滤器
Intent Filter,一种匹配机制,使Android系统能够根据Intent中的数据信息,找到需要启动的组件。
根据Intent中的动作(Action)、类别(Category)和数据(Data)等内容,对适合接收该Intent的组件进行匹配和筛选,可以匹配数据类型、路径和协议,还可以确定多个匹配项顺序的优先级(Priority)。
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="schemodemo" android:host="edu.hrbeu" />
</intent-filter>
匹配规则:
(1) Android系统把所有应用程序包中的Intent过滤器集合在一起,形成一个完整的Intent过滤器列表
(2) 在Intent与Intent过滤器进行匹配时,Android系统会将列表中所有Intent过滤器的“动作”和“类别”与Intent进行匹配,任何不匹配的Intent过滤器都将被过滤掉。
广播消息
应用程序和Android系统都可以使用Intent发送广播消息,广播消息的内容可以是与应用程序密切相关的数据信息,也可以是Android的系统信息,比如:
- 网络连接变化
- 电池电量变化
- 接收到短信
- 系统设置变化
String UNIQUE_STRING = "edu.hrbeu.BroadcastReceiverDemo";
Intent intent = new Intent(UNIQUE_STRING);
intent.putExtra("key1", "value1");
intent.putExtra("key2", "value2");
sendBroadcast(intent);