IntentFilter 使用来过滤意图Intent的,就是你是什么意图对应什么activity
0: 如果找到了只有一个会直接跳转
1: 如果一个意图对应了多个activity,那么会有一个选择框
2: 如果找不到对应的activity 那么会报错❌,
这个时候我们最好使用PackageManager 里面的queryIntentActivities 或者是resolveActivity 来进行一层判断
//查看是否有这个activity,如果有再startactivity 没有的话,那么直接就
PackageManager packageManager = getPackageManager();
//注意这里的match 要选择MATCH_DEFAULT_ONLY, 这个是我们默认的 Intent.CATEGORY_DEFAULT
List<ResolveInfo> resolveInfos = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
//ResolveInfo resolveInfo = packageManager.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
for (int i = 0; i < resolveInfos.size(); i++) {
Log.d("kodulf","i = " + i + " resolveInfos + " + resolveInfos.get(i).activityInfo);
}
if(resolveInfos.size()>0)
startActivity(intent);
else
Log.d("kodulf"," no activity");
具体的怎么匹配的:IntentFilter 的三个组成部分详解:
data:
<activity android:name=".ThirdActviity">
<intent-filter>
<action android:name="aa.bb.cc.dd" />
<action android:name="aa.bb.cc.dd.ee" />
<action android:name="aa.bb.cc.dd.ee.ff" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="test" />
<data
android:host="www.kodulf.com"
android:path="/mypath"
android:port="8888"
android:scheme="lee"
android:mimeType="abc/xyz"/>
</intent-filter>
</activity>
intent 里面设置
intent.setDataAndType(Uri.parse("lee://www.kodulf.com:8888/mypath"),"abc/xyz");
设置了的data和type可以通过intent 来获取
package bjpkten.activityintentfilterdemo;
import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class ThirdActviity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_third_actviity);
Intent intent = getIntent();
//type
String type = intent.getType();
// data
Uri data = intent.getData();
String dataString = intent.getDataString();
}
}