关于Intent的一点小事

一点小事...

 

显式Intent:直接用组件的名称定义目标组件
Intent it = new Intent(MainActivity.this,SecondActivity.class);
startActivity(it);
如此直接而已...

隐式Intent:不直接用组件的名称定义目标组件
Intent intent = new Intent();
intent.setData("...");
intent.setAction("...");
...
startActivity(intent);

如此麻烦而已....


隐式启动Activity的intent到底发给哪个activity,需要进行三个匹配,一个是action,一个是category,一个是data,可以是全部或部分匹配,同样适用于Service和BroadcastReceiver

任何一个需要隐式启动的Activity都必须要有这项:<category android:name="android.intent.category.DEFAULT"/>
intent.addCategory(Intent.CATEGORY_DEFAULT);

这两个有点特殊:

android.intent.category.MAIN     主activity
android.intent.category.LAUNCHER launcher可见

 

看一下几个配对
<action android:name=".....">
intent.setAction(".....");

<category android:name="..." />
intent.addCategory("...");

<data android:scheme="......"></data>
Uri uri = Uri.parse("......:");
in.setData(uri);

<data android:mimeType="..." />
in.setType("...");

 

别人一总结:
1.  <action/>包含在 <intent-filter></intent-filter> 标签对里,而且是必不可少的!不管以哪一种方式来匹配,都不可缺少这个<action/> ,可以有多个,至少要有一个。

如有多个的,话只需要匹配其中一个即可找到这个activity

<action>里的属性值大多数是在Intent里定义的,比如<action android:name="android.intent.action.VIEW"/>里的属性值就等于 Intent.ACTION_VIEW,

在这个Intent类里以ACTION开头定义的常量都是。当然,也可以自定义。

2.  任何一个需要隐式启动的Activity都必须要有这项:<category android:name="android.intent.category.DEFAULT"/>

例外情况是:android.intent.category.MAIN和android.intent.category.LAUNCHER的 filter中没有必要加入android.intent.category.DEFAULT,当然加入也没有问题

<category> 里的属性值大多数是在Intent里定义的,比如  <category android:name="android.intent.category.DEFAULT"/>里的属性值就等于 Intent.CATEGORY_DEFAULT,

在这个Intent类里以CATEGORY开头定义的常量都是。当然,也可以自定义。 

3.一个Activity里可以有多对<intent-filter></intent-filter>  只要匹配其中一对,即可启动这个Activity

4.在<intent-filter></intent-filter>里可以有多个<data android:mimeType="xxxx"/>,只需匹配其中一个即可.注意:不可以同时出现第5点的标签对,即下面这条。

5. 在<intent-filter></intent-filter>里可以有多个<data android:scheme="xxxx" android:host="yyyy" android:port="uuu"/>,只需匹配其中一个即可。

语法:

<data android:host="string"

      android:mimeType="string"

       android:path="string"

       android:pathPattern="string"

       android:pathPrefix="string"

       android:port="string"

       android:scheme="string" />

       可以分开写,如:

       <data android:scheme="something" android:host="project.example.com" android:port="80"/>

 等同于这样写:

 <data android:scheme="something"/>

 <data android:host="project.example.com"/>

 <data android:port="80"/>

 在java代码里,Uri的格式:scheme://host:port/path or pathPrefix or pathPattern

 注意:不可以同时出现第4点的标签对,即上面那条。

 6.在<intent-filter></intent-filter>里可以有多个<action android:name="xxxx"> ,只需匹配其中一个即可。

 7.当匹配不上任何Activity的话,会发生异常,跳出对话框:很抱歉...某某应用程序意外停止,请重试。

 8. 上面所说的全部适用于Service和BroadcastReceiver,只需把<activity ...></activity>换成<service ...></service>或<receiver ...></receiver>即可。

这小点事完了...

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值