【Android】Intent之显示、隐式调用

作者: 紫豪 | 来源:发表于2018-07-04 11:03 被阅读27次
hi.png

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
          <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>
    
    2.在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同时使用了显示调用与隐式调用,则以显示调用为主。


如果您有更好的建议欢迎评论分享,如有错误,请批评指正,谢谢。

相关文章

网友评论

    本文标题:【Android】Intent之显示、隐式调用

    本文链接:https://www.haomeiwen.com/subject/focphftx.html