Android之Intent显示和隐式调用

显式Intent:

  • 显式意图明确指定了要激活的组件是哪个组件,一般是在应用程序内部使用。
    如:Intent.setComponent()、Intent.setClassName()或Intent.setClass()方法或者在new Intent(A.this,B.class)指明需要转向到的Activity,
  • 效率高,但耦合度也高

隐式Intent:

  • 通过在清单文件中配置IntentFilter来实现的,它一般没有明确指出目标组件名称
  • 用于在不同应用程序之间
  • 降低程序的耦合度,但效率更低。
  • 如果不希望当前隐式intent被跨应用启动,只需要在AndroidManifest.xml对应的activity中配置android:exported="false"即可。

 

 

intent就是意图的意思。Intent分两种:显式(Explicit intent)和隐式(Implicit intent)。

一、显式(设置Component)

显式,即直接指定需要打开的activity对应的类。
以下多种方式都是一样的,实际上都是设置Component直接指定Activity类的显式Intent,由MainActivity跳转到SecondActivity:
1、构造方法传入Component,最常用的方式
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);

2、setComponent方法
ComponentName componentName = new ComponentName(this, SecondActivity.class);
// 或者ComponentName componentName = new ComponentName(this, "com.example.app016.SecondActivity");
// 或者ComponentName componentName = new ComponentName(this.getPackageName(), "com.example.app016.SecondActivity");
 
Intent intent = new Intent();
intent.setComponent(componentName);
startActivity(intent);

3、setClass/setClassName方法
Intent intent = new Intent(); 
intent.setClass(this, SecondActivity.class);
// 或者intent.setClassName(this, "com.example.app016.SecondActivity");
// 或者intent.setClassName(this.getPackageName(), "com.example.app016.SecondActivity");
        
startActivity(intent);

显式Intent通过Component可以直接设置需要调用的Activity类,可以唯一确定一个Activity,意图特别明确,所以是显式的。设置这个类的方式可以是Class对象(如SecondActivity.class),也可以是包名加类名的字符串(如"com.example.app016.SecondActivity")。这个很好理解,在应用程序内部跳转界面常用这种方式。


二、隐式

隐式,即不是像显式的那样直接指定需要调用的Activity,隐式不明确指定启动哪个Activity,而是设置Action、Data、Category,让系统来筛选出合适的Activity。筛选是根据所有的<intent-filter>来筛选

下面以Action为例:AndroidManifest.xml文件中,首先被调用的Activity要有一个带有<intent-filter>并且包含<action>的Activity,设定它能处理的Intent,并且category设为"android.intent.category.DEFAULT"。action的name是一个字符串,可以自定义,例如我在这里设成"abcdefg":

        <activity
            android:name="com.example.app016.SecondActivity">
            <intent-filter>
                <action android:name="abcdefg"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>

然后,在MainActivity,才可以通过这个action name找到上面的Activity。下面两种方式分别通过setAction和构造方法方法设置Action,两种方式效果相同。
1、setAction方法
Intent intent = new Intent();
intent.setAction("abcdefg");
startActivity(intent);

2、构造方法直接设置Action
Intent intent = new Intent("abcdefg");
startActivity(intent);

通过设置Action字符串,表明自己的意图,即我想干嘛,需要由系统解析,找到能够处理这个Intent的Activity并启动。比如我想打电话,则可以设置Action为"android.intent.action.DIAL"字符串,表示打电话的意图,系统会找到能处理这个意图的Activity,例如调出拨号面板。


有几点需要注意:

1、这个Activity其他应用程序也可以调用,只要使用这个Action字符串。这样应用程序之间交互就很容易了,因为如此,为了防止应用程序之间互相影响,一般命名方式是包名+Action名,例如这里命名"abcdefg"就很不合理了,就应该改成"com.example.app016.MyTest"。

2、可以在自己的程序中调用其他程序的Action。例如可以在自己的应用程序中调用拨号面板:

Intent intent = new Intent(Intent.ACTION_DIAL);
// 或者Intent intent = new Intent("android.intent.action.DIAL");
// Intent.ACTION_DIAL是内置常量,值为"android.intent.action.DIAL"
startActivity(intent);


3、一个Activity可以处理多种Action
只要你的应用程序够牛逼,一个Activity可以看网页,打电话,发短信,发邮件。。。当然可以。
Intent的Action只要是其中之一,就可以打开这个Activity。

        <activity
            android:name="com.example.app016.SecondActivity">
            <intent-filter>
                <!-- 可以处理下面三种Intent -->
                <action android:name="com.example.app016.SEND_EMAIL"/>
                <action android:name="com.example.app016.SEND_MESSAGE"/>
                <action android:name="com.example.app016.DAIL"/>
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

 

示例参考:https://blog.csdn.net/xiao__gui/article/details/11392987 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值