每日小点- intent详解

1,Intent语义:

Intent(字面意思意图:用于描述想要做的事情,执行的动作),在android中贯穿所有组件交互,它是必不可缺少的。我们可以理解为 android中是通过指定意图去找到正确的组件“干事情“。那就自然而然的带来一个问题:怎么去找到正确组件,这些组件怎么跟意图建立关系,这些组件又在哪?带着问题我们继续往下分析。

2,Intent由来:

大家有没有关注过:在开发过程中有用到Intent或者与Intent相近的地方?我们会发现有两个地方用到的:(1)我们代码处理组件跳转的地方 (2)Manifest里有注册Intent-Filter。既然了解了Intent的相关使用地方,那么前面提的问题也就容易发现了。

3,Intent组件注册及索引

前面我们已经知道Intent使用地方了,其中(1)代码处理组件跳转的时候,显然是通过意图去索引查找,根本不是组件注册的时机。(2)那就只能落在Manifest中Intent-Filter注册的时候产生关联。的确,本机安装完APK后,系统会解析Apk文件,同时将Manifest中的意图和其对应组件注册起来。这个解析保存意图就依赖PackageManagerService完成的。

 <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

如上贴图,就这样通过Intent-filter将Activity与之进行关联,由系统服务PackageManagerService保存维护。后面我们在查找意图的时候,即通过它查询。总结:每个APk的Manifest中注册有组件及其Intent-Filter,这些组件与Intent-Filter绑定,统一由系统服务PackageManagerService维护。

4,Intent调用

Intent意图调用,即通过系统服务索引找到正确组件。既然是搜索就会出现模糊搜索和精确搜索。Intent查询也不例外。

我们分为显示Intent调用,和隐式Intent调用。

(1)显示调用:明确组件名称

        intent.setClass();
        intent.setComponent()
        intent.setClassName()

(2)隐式调用:通过关联搜索,比如说Action, Type, Data等等

        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setType("vnd.android-dir/mms-sms");
        Uri uri = Uri.parse("smsto:"+ sendTo);
        Intent intentMessage = new Intent(Intent.ACTION_VIEW, uri);

我们可以发现通过模糊搜索,再根据Type或者Data信息进一步筛选搜索结果。

5,Intent拓展

在了解到以上这些的话,我们就可以了解很多网上有很多系统组件(短信,地图,邮件,电话等等)调用方法,无非是这些系统组件注册了其独特的相关索引条件,如:特殊的Action, 特殊的Type, 特殊的Uri链接,Category等等。


以上为个人理解,若有问题请大家指正。





猜你喜欢

转载自blog.csdn.net/u011098381/article/details/80496889