意图过滤器:a.三类信息action、category、data。
b.不一定三类信息都要有;每一类可有多个;
c.一个activity可有多个intent-filter,匹配其中一个即可。
1.action匹配规则
1.1 字符串,系统已经定义了一些,自己也可以定义。
1.2 必须完全一样,区分大小写。
1.3 如果目标指定了action,跳转时必须有action且只有由一个匹配就ok。
2.category匹配规则
2.1 字符串,系统有,也可自定义。
2.2 如果Intent中有则每个都必须和过滤规则中的对应。
2.3 intent中可以没有,因为系统默认为它创建android.intent.category.DEFAULT。
2.4 隐式intent必须为其指定默认category。
3.data匹配规则
3.1 分为两部分:URI和mimeType
3.1.1URI:://:/||
例如:http://www.baidu.com:80/serch/info
content://com.xmc.windman:200/folder/subfolder/etc
参数含义:Scheme:URI的模式(http、file、content等,后两个为默认值),少此无效。
Host:URI的主机名(www.baidu.com),少此无效。
Port:URI的端口号(80),前两个指定,此参数才有效。
path:完整路径。
pathPattern:完整路径,可包含通配符"*",0个以上字符,由于正则表达式的规范,"*"要写成"\\*","\"要写成"\\\\"。
pathprefix:路径的前缀信息。
3.1.2 mimeType:媒体类型,如image/jpeg、audio/mpeg4-generic、video/*。
3.2 过滤中定义了data,intent中必须有data。如果过滤中只有mimeType,但他有默认值,intent中的Scheme必须指定为content或者file
3.3 如果想为intent指定完整data,必须调用setDataAndType,不能先setData然后再setType,因为两者会相互清空。
3.4 如果过滤中指定了两组完整的data,匹配其中一条即可。
3.5 data可分开写,如:;,。
4. 对应Service和BroadcastReceiver,intent-filter规则一样,但是系统建议Service显式调用 。.
5. 隐式intent判断null方法,如果不判断匹配不成功时会报错。
5.1 PackageManager或者Intent的resolveActivity。返回最佳匹配,如果找不到返回null
5.2 PackageManager的queryIntentActivityies,返回所有匹配成功的Activity。
5.3 两个方法都是两个参数的,第一个参数是Intent,第二个是标志位,传DEFALUT_ONLY。表示只接受category为defalt的,隐式必须有defalt的category。
5.4特殊action和category:android.intent.action.MAIN和android.intent.category.LAUNCHER。而这缺一不可,表示程序入口。
5.5 Service和broadcastReceiver, PackageManager也提供同样的方法。
public class OpenFiles {
//android获取一个用于打开HTML文件的intent
public static IntentgetHtmlFileIntent(File file) {
Uri uri = Uri.parse(file.toString()).buildUpon().encodedAuthority("com.android.htmlfileprovider").scheme("content").encodedPath(file.toString()).build();
Intent intent =new Intent("android.intent.action.VIEW");
intent.setDataAndType(uri, "text/html");
return intent;
}
//android获取一个用于打开图片文件的intent
public static IntentgetImageFileIntent(File file) {
Intent intent =new Intent("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri uri = Uri.fromFile(file);
intent.setDataAndType(uri, "image/*");
return intent;
}
//android获取一个用于打开PDF文件的intent
public static IntentgetPdfFileIntent(File file) {
Intent intent =new Intent("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri uri = Uri.fromFile(file);
intent.setDataAndType(uri, "application/pdf");
return intent;
}
//android获取一个用于打开文本文件的intent
public static IntentgetTextFileIntent(File file) {
Intent intent =new Intent("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri uri = Uri.fromFile(file);
intent.setDataAndType(uri, "text/plain");
return intent;
}
//android获取一个用于打开音频文件的intent
public static IntentgetAudioFileIntent(File file) {
Intent intent =new Intent("android.intent.action.VIEW");
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("oneshot", 0);
intent.putExtra("configchange", 0);
Uri uri = Uri.fromFile(file);
intent.setDataAndType(uri, "audio/*");
return intent;
}
//android获取一个用于打开视频文件的intent
public static IntentgetVideoFileIntent(File file) {
Intent intent =new Intent("android.intent.action.VIEW");
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("oneshot", 0);
intent.putExtra("configchange", 0);
Uri uri = Uri.fromFile(file);
intent.setDataAndType(uri, "video/*");
return intent;
}
//android获取一个用于打开CHM文件的intent
public static IntentgetChmFileIntent(File file) {
Intent intent =new Intent("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri uri = Uri.fromFile(file);
intent.setDataAndType(uri, "application/x-chm");
return intent;
}
//android获取一个用于打开Word文件的intent
public static IntentgetWordFileIntent(File file) {
Intent intent =new Intent("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri uri = Uri.fromFile(file);
intent.setDataAndType(uri, "application/msword");
return intent;
}
//android获取一个用于打开Excel文件的intent
public static IntentgetExcelFileIntent(File file) {
Intent intent =new Intent("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri uri = Uri.fromFile(file);
intent.setDataAndType(uri, "application/vnd.ms-excel");
return intent;
}
//android获取一个用于打开PPT文件的intent
public static IntentgetPPTFileIntent(File file) {
Intent intent =new Intent("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri uri = Uri.fromFile(file);
intent.setDataAndType(uri, "application/vnd.ms-powerpoint");
return intent;
}
//android获取一个用于打开apk文件的intent
public static IntentgetApkFileIntent(File file) {
Intent intent =new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(android.content.Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
return intent;
}
}
网友评论