在Android中,Activity作为视图显示的不可或缺的成分,然而对于Activity之间的启动,我们最常用到还是显式调用,隐式调用很少用到。两者最大的区别就是显式调用需要提供明确的组件信息,包括包名和类名。而隐式调用则不需要,只要提供配置对应的过滤信息就可以完成启动。两者之间存在一个原则,如果两种调用同时存在时,那么以显式调用为主。
对于显式调用想必大家都很清楚,这里就不多做叙述,本文还是以介绍隐式调用为主,去分析那些存在于过滤器中的action,category,data的用法。
一,Action
action是一个字符串,系统也有预定义action,当然我们自己也可以自定义action。如果采用自定的action那么在启动Activity的时候必须保证Intent中的action和IntentFilter中的action完全一致。注意:action是区分大小写的。
下面介绍几种预定义Action:
1. 浏览网页
Uri uri = Uri.parse("http://www.google.com");
Intent it = new Intent(Intent.ACTION_VIEW,uri);
startActivity(it);
2. 拨打电话
Uri uri = Uri.parse("tel:xxxxxx");
Intent it = new Intent(Intent.ACTION_DIAL, uri);
startActivity(it);
3. 调用发短信的程序
Intent it = new Intent(Intent.ACTION_VIEW);
it.putExtra("sms_body", "The SMS text");
it.setType("vnd.android-dir/mms-sms");
startActivity(it);
4. 发送Email
it.putExtra(Intent.EXTRA_TEXT, "The email body text");
it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");
it.setType("message/rfc822");
startActivity(Intent.createChooser(it, "Choose Email Client"));
5. 打开录音机
Intent mi = new Intent(Media.RECORD_SOUND_ACTION);
startActivity(mi);
6. 打开联系人列表
Intent i = new Intent();
i.setAction(Intent.ACTION_GET_CONTENT);
i.setType("vnd.android.cursor.item/phone");
startActivityForResult(i, REQUEST_TEXT);
二. Category
和action一样,Category系统也有预定义。同时我们也可以自定义。它要求如果IntentFilter中必须存在一个Category字段,当然如果没
有加的话也不用担心系统默认在启动时会加上一个预定义字符串“android.initent.category.DEFAULT”,所以如果是隐式启动的话Intent需要
配上这个字段,否则会匹配失败。所以也可以知道,Intent中添加的Category必须和IntentFilter中的一个Category字段匹配上,否则启动失败。
三. Data
data的结构有些复杂,所以首先我们来了解一下data的组成。
1. scheme : 一种自定义协议 URI模式,比如 http,file,content当然既然是自定义类似test,xxxx都可以。
如:<data android:scheme="test"> <data android:scheme="content">
注意:如果data中的scheme没有配置,那么之后的所有参数无效。
2. host : URI的主机名,比如www.baidu.com,当然也可以是其他的。
3. port : URI的端口,比如8080,这个端口要在scheme和port都有指定的情况下才有用。
4.mimeType: 它的作用是告诉Android系统本Activity可以处理的文件的类型。如设置为 “text/plain”表示可以处理“.txt”文件。
mimeType说明:https://www.2cto.com/kf/201502/374951.html