只写Action 不行,
<activity android:name=".a.BActivity">
<intent-filter>
<action android:name="intent.action.test.bbb" />
</intent-filter>
</activity>
// 这样只写Action 发生了崩溃
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("intent.action.test.bbb");
startActivity(intent);
}
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=intent.action.test.bbb }
加上Category 就行了。例如这样
<activity android:name=".a.BActivity">
<intent-filter>
<action android:name="intent.action.test.bbb" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
// 这样就跳转成功了
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("intent.action.test.bbb");
intent.addCategory("android.intent.category.DEFAULT");
startActivity(intent);
}
只要Intent 的action 能够与过滤规则的任何一个action 相同即可匹配成功。(action 区分大小写)
为什么不写category 也能匹配成功呢?因为系统在调用startActivity() 或startActivityForResult() 的时候会默认为Intent 加上"android.intent.category.DEFAULT" 这个category 。比如这样写。
<activity android:name=".a.BActivity">
<intent-filter>
<action android:name="intent.action.test.bbb" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
// 没写category 也能跳转成功
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("intent.action.test.bbb");
startActivity(intent);
}
如果写了category ,不管写几个,对于每个category 来说,它必须是过滤规则已经出现的。
<activity android:name=".a.BActivity">
<intent-filter>
<action android:name="intent.action.test.bbb" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.123987"/>
<data android:mimeType="text/plain"/>
</intent-filter>
</activity>
// 这样可以跳转
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("intent.action.test.bbb");
intent.addCategory("android.intent.category.123987");
intent.setDataAndType(Uri.parse("file://abc123987"),"text/plain");
startActivity(intent);
}
只写 intent.setDataAndType(Uri.parse("file://abc123987"),"text/plain"); 会这样
应该是匹配了"text/plain" 这个,然而有好多这个类型,所以让你选。
只要加了action 就要在注册时加<category android:name="android.intent.category.DEFAULT"/>
如果过滤规则定义了data ,那么Intent 必须也要定义可匹配的data 。
如果注册时加了<data android:mimeType="text/plain"/> ,那么在跳转时要加上data ,例如intent.setDataAndType(Uri.parse("file://abc123987"),"text/plain");