使用Intent可以激活Android应用三种类型的核心组件:活动、服务和广播接收者。
Intent可以划分成显式意图和隐式意图。
显式意图: 调用Intent.setComponent() \ Intent.setClassName或Intent.setClass()方法明确指定了组件名的Intent为显式意图,显式意图明确指定了要激活的组件是哪个组件
比如以下代码为显式意图:
@Override
public void onClick(View view) {
//设置跳转到其他应用
Intent intent=new Intent();
intent.setClassName("com.example.mysingleinstance1","com.example.mysingleinstance1.MainActivity");
startActivity(intent);
}
});
隐式意图: 没有明确指定组件名的Intent为隐式意图。Android系统会根据隐式意图中设置的 动作(action)、类别(category)、数据(URI和数据类型) 找到最合适的组件来处理这个意图。
AndroidManifest.xml 文件中设置动作、类别、数据、
intent-filter 设置意图过滤器
action设置动作
category 设置类别
startActivity是这个方法内部为Intent自动添加的类别android.intent.category.DEFAULT 所以我们要在XML中添加
data 设置数据
相当于https://
android:scheme=“example”
域名
android:host=“www.biao.cn”
路径
android:path="/kl"/
设置数据的类型
android:mimeType=“image”
<activity
android:name=".OtherActivity"
android:label="新Activity"
android:exported="true">
<!--intent-filter意图过滤器-->
<intent-filter>
<!--action动作-->
<action android:name="com.example.xxx"/>
<!--类别category-->
<category android:name="com.example.Other.java"/>
<!--startActivity是这个方法内部为Intent添加的类别android.intent.category.DEFAULT-->
<category android:name="android.intent.category.DEFAULT"/>
<!--数据-->
<!--只要schem和host能够匹配上就行-->
<!--example://www.biao.cn--> <!--限制主机名--> <!--限制路径-->
<data android:scheme="example" android:host="www.biao.cn" android:path="/kl"/>
<!--设置数据的类型-->
<data android:mimeType="image/*"/>
</intent-filter>
</activity>
调用隐式意图:
intent.setAction(“com.example.xxx”); 设置动作
intent.addCategory(“com.example.Other.java”); 添加类别
intent.setData(Uri.parse(“example://www.biao.cn/kl”)); 设置数据。xml文件中没限定路径就可以随便写
intent.setType(“image/jpeg”); 数据的类型。
方法内部会清除前面setData方法所设置的数据。。在setData前面设置setType也是不行的。所以我们要用Intent方法内部的setDataAndType可以同时设置数据和数据类型
intent.setDataAndType(Uri.parse(“example://www.biao.cn/kl”),“image/jpeg”); 同时设置数据和数据类型
this.findViewById(R.id.openActivity).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
/*
* 只要Intent中的动作(Action)和类别(Category)都出现过滤器(Intent-Filter中,就能与之匹配,否则匹配失败)
* */
// startActivity(new Intent(MainActivity.this,OtherActivity.class));//显式意图
Intent intent=new Intent();//采用隐式意图激活Activity
//设置动作
intent.setAction("com.example.xxx");
//添加类别
intent.addCategory("com.example.Other.java");
//数据的类型
//方法内部会清除前面setData方法所设置的数据。。在setData前面设置setType也是不行的。
// 所以我们要用Intent方法内部的setDataAndType可以同时设置数据和数据类型
//intent.setType("image/jpeg");
//数据
//intent.setData(Uri.parse("example://www.biao.cn/kl"));//后面的路径可以随便写
//同时设置数据和数据类型
intent.setDataAndType(Uri.parse("example://www.biao.cn/kl"),"image/jpeg");
//激活启动
//startActivity这个方法内部会添加android.intent.category.DEFAULT。所以要在过滤器中添加才能完全匹配
startActivity(intent);
}
});