一、Activity介绍
Activity是Android组件中最基本也是最为常见用的四大组件(Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器)之一 。
Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务。
Activity中所有操作都与用户密切相关,是一个负责与用户交互的组件,可以通过setContentView(View)来显示指定控件。
在一个android应用中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。Activity之间通过Intent进行通信。
二、Activity 生命周期
(一) Activity生命周期回调方法
1、onCreate()回调方法
您必须实现此回调,它会在系统首次创建 Activity 时触发。Activity 会在创建后进入“已创建”状态。在 onCreate() 方法中,您需执行基本应用启动逻辑,该逻辑在 Activity 的整个生命周期中只应发生一次。例如,onCreate() 的实现可能会将数据绑定到列表,将 Activity 与 ViewModel 相关联,并实例化某些类作用域变量。此方法会接收 savedInstanceState 参数,后者是包含 Activity 先前保存状态的 Bundle 对象。如果 Activity 此前未曾存在,Bundle 对象的值为 null。
如果您有一个生命周期感知型组件与您的 Activity 生命周期相关联,该组件将收到 ON_CREATE 事件。系统将调用带有 @OnLifecycleEvent 注释的方法,以使您的生命周期感知型组件可以执行已创建状态所需的任何设置代码。
2、onStart()回调方法
onCreate() 退出后,Activity 将进入“已启动”状态,并对用户可见。此回调包含 Activity 进入前台与用户进行互动之前的最后准备工作。
3、onResume()回调方法
系统会在 Activity 开始与用户互动之前调用此回调。此时,该 Activity 位于 Activity 堆栈的顶部,并会捕获所有用户输入。应用的大部分核心功能都是在 onResume() 方法中实现的。
onResume() 回调后面总是跟着 onPause() 回调。
4、onPause()回调方法
当 Activity 失去焦点并进入“已暂停”状态时,系统就会调用 onPause()。例如,当用户点按“返回”或“最近使用的应用”按钮时,就会出现此状态。当系统为您的 Activity 调用 onPause() 时,从技术上来说,这意味着您的 Activity 仍然部分可见,但大多数情况下,这表明用户正在离开该 Activity,该 Activity 很快将进入“已停止”或“已恢复”状态。
如果用户希望界面继续更新,则处于“已暂停”状态的 Activity 也可以继续更新界面。例如,显示导航地图屏幕或播放媒体播放器的 Activity 就属于此类 Activity。即使此类 Activity 失去了焦点,用户仍希望其界面继续更新。
您不应使用 onPause() 来保存应用或用户数据、进行网络呼叫或执行数据库事务。有关保存数据的信息,请参阅保存和恢复 Activity 状态。
onPause() 执行完毕后,下一个回调为 onStop()或 onResume(),具体取决于 Activity 进入“已暂停”状态后发生的情况。
5、onStop()回调方法
当 Activity 对用户不再可见时,系统会调用 onStop()。出现这种情况的原因可能是 Activity 被销毁,新的 Activity 启动,或者现有的 Activity 正在进入“已恢复”状态并覆盖了已停止的 Activity。在所有这些情况下,停止的 Activity 都将完全不再可见。
系统调用的下一个回调将是 onRestart()(如果 Activity 重新与用户互动)或者 onDestroy()(如果 Activity 彻底终止)。
一般情况下当一个Activity被其他Activity覆盖时,被覆盖的Activity都会调用onStop()方法,但是有两种情况除外:
上层Activity是Dialog风格时:
上层Activity是透明时;
这两种情况只会调用onPause()方法,但不会调用onStop方法.
相关的属性就是:
<item name="android:windowIsTranslucent">true</item> 或者 android:theme="@android:style/Theme.Translucent.NoTitleBar"
6、onRestart()回调方法
当处于“已停止”状态的 Activity 即将重启时,系统就会调用此回调。onRestart() 会从 Activity 停止时的状态恢复 Activity。
此回调后面总是跟着 onStart()。
7、onDestroy()回调方法
系统会在销毁 Activity 之前调用此回调。
此回调是 Activity 接收的最后一个回调。通常,实现 onDestroy() 是为了确保在销毁 Activity 或包含该 Activity 的进程时释放该 Activity 的所有资源。
启动Activity方法的生命周期调度:
比方说我们点击跳转一个新Activity,这个时候Activity会入栈,同时它的生命周期也会从onCreate()到onResume()开始变换,这个过程是在ActivityStack里完成的,ActivityStack是运行在Server进程里的,这个时候Server进程就通过ApplicationThread的代理对象ApplicationThreadProxy向运行在app进程ApplicationThread发起操作请求。
ApplicationThread接收到操作请求后,因为它是运行在app进程里的其他线程里,所以ApplicationThread需要通过Handler向主线程ActivityThread发送操作消息。主线程接收到ApplicationThread发出的消息后,调用主线程ActivityThread执行响应的操作,并回调Activity相应的周期方法。
如下为Activity的常见场景的生命周期调用方式:
三、Activity相关类
frameworks/base/core/java/android/app
Activity
最基本的Activity类,所有的Activity都直接或间接继承自它。
Activity文件路径:
frameworks/base/core/java/android/app/Activity.java
Activity定义:
public class Activity extends ContextThemeWrapper
implements LayoutInflater.Factory2,
Window.Callback, KeyEvent.Callback,
OnCreateContextMenuListener, ComponentCallbacks2,
Window.OnWindowDismissedCallback,
ContentCaptureManager.ContentCaptureClient {
static final class NonConfigurationInstances {}
private static final class ManagedCursor {}
private static final class RequestFinishCallback extends IRequestFinishCallback.Stub {}
public interface TranslucentConversionListener {}
class HostCallbacks extends FragmentHostCallback<Activity> {}
}
基本方法:
1、getIntent():获取Intent
2、getApplication():获取Application
3、getWindow:获取Window
4、getWindowManager():获取WindowManager
5、findViewById(int id):通过id查找View
6、requireViewById(int id):通过id查找View
7、setContentView(int layoutResID):设置Activity的布局
8、setIntent(Intent newIntent):设置Intent
9、startActivity(Intent intent):启动Activity
10、startActivityForResult(Intent intent, int requestCode) :启动Activity
11、finish():结束Activity
12、finishAffinity():结束Activity
13、public void recreate():用于重新创建当前Activity的实例。当系统配置发生变化(例如屏幕旋转、语言设置更改等)时,Activity会被销毁并重新创建。在这种情况下,系统会调用Activity的recreate方法来重新创建Activity的实例,以便保留当前的状态和数据。
14、getCurrentFocus():获取当前界面焦点所在的View
15、getActionBar():获取Activity的ActionBar
16、setActionBar(Toolbar toolbar):设置Activity的ActionBar
17、setTitle(int titleId):设置Title
18、dispatchKeyEvent(KeyEvent event):监听按键事件
19、dispatchTouchEvent(MotionEvent ev):监听触摸事件
20、requestPermissions(String[] permissions, int requestCode):运行时请假权限
21、setResult(int resultCode):设置结果
22、setVisible(boolean visible):设置可见
23、requestWindowFeature(int featureId):请求启动窗口特性的方法,通常在调用setContentView之前使用,以启用特定窗口特性,包括FEATURE_NO_TITLE(隐藏标题栏)、FEATURE_ACTION_BAR(启动应用程序操作栏)、FEATURE_PROGRESS(启用水平进度条)FEATURE_INDETERMINATE_PROGRESS(启动不定进度条)
24、registerActivityLifecycleCallbacks(Application.ActivityLifecycleCallbacks callback):注册生命周期回调接口
25、unregisterActivityLifecycleCallbacks(Application.ActivityLifecycleCallbacks callback):解除注册生命周期回调接口
回调方法:
1、onCreate():Activity创建时调用,一般在此方法中进行界面初始化操作。
2、onStart():Activity可见但没有获取焦点时调用,可在此方法中进行一些UI更新动作。
3、onResume():Activity获取焦点且可见时调用,可在此方法中进行数据刷新和动画效果等操作。
4、onPause():Activity失去焦点但可见时调用,应该停止一些耗资源的操作,例如动画、音乐播放等。
5、onStop():Activity不可见时调用,应该是否该Activity占用的资源,例如动画、音乐播放等。
6、onDestroy():Activity销毁时调用,应该释放所有资源并清除所有监听。
7、onRestart():Activity重新启动时调用,可在此方法中恢复之前保存的数据。
8、onPostCreate():Activity的界面布局完成后,进行一些进一步初始化操作对UI控件进行调整,该方法在Activity的onCreate()方法执行完毕后调用。
9、onSaveInstanceState():当Activity即将销毁前,系统会调用这个方法,用户保存当前Activity信息。
10、onRestoreInstanceState(Bundle saveInstanceState, PersistableBundle persistentState):当系统销毁并重新创建时被调用。
11、onLowMenory():低内存时被调用
12、onTrimMemory(int level):内存不足被调用
13、onKeyDown(int keyCode, KeyEvent event):按键按下被调用
14、onKeyUp(int keyCode, keyEvent event):按键抬起被调用
15、onKeyMultiple(int keyCode, int repeatCount, KeyEvent event):处理多个按键事件
16、onBackPressed():处理后台按按钮的点击事件
17、onTouchEvent(MotionEvent event):处理触摸事件
18、onWindowAttribtesChanged(WindowManager.LayoutParams params):处理窗口变化
19、onActivityResult(int requestCode, int resultCode, intent data):处理Activity结果
20、onConfigurationChanged(Configuration newConfig):用于响应设备配置的变化。
21、final void attach(Context context, ActivityThread aThread, Instrumentation instr, IBinder token, int ident, Application application, Intent intent, ActivityInfo info, CharSequence title, Activity parent, String id, NonConfigurationInstances lastNonConfigurationInstances, Configuration config, String referrer, IVoiceInteractor voiceInteractor, Window window, ActivityConfigCallback activityConfigCallback, IBinder assistToken, IBinder shareableActivityToken) :用于将Activity与当前的上下文环境进行关联。在attach()方法中,Activity会完成一系列的初始化工作,包括与WindowManagerService建立联系、创建Window、加载布局文件等。
ActivityClient
Provides the activity associated operations that communicate with system.
提供与系统通信的活动关联操作。
ActivityClient文件路径:
frameworks/base/core/java/android/app/ActivityClient.java
ActivityClient定义:
public class ActivityClient {
private static class ActivityClientControllerSingleton
extends Singleton<IActivityClientController> {}
}
ActivityOptions
ActivityOptions是Android提供的一个类,用于在Activity之间实现过渡动画效果。它可以让你在启动一个新的Activity时,为该Activity指定一个过渡动画,并且可以在两个Activity之间共享元素的过渡效果。
ActivityOptions文件路径:
frameworks/base/core/java/android/app/ActivityOptions.java
ActivityOptions定义:
public class ActivityOptions extends ComponentOptions {}
ActivityTransitionState
ActivityTransitionState是Android中的一个类,用于管理Activity之间的转场动画状态。它主要用于保存和恢复Activity的转场动画信息,以便在Activity之间进行平滑的过渡。
ActivityTransitionState文件路径:
frameworks/base/core/java/android/app/ActivityTransitionState.java
ActivityTransitionState定义:
class ActivityTransitionState {}
四、Activity相关流程分析
Activity startActivity流程分析
Activity startActivity的处理流程比较长,下面以启动一个新的Activity为例进行分段介绍:
1、执行Activity的startActivity方法,开始启动Activity。
Android13 Activity startActivity流程分析-CSDN博客
2、执行ActivityTaskManagerService的startActivity方法,向ATMS申请启动Activity。
Android13 ActivityTaskManagerService startActivity流程分析-CSDN博客
3、如果Activity的进程不存在先调用ActivityManagerService的startProcessLocked方法创建一个新进程,然后再继续执行剩余步骤。如果ctivity的进程存在就略过此步骤。
Android13 ActivityThread handleLaunchActivity流程分析-CSDN博客
4、执行ActivityTaskSupervisor的realStartActivityLocked方法,真正开始启动Activity,在这个方法中会执行Activity的生命周期。
Android13 ActivityTaskSupervisor realStartActivityLocked流程分析-CSDN博客
5、执行ActivityThread的handleLaunchActivity方法,处理Activity的Launch请求,实例化Activity。
Android13 ActivityThread handleLaunchActivity流程分析-CSDN博客
6、执行Activity的attach方法,将Activity与当前的上下文环境进行关联。
Android13 Activity attach流程分析-CSDN博客
7、执行Activity的performCreate方法,通知Activity已经Create完成,在这个流程中会调用我们熟悉的onCreate回调方法。
Android13 Activity performCreate流程分析-CSDN博客
8、第4步中(ActivityTaskSupervisor的realStartActivityLocked方法)中会根据Activity的生命周期,调用ActivityThread的handleStartActivity方法,处理Activity的Start请求。
Android13 ActivityThread handleStartActivity流程分析-CSDN博客
9、执行Activity的performStart方法,通知Activity已经Start完成,在这个流程中会调用我们熟悉的onStart回调方法。
Android13 Activity performStart流程分析-CSDN博客
10、第4步中(ActivityTaskSupervisor的realStartActivityLocked方法)中会根据Activity的生命周期,调用ActivityThread的handleResumeActivity方法,处理Activity的Resume请求。
Android13 ActivityThread handleResumeActivity流程分析-CSDN博客
11、执行Activity的performResume方法,通知Activity已经Resume完成,在这个流程中会调用我们熟悉的onResume回调方法。
Android13 Activity performResume流程分析-CSDN博客
Activity setContentView流程分析
Activity setContentView的处理流程比较长,下面进行分段介绍:
应用进程
1、调用Activity的setContentView方法开始加载布局:
Android13 Activity setContentView流程分析-CSDN博客
2、调用Windoe(phoneWindow)的setContenView方法,创建DecorView,加载系统布局文件和App的布局文件。
Android13 Window setContentView流程分析-CSDN博客
3、调用ViewRootImpl的performTraversals方法,开始View的三大流程(measure、layout、draw):
Android13 ViewRootImpl performTraversals流程分析-CSDN博客
4、调用View的measure方法,该方法会从DecorView开始按照View树一层一层的进行测量:
Android13 View measure流程分析-CSDN博客
5、调用WindowManagerService的relayoutWindow方法,计算窗口的大小以及内容区域边衬大小和可见区域边衬大小,另外还有创建Surface和SurfaceControl对象用于描画和Surface控制:
Android13 WindowManagerService relayoutWindow流程分析-CSDN博客
6、调用view的layout方法,进行view的布局,这期间可能涉及多次布局:
Android13 View layout流程分析-CSDN博客
7、调用Surface的lockCanvas方法,获取Canvas对象,以便进行绘图操作:
Android13 Surface lockCanvas流程分析-CSDN博客
8、调用view的draw方法,开始描画:
Android13 View draw流程分析-CSDN博客
9、 调用Surface的unlockCanvasAndPost方法,用于解锁并提交Surface上的画布内容:
Android13 Surface unlockCanvasAndPost流程分析-CSDN博客
10、调用Surface的queueBuffer方法,将图像数据放入Surface的缓冲区中:
Android13 Surface queueBuffer流程分析-CSDN博客
11、调用BufferQueueProducer的queueBuffer方法,将图形缓冲区添加到队列中:
Android13 BufferQueueProducer queueBuffer流程分析-CSDN博客
12、调用BufferQueueLayer的onFrameAvailable方法,通知图像或视频帧已经可用并准备好显示:
Android13 BufferQueueLayer onFrameAvailable流程分析-CSDN博客
13、调用mFlinger(SurfaceFlinger)的onLayerUpdate方法,通知SurfaceFlinger图层更新:
Android13 SurfaceFlinger onLayerUpdate流程分析-CSDN博客
SurfaceFlinger进程:
14、调用mCompositor(ICompositor)的commit方法,ICompositor是一个接口,由SurfaceFlinger实现,SurfaceFlinger的commit方法用于将应用程序的绘制结果提交到屏幕上显示:
Android13 SurfaceFlinger commit(提交)流程分析-CSDN博客
15、调用mCompositor(ICompositor)的commit方法,ICompositor是一个接口,由SurfaceFlinger实现,SurfaceFlinger的composite用于将多个窗口的图像进行合成:
Android13 SurfaceFlinger composite(合成)流程分析-CSDN博客
在之后就是HWC的处理了。