我指的不是framework层的东西,而是最基础的Activity生命周期。
* 按下home、back、电源键、进程管理器效果?
* 横竖屏、输入键盘、ScreenSize?
* onSaveInstanceState和onRestoreInstanceState执行时机?
* SingleTop、SingleTask、SingleInstance方式时的onNewIntent()?
最近在复习,好像不同的手机系统和版本,有不同的生命周期,越来越晕乎了。
原文出处:链接:https://www.zhihu.com/question/41352677/answer/91030381
关于Activity生命周期,对于网上也有大量博客讲到这个问题,
Activity生命周期:
![](https://pic1.zhimg.com/50/4aa93209cbaef5c2a9bbd2003d928641_hd.jpg?source=1940ef5c)
这幅图比较清晰,就不细说,**下面我就说说图上没有的吧**
**(一)Activity与进程的关系**
作为应用开发者,接触更多的是Activity/Service/Broadcast/ContentProvider这四大组件以及线程,往往对于进程没有很多的概念,这是google有意为之,除非在AndroidManifest.xml文件中配置android:process属性,否则一般情况下一个App是运行在一个进程中。
在Android系统启动的过程中,便创建好Android上层应用的环境,即Android Runtime,一切的应用都是运行在Android Runtime这个层面之上。而进程对于App来说是完全透明的,在Activity进入生命周期之前,会先创建好进程,可以把进程理解为Activity的载体。一个进程中可以有多个Activity,而一个Activity必须且只能存在一个进程里;进程里可以不存在任何Activity,而Activity不能离开进程而孤立存在。
**(二)home键、back键、电源键、进程管理器**
**一般情况下**
按下home键:前台Activity依次回调onPause, onStop;
按下back键:前台Activity依次回调onPause, onStop, onDestroy;
按下电源键:前台Activity依次onPause, onStop;
对于进程管理器,采用的force-stop的方式,也是直接强杀进程,并且连广播都会隔断。
**为何我要强调是一般情况呢,**
目前android应用市场比较混乱,各种应用商店,各种app,里面不乏有很多让手机后台大量消耗CPU,导致手机卡顿,或者在后台偷偷耗电、跑流量的应用。
**针对这些情况,国内各大手机厂商都会针对Android有不同程度的定制与优化。**这可能会导致那些一般情况的理论与实际有所不同。
比如系统有L**ow Memory Killer**(低内存杀手),在手机内存比较紧张时会强杀应用,这也会导致Activity挂了,这是Android自带的机制。对于厂商,比如灭屏杀进程,那么这就可能导致按下电源键,Activity的生命周期就玩完了;另外,现在大多数App,拦截返回键功能,使其与home键效果一致,那么不排除有对返回键的极端优化情形。
**(三) 横竖屏切换**
在未做任何处理的情况,旋转后,Activity生命周期重新运行:onPause, onStop, onDestroy, onCreate, onStart, onRestoreInstanceState, onResume。
而目前,google版本的碎片化非常严重,而版本迭代快(今年5月份就能看到Android 7.0),在Android不断升级与完善的同时也新增不少功能,这就导致同一个功能也需要变更。
另外,还是前面的说的,对于configchange部分厂商会对其行为定制是完全可能的,屏幕的旋转后重走生命周期是比较卡的一个过程。
**(四)launch mode**
Activity启动模式有4种:standard、singleTop、singleTask和singleInstance。相关文章也很多,这里简单说下我的理解:
* standard是默认方式,一个Task中可以有多个相同类型的Activity;
* singleTop(字面理解单例栈顶),是指task栈顶只会有一个同类型的Activity;
* singleTask(字面理解单例task),是指不只是栈顶,整个task只会有一个同类型的Activity;
* singleInstance(字面理解单例实例):不只是整个task只会有一个同类型Activity,而且该task也只有这一个Activity;
**对于Activity实例的单例要求是不断加强: standard < singleTop <singleTask < singleInstance**
有了这些简单铺垫,再说下题主的问题**onNewIntent()**的触发时机是在启动Activity时却不需要创建新的Activity实例的情形下触发。 比如singleTop时,当再次启动task栈顶的Activity会触发;singleTask/singleInstance时,再次启动task的Activity会触发。
**另外,对于一般App尽量少用singleTask和 singleInstance模式,可能会影响用户体验。**
**(五) 结束**
建议题主,平时多看看google官方文档,看Android源码,多动手写demo程序,另外,就是学会翻墙。
通过打log来验证,留给有兴趣的不妨试试,finish()方法在onCreate,onStart,onResume等不同地方调用finish()后,Activity走的生命周期也是不同的。
- 前言
- Android系统的体系结构
- Dalvik VM 和 JVM 的比较
- Android 打包应用程序并安装的过程
- Android ADB工具
- Android应用开发
- Android UI相关知识总结
- Android 中window 、view、 Activity的关系
- Android应用界面
- Android中的drawable和bitmap
- AndroidUI组件adapterView及其子类和Adapter的关系
- Android四大组件
- Android 数据存储
- SharedPreference
- Android应用的资源
- 数组资源
- 使用Drawable资源
- Material Design
- Android 进程和线程
- 进程
- 线程
- Android Application类的介绍
- 意图(Intent)
- Intent 和 Intent 过滤器(Google官网介绍)
- Android中关于任务栈的总结
- 任务和返回栈(官网译文)
- 总结
- Android应用安全现状与解决方案
- Android 安全开发
- HTTPS
- 安卓 代码混淆与打包
- 动态注入技术(hook技术)
- 一、什么是hook技术
- 二、常用的Hook 工具
- Xposed源码剖析——概述
- Xposed源码剖析——app_process作用详解
- Xposed源码剖析——Xposed初始化
- Xposed源码剖析——hook具体实现
- 无需Root也能Hook?——Depoxsed框架演示
- 三、HookAndroid应用
- 四、Hook原生应用程序
- 五、Hook 检测/修复
- Android 应用的逆向与加固保护技术
- OpenCV在Android中的开发
- Android高级开发进阶
- 高级UI
- UI绘制流程及原理
- Android新布局ConstraintLayout约束布局
- 关键帧动画
- 帧动画共享元素变换
- Android异步消息处理机制完全解析,带你从源码的角度彻底理解
- Android中为什么主线程不会因为Looper.loop()里的死循环卡死?
- 为什么 Android 要采用 Binder 作为 IPC 机制?
- JVM 中一个线程的 Java 栈和寄存器中分别放的是什么?
- Android源码的Binder权限是如何控制?
- 如何详解 Activity 的生命周期?
- 为什么Android的Handler采用管道而不使用Binder?
- ThreadLocal,你真的懂了吗?
- Android屏幕刷新机制