关于Activity的隐式启动

Activity的启动模式分为两种:

1.显式调用,直接设置指定的类名即可启动,如:

  Intent intent = new Intent(MainActivity.this, ClassicActivity.class);
  startActivity(intent);

2.隐式调用。通过在AndroidManifest文件中为activity配置过滤信息来匹配到指定的activity:

  <activity android:name=".activity.book.IntentFilterActivity">
      <intent-filter>
              <action android:name="android.intent.action.super"/>
              <category android:name="android.intent.category.DEFAULT" />
      </intent-filter>
  </activity>
  Intent intent1 = new Intent();
  intent1.setAction("android.intent.action.super");
  startActivity(intent1);

隐式调用有什么特点,为什么要使用它?

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

关于匹配规则intent-filter需要注意:

·一个activity可以有多个匹配规则

·一个activity的匹配规则必须完全匹配才能被启动

·action、category、data可以单独设置,也能同时设置

intentFilter中的过滤信息有action、category、data等过滤规则,分别有其各自的作用。

1. action。

      一个字符串,支持自定义,系统会设置一些自己的aciton,比如ACTION_SEND,发送邮件Action_CALL,呼叫指定的电话号码ACTION_DIAL,拨打电话等等。Intent中的action只有一个和过滤规则中的一个相同即可匹配成功。

      经本人代码测试,intentFilter设置了action后,也必须设置category,否则会报匹配失败无法找到对应的activity。

2. category。

    一个字符串,支持自定义,系统也设置了一些默认category。

    category要求intent中的所有的规则和intent-filter中的相同,即多对多的关系,否则匹配失败。 而intent-filter设置多余的category则不影响匹配结果。

   <intent-filter>
           <action android:name="android.intent.action.super"/>
           <category android:name="android.intent.category.DEFAULT"/>
           <category android:name="android.intent.category.DEFAULT1"/>
    </intent-filter>
  Intent intent1 = new Intent();
  intent1.setAction("android.intent.action.super");
  intent1.addCategory("android.intent.category.DEFAULT");
  startActivity(intent1);

3. data 。即数据,主要包含两部分,mimeType和URL(Schheme,Host,Port,Path,PathPattern,pathPrefix)。

设置方法和action类似,必须有相同的data和intent中设置的一致才匹配成功。

 <data android:scheme="com.android.demo" android:host="abc" android:port="8080" android:mimeType="image/*"/>
 intent1.setDataAndType(Uri.parse("com.android.demo://abc:8080"),"image/png");
 startActivity(intent1);

注意:

因activity需要设置启动规则还要考虑过滤条件,因此建议用显示启动方式,启动组件。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值