Android」四大组件之Activity,你真的都掌握了?

一、 Activity

提供一个界面让用户点击和各种滑动操作

1.1 生命周期

启动Activity: onCreate()--->onStart()--->onResume(),Activity进入运行状态。Activity退居后台: 当前Activity转到新的Activity界面或按Home键回到主屏: onPause()--->onStop(),进入停滞状态。Activity返回前台: onRestart()--->onStart()--->onResume(),再次回到运行状态。Activity退居后台,且系统内存不足, 系统会杀死这个后台状态的Activity,若再次回到这个Activity,则会走onCreate()-->onStart()--->onResume()锁定屏与解锁屏幕 只会调用onPause(),而不会调用onStop方法,开屏后则调用onResume()

1.1.1 两个活动间跳转

Activity A 启动另一个Activity B,回调如下: Activity A 的onPause() → Activity B的onCreate() → onStart() → onResume() → Activity A的onStop(); 如果B是透明主题又或则是个DialogActivity,则不会回调A的onStop;

如何将一个 Activity 设置成窗口的样式? 只需要给我们的 Activity 配置如下属性即可: android:theme="@android:style/Theme.Dialog"

1.1.2 onSaveInstanceState

Activity 的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它们不同于 onCreate()、onPause()等生命周期方法,它们并不一定会被触发。

调用条件

应用场景

1.1.3 拓展

lateinit : 从原理分析Kotlin的延迟初始化: lateinit var和by lazy

Koltin中属性在声明的同时也要求要被初始化,否则会报错。 例如以下代码:

可是有的时候,我并不想声明一个类型可空的对象,而且我也没办法在对象一声明的时候就为它初始化,那么这时就需要用到Kotlin提供的延迟初始化。 Kotlin中有两种延迟初始化的方式。一种是lateinit var,一种是by lazy。

1.2 启动模式

1.2.1 standard

默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个相同的实例,也允许多个相同Activity叠加。

1.2.2 singleTop

可以有多个实例,但是不允许多个相同Activity叠加。即,如果Activity在栈顶的时候,启动相同的Activity,不会创建新的实例,而会调用其onNewIntent方法。

1.2.3 singleTask

只有一个实例。在同一个应用程序中启动他的时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。如果是在别的应用程序中启动它,则会新建一个task,并在该task中启动这个Activity,singleTask允许别的Activity与其在一个task中共存,也就是说,如果我在这个singleTask的实例中再打开新的Activity,这个新的Activity还是会在singleTask的实例的task中。

1.2.4 singleInstance

只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在。

1.2.5 task

我们知道,一个应用中可能有多个 Activity,而这些 Activity 被以栈的形式管理。当我们新打开 Activity 或者按返回时,会导致 Activity 的入栈/出栈。Task 是指在执行特定任务时与用户交互的一系列 Activity。 这些 Activity 按照各自的打开顺序排列在堆栈中。

1.3 启动过程

这里需要结合源码自己看,不做展开,针对面试的话,只需记住方法/调用链即可

1.3.1 ActivityThread.java

在Android中它就代表了Android的主线程,注意是代表而不是说它就是一个Thread类它是创建完新进程之后(肯定是在一个线程中啊),main函数被加载,然后执行一个loop的循环使当前线程进入消息循环,并且作为主线程。接下来还会初始化很多必要的属性. 它的很多成员变量和内部类十分的重要,深入理解这些成员变量有助于我们进一步的认识Android系统的各个组件的交互。

1.3.2 拓展

Instrumentation

Android instrumentation是Android系统里面的一套控制方法或者”钩子“。 这些钩子可以在正常的生命周期(正常是由操作系统控制的)之外控制Android控件的运行。 它们同时可以控制Android如何加载应用程序。

Base class for implementing实现 application instrumentation code工具代码. When running with instrumentation turned on, this class will be instantiated for被实例化 you before any of the application code, allowing you to monitor all of the interaction交互 the system has with the application. An Instrumentation implementation is described to the system through an AndroidManifest.xml's tag.

ActivityManagerService「AMS」ActivityManagerService 你了解多少?

AMS是系统的引导服务,应用进程的启动、切换和调度、四大组件的启动和管理都需要AMS的支持。

ActivityStarter

ActivityStarter是加载Activity的控制类,收集所有的逻辑来决定如何将Intent和Flags转为Activity并将其与Task和Stack关联。

ActivityStackSupervisor

AMS 通过操作ActivityStackSupervisor来管理Activity

ActivityStack

ActivityStack从名称来看是跟栈相关的类,其实它是一个管理类,用来管理系统所有Activity的各种状态。它由ActivityStackSupervisor来进行管理的,而ActivityStackSupervisor在AMS中的构造方法中被创建。

ApplicationThread

它是ActivityThread的私有内部类,也是一个Binder对象。在此处它是作为IApplicationThread对象的server端等待client端 的请求然后进行处理,最大的client就是AMS.

1.4 关于 Content 和 Application

1.4.1 Context 须知

Context 从字面上理解就是上下文的意思,在实际应用中它也确实是起到了管理 上下文环境中各个参数和变量的总用,方便我们可以简单的访问到各种资源。

Context继承关系

最后

本文主要讲解 详解Android中的四大组件之一:Activity。漫漫开发之路,我们只是其中的一小部分……只有不断的学习、进阶,才是我们的出路!才跟得上时代的进步!

今年年初我花一个月的时间收录整理了一套知识体系,如果有想法深入的系统化的去学习的,可以

私信我【安卓】,我会把我收录整理的资料都送给大家,帮助大家更快的进阶。

重要的事说三遍,转发+转发+转发,让更多需要的朋友们都可以看到并且领到!