2019-05-30

Android四大组件之Activity闲聊(一)

一. Activity是什么
简单的理解,平时开发过程中展现在用户面前的界面就是Activity,相比单纯的界面,Activity还承载了一系列事件集合以配合用户完成交互工作。
一个普通的界面组织架构如下:


2019-05-30_第1张图片
层次关系.png
2019-05-30_第2张图片
运行界面.png

层级关系上,Activity、Window、DecorView以及ContentView是依次包含的关系。在这里,我们暂且不讨论Android中对它们的具体实现,先屡清楚每个角色的作用。
在界面中直接操作的视图控件(View)都是最终添加到DecorView容器中的,那怎么展示,其实是Window帮忙完成的,关显示出来是不够,最终要完成和用户的交互(比如相应用户的点击事件等),Activity正是赋予了这样的能力。所以说,如果没有Window这个载体,单靠DecorView是显示不出来的;如果没有Acitivity,单靠Window是没有与用户交互的能力的,三者的关系相辅相成,缺一不可。
在刚开始接触Android开发的时候,我们新建的每个Activity的OnCreate方法中都会有这样一段代码:


2019-05-30_第3张图片
TitleView_ContentView.png

结合上述的层次结构,容易看出只是设置了DecorView中ContentView部分,那剩下的TitleView呢,我们不需要设置吗?其实在实际开发过程中,我们都会直接在ContentView中自定义title的样式,将系统提供的TitleView隐藏了。
二. 怎么启动一个Activity
Intent(意图)是Android提供给我们实现Activity跳转的类,只要我们将我们的“意图”赋给Intent,系统解析得到这个Intent后将帮我们实现Activity跳转。
2019-05-30_第4张图片
Intent启动示意图.png

根据我们的“意图”表达的方式,系统提供了两种实现启动Activity的方式。“意图”明显,我们称为显示启动;“意图”含蓄,我们称为隐式启动。
1.显示启动


2019-05-30_第5张图片
显示调用.png

我们在构造Intent对象时,需要向将当前上下文、要启动的Activity、是否需要携带数据等信息都告诉Intent,系统服务解析Intent时能清晰地了解到要启动哪个Activity,本例中想要启动的是SecondActivity。
2.隐式启动
隐式启动.png

由于隐式启动的方式比较含蓄,所以在构造Intent对象时,并没有将要启动的Activity告诉Intent,但是只告诉了有关要启动的Activity有什么特点,这些特点可能不足以形容用户真正想要启动的Activity,但是没关系,系统会列举出当前所有满足该特点的Activity供用户自己选择;如果当前满足的只有一个,将直接启动;如果没有一个Activity满足,将不会执行任何跳转。例子中在创建Intent对象时,只告诉了Intent想启动携带"android.intent.action.ACTION_START"特点的Activity,如果想要启动成功,则需要在AndroidManifest.xml文件中配置好要启动Activity的属性就好,这里以标签里面内容作为匹配过滤信息,具体里面有哪些参数,这里不再介绍。强调一点,当且仅当标签里面的所有属性信息都匹配上,才能启动该Activity。
小结:
Activity显然是交互的能力担当,界面的绘制、控件的添加其实都是window层实现。
Android为什么要提供两种Activity启动方式,其实是因为在某些场景下(比如不同的App进程间,组件化项目中),这些场景可能是无法获取到想要启动Activity的类信息,或者我想要启动微信里面的一个界面,但是不知道它是哪个名字。而显示启动时需要我们传入要启动Activity的信息,所以这些情况无法实现。隐式启动就解决了这样的应用场景,我可以在创建Intent的时候不需要写死要启动Activity的具体信息,只需添加一些过滤参数,双方协商好,就能启动目标Activity。

你可能感兴趣的:(2019-05-30)