美文网首页
2019-05-30

2019-05-30

作者: AiLearn | 来源:发表于2019-06-01 22:58 被阅读0次

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

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


    层次关系.png 运行界面.png

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


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

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


    显示调用.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的属性就好,这里以<intent-filter>标签里面内容作为匹配过滤信息,具体里面有哪些参数,这里不再介绍。强调一点,当且仅当<intent-filter>标签里面的所有属性信息都匹配上,才能启动该Activity。
    小结:
    Activity显然是交互的能力担当,界面的绘制、控件的添加其实都是window层实现。
    Android为什么要提供两种Activity启动方式,其实是因为在某些场景下(比如不同的App进程间,组件化项目中),这些场景可能是无法获取到想要启动Activity的类信息,或者我想要启动微信里面的一个界面,但是不知道它是哪个名字。而显示启动时需要我们传入要启动Activity的信息,所以这些情况无法实现。隐式启动就解决了这样的应用场景,我可以在创建Intent的时候不需要写死要启动Activity的具体信息,只需添加一些过滤参数,双方协商好,就能启动目标Activity。

    相关文章

      网友评论

          本文标题:2019-05-30

          本文链接:https://www.haomeiwen.com/subject/tqjbtctx.html