Android
中提供了Intent
机制来协助应用间的交互与通讯,Intent
负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android
则根据此Intent
的描述,负责找到对应的组件,将 Intent
传递给调用的组件,并完成组件的调用。
Intent
不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service
之间的交互。
因此,Intent
在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。
使用方式
通过Context.startActivity()
or Activity.startActivityForResult()
启动一个Activity
;
通过 Context.startService(Intent)
启动一个服务,
或者通过Context.bindService(Intent, ServiceConnection, int)
和后台服务交互;
通过
Context.sendBroadcast()
,
Context.sendOrderedBroadcast()
,
Context.sendStickyBroadcast()
发给BroadCastReceiver
。
显式Intent和隐式Intent
显式Intent
- setClassName
Intent intent = new Intent();
//表示希望启动com.example.test包中的com.example.test.MainActivity
intent.setClassName("com.example.test","com.example.test.MainActivity");
startActivity(intent);
- setClass
Intent intent = new Intent();
//启动packageContext包里的OtherActivity.class类;
intent.setClass(Context packageContext, OtherActivity.class);
startActivity(intent);
隐式Intent
- Action
<intent-filter>
<action android:name="android.intent.action.ACTION_CALL" />
<action android:name="android.intent.action.EDIT" />
</intent-filter>
Standard Activity Actions
- Category
<intent-filter android:label="@string/resolve_edit">
<action android:name="android.intent.action.ACTION_CALL" />
<action android:name="android.intent.action.EDIT" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
Standard Categories
- Data
<intent-filter android:label="@string/resolve_edit">
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.EDIT" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.item/vnd.google.note" />
</intent-filter>
不同组件间 传递数据
- putExtra()
// 目的:将FristActivity中的一个字符串传递到SecondActivity中,并在SecondActivity中将Intent对象中的数据(FristActivity传递过来的数据)取出
// 1. 数据传递
// a. 创建Intent对象(显示Intent)
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
// b. 通过putExtra()方法传递一个字符串到SecondActivity;
// putExtra()方法接收两个参数:第一个是键,第二个是值(代表真正要传递的数据)
intent.putExtra("data","I come from FirstActivity");
// c. 启动Activity
startActivity(intent);
// 2. 数据取出(在被启动的Activity中)
// a. 获取用于启动SecondActivit的Intent
Intent intent = getIntent();
// b. 调用getStringExtra(),传入相应的键名,就可得到传来的数据
// 注意数据类型 与 传入时保持一致
String data = intent.getStringExtra("data");
- Bundle
// 1. 数据传递
// a. 创建Intent对象(显示Intent)
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
// b. 创建bundle对象
Bundle bundle = new Bundle();
// c. 放入数据到Bundle
bundle.putString("name", "carson");
bundle.putInt("age", 28);
// d. 将Bundle放入到Intent中
intent.putExtras(bundle);
// e. 启动Activity
startActivity(intent);
// 2. 数据取出(在被启动的Activity中)
// a. 获取用于启动SecondActivit的Intent
Intent intent = getIntent();
// b. 通过Intent获取bundle
Bundle bundle = intent.getExtras();
// c. 通过bundle获取数据传入相应的键名,就可得到传来的数据
// 注意数据类型 与 传入时保持一致
String nameString = bundle.getString("name");
int age = bundle.getInt("age");