Intent是执行某操作的抽象描述。最常用的是启动Activity。
可以用于通过 startActivity(Intent)启动Activity, 通过startService(Intent)或bindservice(Intent,ServiceConnection,int)联系后台的Service,发送broadcastIntent给BroadcastReceiver组件。
1 Intent结构
主要的属性
- action :需要执行的操作,例如:ACTION_VIEW,ACTION_EDIT,ACTION_MAIN
- data :操作的数据,例如 通讯录的联系人记录,通过Uri数据表示。
- category :操作的辅助信息。例如:CATEGORY_LAUNCHER表示启动后成为top-level的app。
- type :明确标识intent数据的类型。
- component :明确标识启动组件的class。当这个属性填写后,其他的属性都是optional的。
- extras :附加的Bundle信息。例如:我们要一个ACTION_SEND发送e-mail的action,就可以通过extras填充subject,body信息。
2 Intent类型
- 显式Intent : 一般用于app内部activity之间的调用(通过方法setComponnet或者setClass)
- 隐式Intent :不用声明component属性,必须包括其它的足够信息来告诉系统来启动哪个component。
3 隐式Intent机制
Intent尝试匹配所有安装app中的<intent-filter>描述,除此之外,也匹配BoardcastReceiver对象通过registerReceiver(BroadcastReceiver,IntentFilter)显式注册的IntentFilter。
有三个信息用于Intent的匹配:action,type,category。通过此数据在PackageManager中进行查询。是否可以查询到合适的组件取决于app中AndroidManifect.xml提供的信息。
4 属性分类
- 标准的Activity Action : 经常通过startActivity(Intent)。经常用到的是ACTION_MAIN和ACTION_EDIT
- 标准的Broadcast Action:用于Intent定义来接收广播。经常经过registerReceiver(BroadcastReceiver,IntentFilter)或者manifest中的<receiver> tag
- 标准的Categories : 通过Intent的addCategory(String)。除了常用的DEFAULT category,还有ALTERNATIVE和SELECTED_ALTERNATIVE,增加这两个category,可以让别人通过 queryIntentActivityOptions和 addIntentOptions方法动态的找到此Activity。
- 标准的Extra 数据: 通过putExtras(String,Bundle)放入到Intent中
- Flags : 通过setFlags(int)和addFlags(int)放入Intent中。FLAG_ACTIVITY_* flags用于Context.startActivity(),FLAG_RECEIVER_* flags用于 Context.sendBroadcast()。例如:如果设置FLAG_ACTIVITY_NO_HISTORY flag,新的activity不会保存在activity历史堆栈中。
5 Demo:
(1) 通过ACTION_MAIN + CATEGORY_HOME 启动主屏
(2) 通过ACTION_SEND 发送Mail
(3) 通过ACTION_PICK打开通讯录,并选中一个item,得到返回值
(4) 通过ACTION_DIAL拨打指定的号码
public class IntentActivity extends Activity{
Button mHomeScreen, mMailButton,mAddressButton, mDailButton;
int REQUEST_CONTACT;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_intent);
mHomeScreen = (Button)findViewById(R.id.homescreen);
mHomeScreen.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent();
i.setAction(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_HOME);
startActivity(i);
}
});
mMailButton = (Button)findViewById(R.id.mail);
mMailButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent();
i.setAction(Intent.ACTION_SEND);
i.setType("text/plain");
i.putExtra(Intent.EXTRA_TEXT, "hi team, test text.");
i.putExtra(Intent.EXTRA_SUBJECT, "Test Mail");
i= Intent.createChooser(i, "Please choose..");
startActivity(i);
}
});
mAddressButton = (Button)findViewById(R.id.address);
mAddressButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent();
i.setAction(Intent.ACTION_PICK);
i.setData(ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(i, REQUEST_CONTACT);
}
});
mDailButton = (Button)findViewById(R.id.dail);
mDailButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent();
i.setAction(Intent.ACTION_DIAL);
i.setData(Uri.parse("tel:13726218236"));
startActivity(i);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(resultCode != Activity.RESULT_OK) return;
if(requestCode == REQUEST_CONTACT){
Uri contactUri = data.getData();
String[] queryFilds = new String[]{
ContactsContract.Contacts.DISPLAY_NAME
};
Cursor c = this.getContentResolver().query(contactUri, queryFilds, null, null, null);
if(c.getCount() == 0){
c.close();
return;
}
c.moveToFirst();
Toast.makeText(this, "选中的项为: "+ c.getString(0), Toast.LENGTH_SHORT).show();
c.close();
}
}
Reference:
http://www.android-doc.com/reference/android/content/Intent.html
http://www.android-doc.com/reference/android/content/pm/PackageManager.html