显式Intent: 通过指定Intent组件名称来实现的,它一般用在知道目标组件名称的前提下。显式Intent明确指定了要激活的组件是哪个组件,一般用在同一个应用程序内部来实现功能。
例如:
startActivity(new Intent(A.this , B.class));
隐式Intent: 隐式Intent是在显式Intent上的扩展。显式Intent虽然方便,但是只能用在同一个程序的内部,不能通过App1来调用App2中的Activity。如果App2的一个Activity使用了隐式Intent,则可以通过App1来启动App2的这个Activity。
具体操作如下:
首先在App2中的AndroidManifest中对相应的activity进行配置
<activity android:name=".App2Activity">
<intent-filter>
<category android:name="android.intent.category.DEFAULT"/> <!--Android系统中默认的执行方式,按照普通Activity的执行方式执行-->
<action android:name="package-name.intent.action.class-name"/>
</intent-filter>
</activity>
然后在App1中启动App2中使用了隐式Intent的Activity
startActivity(new Intent("package-name.intent.action.class-name"));
注意:如果一个Activity使用了隐式Intent,但是又不希望这个Activity被其他应用程序启动,这时在AndroidManifest中修改这个Activity的属性 : android:exported=”false” ,默认为true(允许导出)
<activity android:name=".App2Activity" android:exported="false" >
<intent-filter>
<category android:name="android.intent.category.DEFAULT"/>
<action android:name="package-name.intent.action.class-name"/>
</intent-filter>
</activity>
使用环境:
显式意图效率高,系统直接精确定位要启用的组件,但耦合度也高,如果通过这种方式调用一些系统组件的话,容易因为版本更新,类名、包名、包结构变化等原因导致程序崩溃。
而隐式意图能够降低程序的耦合度,但由于每次意图执行的时候,系统都会搜索所有可用的intentfilter,来查看是否有匹配的内容,所以效率更低。所以具体的使用还要看具体的情况。