Android基础 Activity的启动流程
##概述:
从应用的启动流程来看,Activity只是一段程序的代码,它既不是程序的入口,也不是程序的必要流程.只是程序运行中的一个场景,一个组件.是基于Context扩展了特定功能接口的一个前台运行的场景.
AMS通过ApplicationThread的引用代理,远程调用ApplicationThread的服务端,并通过ApplicationThread的服务端发送消息给应用程序主线程从而控制Activity的函数调用(即生命周期).
Android属于多进程单窗口系统,只允许当个窗口位于前台,在下一个Activity启动之前,上一个Activity需要先Pause以失去焦点
Activty的生命周期:
Activity 的整个生命周期在三个嵌套循环中:
Activity 的整个生命周期发生在 onCreate() 调用与 onDestroy() 调用之间。您的 Activity 应在 onCreate() 中执行“全局”状态设置(例如定义布局),并释放 onDestroy() 中的所有其余资源。
例如,如果您的 Activity 有一个在后台运行的线程,用于从网络上下载数据,它可能会在 onCreate() 中创建该线程,然后在 onDestroy() 中停止该线程。
*
Activity 的可见生命周期发生在 onStart() 调用与 onStop() 调用之间。在这段时间,用户可以在屏幕上看到 Activity
例如,当一个新 Activity 启动,并且此 Activity 不再可见时,系统会调用 onStop()。您可以在调用这两个方法之间保留向用户显示 Activity 所需的资源。 例如,您可以在 onStart() 中注册一个 BroadcastReceiver 以监控影响 UI 的变化,并在用户无法再看到您显示的内容时在 onStop() 中将其取消注册。在 Activity 的整个生命周期,当 Activity 在对用户可见和隐藏两种状态中交替变化时,系统可能会多次调用 onStart() 和 onStop()。
Activity 的前台生命周期发生在 onResume() 调用与 onPause() 调用之间。在这段时间,Activity 位于屏幕上的所有其他 Activity 之前,并具有用户输入焦点。 Activity 可频繁转入和转出前台
例如,当设备转入休眠状态或出现对话框时,系统会调用 onPause()。 由于此状态可能经常发生转变,因此这两个方法中应采用适度轻量级的代码,以避免因转变速度慢而让用户等待。
启动Activity时的配置:
taskAffinity属性
默认情况下,一个应用程序中的所有activity都有一个affinity,它们属于同一个Task。
每个activity可以通过中的taskAffinity属性设置单独的affinity。
不同应用程序中的activity可以共享同一个affinity。
同一个应用程序中的不同activity也可以设置成不同的affinity。
affinity属性在2种情况下起作用:
启动activity的Intent对象包含FLAG_ACTIVITY_NEW_TASK标记。
启动activity的allowTaskReparenting被设置成true。
Activity启动模式launchMode属性有四种值:
(需要注意的是同一个应用不同Activity可以在不同栈中,不同应用Activity也可以在相同栈中,栈是相对AMS而言,不是应用程序)
standard、singleTop、singleTask和singleInstance。
standard(标准模式):默认模式,可省略。在这种启动模式下,都会默认创建一个新的实例。因此,这种模式允许多个重复Activity叠加。
singleTop(栈顶复用):这种模式允许有多个实例,但不允许多个重复Activity叠加。如果Activity位于栈顶,不会创建新的实例,而会调用onNewIntent()方法。
singleTask(栈内复用):这种模式只有一个实例。在同一应用程序中启动时,若Activity不存在则在当前Task创建一个新的实例,若Activity存在则将Task中在其之上的其它Activity销毁,并调用此Activity的onNewIntent()方法。
singleInstance(全局单例):这种模式只有一个实例,并且该实例独立运行在一个Task中。这个Task只有该实例,不允许其它Activity存在。如果B应用同样启动当前Activity那么将会复用原有实例
Activity的启动流程(Framework版):
从调用StartActivity开始,一般情况都是有正在运行的Activity所以需要先暂停当前正在前台的Activity,
暂停完毕,会给Ams发送一个Binder消息completePause(),在该函数中,由于上一个Activity并没有finish.仅仅是stoping,所以会把上一个Activity添加到mStopingActivites列表中
当目标Activity启动之后依次执行attach,onCreate,onStart,onResume,在performResumeActivity()之后,通过向主进程的Looper中添加IdelHandle,当主进程MessageQueue消息为空时,向Ams发送一个请求进行内存清理的消息.这会导致Ams在内部调用activityIdleInternal()方法,该方法首先会处理mStopingActivites列表中的Activity对象,这里会调用到StopActivityLocked()方法,这会使得Ams依次通知Activty执行onStop和onDestory方法,并在最后执行trimApplication施放内存
相关文章
- 加密狗android,Android系统加密狗的设计与实现
- android开机动画多长时间_Android开机动画原理分析
- 基于chromium for android开发Android浏览器
- js android 换行符,关于js对textarea换行符的处理方法浅析
- android短信验证码方案,Android开发之属于你的短信验证码(一)
- android触摸屏事件,Android Touch事件分析
- Android 编译_android线程
- Android n_android 反编译
- Android | 自定义格子拖拽填充效果
- Android平台GB28181接入端如何对接UVC摄像头?
- android调用相册并显示图片_Android获取相册列表
- android 拍照,图库,相册,上传
- 【Android RTMP】x264 图像数据编码 ( NV21 格式中的 YUV 数据排列 | Y 灰度数据拷贝 | U 色彩值数据拷贝 | V 饱和度数据拷贝 | 图像编码操作 )
- 【Android 安装包优化】资源混淆 ( 资源混淆效果 | APK 构建流程简介 | 资源 ID 组成 )
- 【Android 安装包优化】APK 打包流程 ( 文件结构 | 打包流程 | 安装流程 | 安卓虚拟机 )
- 【Android 逆向】加壳的 Android 应用启动流程 | 使用反射替换 LoadedApk 中的类加载器流程
- 【Android Gradle 插件】 Splits 配置 ① ( BaseExtension#splits 配置 | Splits 配置简介 )
- Android最新Glide 4.0使用简介详解手机开发
- [android] 常用数据适配器ArrayAdapter详解手机开发
- android MVP框架详解手机开发
- Android 服务详解手机开发
- 苹果称 iPhone 的 NFC 比 Android 手机的更安全,谷歌:瞎说
- Android系统自带样式(android:theme)
- Android开发之注册登录方法示例