1.显示Intent
-
描述
显示Intent的调用需要明确的指定被启动对象的组件信息(包括报名和类名),通过在Intent上指定明确的组件信息来实现。 -
使用场景
一般是用在知道目标组件名称的情况下;
在同一应用程序内部的情况下使用较多。 -
示例
在MainActivity
中启动一个名为LoginActivity
的Activity:
// 显示调用示例
Intent intent = new Intent();
intent.setClass(MainActivity.this, LoginActivity.class);
startActivity(intent);
2.隐式Intent
-
描述
隐式Intent调用不需要明确指定被启动对象的组件信息的,通过IntentFilter来实现,系统会根据隐式意图中设置的Action(行为/动作)、Category(类别)、Data(URI和数据类型)找到最合适的组件来处理这个意图。 -
使用场景
一般用在没有明确指出目标组件名称的前提下;
一般是用于在不同应用程序之间。 -
IntentFilter的过滤规则
IntentFilter的过滤信息有action、category、data,只用同时匹配过滤列表中的信息,才可以匹配成功,一个Activity中可以有多个intent-filter,一个Intent只要有一组完全匹配就可以成功启动对应的Activity
Action匹配规则:
action是一个字符串区分大小写,要求必须存在且和过滤规则中的其中一个action相同。
category匹配规则:
Intent中如果有那么必须和过滤规则中的一个category相同,如果不设置category也可以匹配,原因是系统在调用startActivity
或者startActivityForResult
时默认为Intent加上了android.intent.category.DEFAULT
,所以在隐式调用时必须加<category android:name="android.intent.category.DEFAULT" />
。
data匹配规则:
如果在AndroidManifest.xml
里面指定了<data>
这行,那么,需要匹配到它的话,在代码里必须要设置Intent的data。
-
示例
1.在AndroidManifest.xml
中注册要启动的目标LoginActivity
:
2.在<activity android:name="com.zihao.LoginActivity" android:screenOrientation="portrait"> <intent-filter> <action android:name="com.zihaoLogin.action" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
MainActivity
中通过以下代码启动LoginActivity
:Intent intent = new Intent(); intent.setAction("com.zihaoLogin.action"); intent.addCategory("android.intent.category.DEFAULT"); startActivity(intent);
3.Intent显示/隐式的区别
-
目标差异:显示Intent有固定的接收方,隐式Intent无固定的接收方。
显示Intent有明确的被启动对象的组件信息;
隐式Intent没有明确指出目标组件名称,需要通过IntentFilter过滤匹配。 -
适用场景差异:显示Intent更适合在同项目下使用,隐式Intent更适合不同项目间的页面跳转。
同项目下,显示Intent效率更高。 -
作用域:显示Intent不可以跨应用使用,隐式Intent可以跨应用使用。
如果隐式Intent不需要跨应用启动,在AndroidManifest.xml
中添加android:exported=”false”
配置即可。
原则上,一个Intent中不应该既有显示调用又有隐式调用,如果一个Intent同时使用了显示调用与隐式调用,则以显示调用为主。
如果您有更好的建议欢迎评论分享,如有错误,请批评指正,谢谢。
网友评论