在manifest文件中activity会有这样的属性
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.dir/person" />
<data android:mimeType="vnd.android.cursor.dir/contact" />
</intent-filter>ContentProvider 的 getType(Uri uri) 方法,返回的就是其中对应的mimetype值,匹配manifest的话,才能启动activity。
这个方法什么时候调用呢?
startActivity(intent)Instrumentation.execStartActivity()Intent.resolveTypeIfNeeded()Intent.java
public String resolveTypeIfNeeded(ContentResolver resolver) {
if (mComponent != null) {
return mType;
}
return resolveType(resolver);
} public String resolveType(ContentResolver resolver) {
if (mType != null) {
return mType;
}
if (mData != null) {
if ("content".equals(mData.getScheme())) {
return resolver.getType(mData);
}
}
return null;
}如果
1、startActivity(intent)的intent 时隐式的(即没有直接设置类名)
2、并且没有设置type
3、并且设置了uri(如调用了setData(uri))
那么就会调用到
ContentResolver.getType(mData)也就调用到了 ContentProvider 的 getType(Uri uri)。
本文深入解析了AndroidManifest文件中activity的intent-filter配置及其与ContentProvider之间的交互,特别是如何通过ContentResolver.getType方法获取mimetype信息,以及其在隐式启动activity时的作用。
1525

被折叠的 条评论
为什么被折叠?



