在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)。