Intent 简介
Intent 是一个消息传递对象,使用它从其他应用组件请求操作。尽管 Intent 可以通过多种方式促进组件之间的通信,但其基本用例主要包括以下三个:
- 启动 Activity:
Intent 传递给startActivity()
,来启动新的 Activity 。Intent 描述了要启动的 Activity,并携带了任何必要的数据。在 Activity 完成后收到结果,调用startActivityForResult()
启动另一个 Activity。在 Activity 的onActivityResult()
回调中, 结束 Activity 将数据作为单独的 Intent 对象被前一个 Activity 接收。- 启动服务:
Service 不使用用户界面而在后台执行操作。通过将 Intent 传递给startService()
,可以启动服务执行一次性操作(例如,下载文件)。Intent 描述了要启动的服务,并携带了任何必要的数据。如果服务旨在使用客户端-服务器接口,则通过将 Intent 传递给bindService()
,可以从其他组件绑定到此服务。- 传递广播:
广播是任何应用均可接收的消息。系统将针对系统事件(例如:系统启动或设备开始充电时)传递各种广播。通过将 Intent 传递给sendBroadcast()
、sendOrderedBroadcast()
或sendStickyBroadcast()
,可以将广播传递给其他应用。
使用 Intent
创建 Intent
- 显式 Intent - 按名称(完全限定类名)指定要启动的组件。
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
- 隐式 Intent - 不会指定特定的组件,而是声明要执行的常规操作,从而允许其他应用中的组件来处理它。
配置 Manifest.xml
在 Manifest.xml
中目的 Activity 中设置意图过滤器 <intent-filter>
设置 <action>
,<data>
和 <category>
属性
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="android.intent.action.my_action"/>
<category android:name="android.intent.category.my_category"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
创建Intent
Intent intent = new Intent();
intent.setAction("xxx");
intent.addCategory("xxx");
// 还有
intent.setData("xxx");
intent.setType("xxx");
// or
intent.setDataAndType("xxx","yyy");
添加数据
// putExtra 传值
intent.putExtra("key_name", data);
// 或着使用 Bundle
Bundle bundle = new Bundle();
bundle.putString("data", data);
intent.putExtras(bundle);
启动 Activity
- 将 Intent 传递给
startActivity()
或者startActivityForResult()
启动 Activity
startActivity(intent);
// 或者
startActivityForResult(intent, 0);
返回数据
- 以
startActivityForResult(intent, 0)
方法启动Activity,setResult(RESULT_OK,intent)方法配置返回数据,重写 onActivityResult() 方法
// 在后一个 Activity 中
setResult(RESULT_OK,intent);
// 在前一个 Activity 中,重写 onActivityResult() 方法
@Override
protected void onActivityResult (int requestCode, int resultCode, Intent data) {
switch (resultCode){
case RESULT_OK:
Bundle bind = data.getExtras();
String data = b.getString("back_key");
break;
default:
break;
}
}
Intent 启动 Service
显式 Intent
Intent downloadIntent = new Intent(this, DownloadService.class);
downloadIntent.setData(Uri.parse(fileUrl));
startService(downloadIntent);
隐式 Intent
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);
sendIntent.setType("text/plain");
if (sendIntent.resolveActivity(getPackageManager()) != null) {
startActivity(sendIntent);
}
全部代码放在github上:https://github.com/bazhancong/IntentDemo