使用显示intent时,我们需要指定操作系统启动哪个activity。
使用隐式intent时,只需要告诉操作系统你想要做什么,操作系统就会去启动能够胜任工作任务的activity。如果找到多个符合的activity,用户会看到一个可选应用列表。
1.隐式intent的组成
- 要执行的操作:
通常以Intent类中的常量来表示。例如Intent.ACTION_SEND。 - 待访问数据的位置:
可能时设备以外的资源,如某个URL,也可能是指向某个文件的URI,或者是某个内容URI。 - 操作涉及的数据类型
指MIME形式的数据类型,如text/html或audio/mpeg3。 -
可选类别
类别用来描述如何使用某个activity。例如,Android的android.intent.category.LAUNCHER类别表明,activity应该显示在顶级引用启动器中。
基于以上信息,操作系统将启动适用的activity。通过配置文件中的intent过滤设置,activity会对外宣称自己是适合处理某类action的activity。
<activity
android:name=".BrowserActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="http" android:host="www.bignerdranch.com"/>
<intent-filter>
</activity>
必须在intent过滤器中明确地设置DEFAULT类别。action元素告诉操作系统,activity能够胜任指定任务。DEFAULT类别告诉操作系统,activity愿意处理某项任务。
2.发送消息
Intent i = new Intent(Intent.ACTION_SEND);
i.setType("text/plain");
i.putExtra(Intent.EXTRA_TEXT,getCrimeReport());
i.putExtra(Intent.EXTRA_SUBKECT, getString(R.string.crime_report_subject));
startActivity(i);
使用隐式intent启动activity时,也可以创建每次都显示的activity选择器。调用以下Intent方法并传入创建的隐式intent以及用作选择器标题的字符串:
public static Intent createChooser(Intent target, String title)
然后将createChooser(...)方法返回的intent传入startActivity(...)方法。
Intent i = new Intent(Intent.ACTION_SEND);
i.setType("text/plain");
i.putExtra(Intent.EXTRA_TEXT,getCrimeReport());
i.putExtra(Intent.EXTRA_SUBKECT, getString(R.string.crime_report_subject));
i = Intent.createChooser(i, "title");
startActivity(i);
3.检查可响应任务的activity
如果操作系统找不到匹配的activity,应用就会崩溃。首先通过操作系统中的PackageManager类进行自检。
Android设备上安装了哪些组件以及包括哪些activity,PackageManager类全部都知道。调用resolveActivity(Intent,int)方法,可以找到匹配给定Intent任务的activity。flag标志MATCH_DEFAULT_ONLY限定只搜索带CATEGORY_DEFAULT标志的activity。
PackageManager packageManager = getActivity().getPakcageManager();
if (packageManager.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY) == null) {
return;
} else {
...
//启动intent
}