关于Intent的一些细节,要不要get一下?

Android面试必会知识点总结-激活组件


 在上一节介绍Android的4大组件时,我们谈到它们是可以相互通信的,想了解详情的看官,请收好地址,biubiubiu就点进去了,那今天接着https://www.jianshu.com/p/c2e9b8fcafd2 关于Android的一些底层原理来说一说,在Android中,各个组件之间能相互传递数据吗?它们有什么要注意的点呢?


    首先应用不能也不应该直接激活其它应用的任意一个组件,但是系统可以,所以要想激活一个组件,需要给系统发一个消息详细说明你的意图(Intent ),之后系统就会为你激活这个组件。

大师兄解读:注意是激活,而不是创建。激活其它应用的组件只能通过Intent,给系统发消息,这是一种间接的方式来激活组件;其实在应用内又何尝不是,谁见过我们new Activity()来启动一个新的Activity,不都是通过Intent,来startActivity,达到启动新页面的目的吗?通过Intent来启动组件的另一层含义是:如何在组件内,比如当前的Activity中能创建一个新的Activity吗?对于新的Activity,只能被启动,至于它是如何创建的,只能交给Android系统来完成了。


1.组件之间通过异步消息激活


在Android中,Activity,Service,BroadcastReceiver都需要通过被称为Intent的异步消息激活。

大师兄解读:刚接触android,对于获取数据的操作,老师教导我们说,在进行耗时操作时,一定要通过异步请求,否则页面会挂点。这里是用异步消息,应该也是为了不造成页面卡顿,才利用异步消息的。那这个异步消息,最终又是通过什么来完成消息的发送呢?Intent对象,顶多是应用层和底层之间进行通讯的一个入口而已。



2.组件通过Intent通信


被激活组件返回的结果也是Intent形式的。

    大师兄解读:上面说到Intent来激活组件,并不是直接通过Intent来激活组件,而是通过Intent来携带数据,激活组件的。可以说,Intent是组件之间进行通信的基本方式。一个组件要激活另外一个组件,可以通过Intent来携带数据给要激活的组件;同时也是通过Intent来返回数据给当前的组件。比如Activity启动一个新的Activity后,完成特定的动作后,需要返回数据给当前的Activity,这个时候利用的是Bundle(其实在Bundle中有一个ArrayMap在维护着数据,这个容大师兄在后面的章节再介绍)。但实际上还是利用的Intent的,Intent可以作为Bundle的值。



3.Intent的类型


 上面说到,Android中的各个组件是通过Intent来激活的,也是通过Intent来携带数据进行通信的。但这并不是说所有的组件都需要用统一的Intent来激活组件或通信。面对不同的需求,肯定是存在特殊性和一般性的矛盾的。Android的设计者,早就考虑到这一点了,为了应对这个矛盾(其实这是文科生特有的思维吧,总是往哲学上靠,哈哈!)对Intent进行了分类,具体如下!

(1)显示Intent


Intent如果是指定了要激活的组件 的类名,那没办法,只能启动这个包下面的特定组件了,带有这种属性的Intent的就是显示的,都这么直白了,这就好比用大喇叭当场表白,得清楚明白哈!

Service必须使用显式Intent激活,不能声明IntentFilter。

大师兄解读:这个也很好理解,总不能一个需求,会有很多要后台来执行吧?(如果真的是这样,那就是需求没有细分好,哈哈,这个解释!)对于特定的组件,“指名道姓”的来激活它,肯定要好些的,这好比两个人秀恩爱,肯定得直白,准确的,那样狗粮也散的够劲哈!(sorry,这个比喻(装逼)的姿势!)。怎么感觉Service,好像已经是某个人的情人了啊,别人只能干看着!

(2)隐式Intent


如果只是指定一组特定的动作,但对于具有这组动作的组件,有时候不止一个的,那么系统会根据这组动作,准备激活所有符合条件的组件,对于具体激活哪个,会弹出提示,让用户选择!那么这样的Intent就是隐式Intent。

3启动Activity可以用的Intent类型


A)启动指定的Activity使用显式Intent,启动随便一个能完成指定工作的Activity使用隐式Intent。

B)如果使用隐式的Intent来激活一个新的Activity,那么则需要事先声明好IntentFilter ,用IntentFilter来表示自己有能力处理什么工作。而IntentFilter一般需要通过能完成的动作、意图类型和额外数据来描述。

C)一个组件,如果要想被隐式Intent激活,在这个意图类型中,至少要包含android.intent.category.DEFAULT的意图类型。

D)而且在使用隐式Intent激活Activity之前,如果没有Activity能处理这个Intent也是无用的。(看来,最完美的设计,也有一些需要特别注意的地方。这也说明任何的设计,没有完美的,只有适用的,具体怎么样,得遵循一定的规则。)

  E)ContentProvider只有在收到ContentResolver的请求时才会被激活。



4.为什么BroadcastReceiver可以不在清单文件注册


    只有BroadcastReceiver可以不在manifest 文件中注册,因为有些BroadcastReceiver需要在程序运行时动态地注册和注销。而其它组件必须在manifest 文件中注册,否则无法被系统记录,也就无法被激活。【为什么Activity非要在清单文件中注册,才能被正常启动呢?Activity不能被创建,是不是是因为非要在清单文件中注册。至于为什么非要注册,这是一个 疑问,在后面的章节再总结。】



    以上就是关于激活组件,所要注意的一些要点了!各位看官,可以当做回顾的知识点看了,毕竟没有贴代码,但应对面试,做一个基本的面经,还是可行的!


你可能感兴趣的:(关于Intent的一些细节,要不要get一下?)