【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