1,典型情况下的生命周期:
onCreate:表示Activity正在被创建,生命周期的第一个方法。在该方法中可以做一些初始化工作,比如加载布局资源,初始化UI所需要的数据。
onRestart:表示activity正在重新启动。一般情况下,当activity从不可见重新变为可见状态,onRestart就会被调用。(比如用户按home键,然后再回到这个app,则栈顶的activity会调用onRestart)
onStart:Activity正在被启动(已经可见,但是不能交互)
onResume:Activity可见,并且可以交互。
onPause:activity正在停止(可以做一些停止动画、保存操作日志的操作)
onStop:activity即将停止,可以做一些保存数据的轻量级操作
onDestroy:activity即将被销毁,可以做剩下的资源回收操作。
场景:
1,当activity第一次启动时:onCreate->onStart->onResume。
2,当用户打开新的activity或者切换到桌面的:onPause->onstop。(特殊情况,新的activity采用了透明主题,那么当前Activity不会回调onStop)
3,用户再次回到Activity:onRestart->onStart->onResume。
4,用户按back回退:onPause->onStop->onDestroy
onStart和onResume以及onPause和onStop的区别?
onstart(被调用时可见)和onstop(被调用时不可见)是从Activity是否可见的角度来调用
onPause(被调用时可交互)和onResume(被调用时不可交互)是congActivity是否可以交互的角度来调用。
当前Activity为A,如果打开新ActivityB,那么B的onResume和A的onPause哪个先执行?
新的Activity启动之前,栈顶的Activity需要先onPause后,新的Activity才能启动。
2,异常情况下的生命周期
1,资源相关的系统配置发生改变导致Activity被杀死重建(屏幕旋转)
当系统配置发生改变后,Activity会被销毁,其onPause、onStop、onDestroy均被调用,由于Activity是异常情况下终止,因此会调用onSaveInstanceState来保存当前的状态,该方法会在onStop之前被调用。与onPause没有既定的顺序(可能先被调用、可能后被调用)。Activity重新创建后,会调用OnRestoreInstanceState。
保存和恢复View的层次结构:Activity调用onSaveInstanceState保存数据->Activity委托Window去保存数据->Window委托顶层容器(DecorView)保存数据->顶层容器(DecorView)再一一去通知它的子元素保存数据。
2,资源内存不足导致低优先级的Activity被杀死
内存不足时,系统会按照上面的优先级杀死Activity所在的进程,并在后续通过onSaveInstanceState和OnRestoreInstanceState存储和恢复数据。
Android的5个进程等级
1、foreground process
正处于activity resume状态
正处于bound服务交互的状态
正处于服务在前台运行的状态(StartForeGround()被调用)
Service生命周期正在被执行(onCreate(),onStart(),onDestroy())
BroadcastReceiver正在执行onReceive()方法
杀死foreground需要用户响应,因为这个安全优先级是最高的
是用户操作所必须的,任一时间下,仅有少数进程会处于前台,仅当内存实在无法供给它们维持同时运行时才会被杀死。一般来说,在这种情况下,设备依然处于使用虚拟内存的状态,必须要杀死一些前台进程以用户界面保持响应。
•Android会依据进程中当前活跃组件的重要程度来尽可能高的估量一个进程的级别。比如说,如果一个进程中同时有一个服务和一个可视的activity,则进程会被判定为可视进程,而不是服务进程。
2、visible process
activity不在前端显示,但也没有完全隐藏,能够看得见,比如弹出一个对话框
一个bound到visible或者foreground的activity的service
没有前台组件,但仍可被用户在屏幕上所见。当满足如下任一条件时,进程被认为是可视的:
• 它包含着一个不在前台,但仍然为用户可见的activity(它的onPause()方法被调用)。这种情况可能出现在以下情况:比如说,前台activity是一个对话框,而之前的 activity位于其下并可以看到。
• 它包含了一个绑定至一个可视的activity的服务。
可视进程依然被视为是很重要的,非到不杀死它们便无法维持前台进程运行时,才会被杀死。
3、Service process
正在运行的,不在上述两种状态的service
是由 startService() 方法启动的服务,它不会变成上述两类。尽管服务进程不会直接为用户所见,但它们一般都在做着用户所关心的事情(比如在后台播放mp3或者从网上下载东 西)。所以系统会尽量维持它们的运行,除非系统内存不足以维持前台进程和可视进程的运行需要。
4、background process
不可见状态的activity进程,onstop被调用
包含目前不为用户所见的activity(Activity对象的 onStop() 方法已被调用)。这些进程与用户体验没有直接的联系,可以在任意时间被杀死以回收内存供前台进程、可视进程以及服务进程使用。一般来说,会有很多背景进程 运行,所以它们一般存放于一个LRU(最后使用)列表中以确保最后被用户使用的activity最后被杀死。如果一个activity正确的实现了生命周 期方法,并捕获了正确的状态,则杀死它的进程对用户体验不会有任何不良影响。
5、empty process
没有运行任何component的进程,保留这个进程主要是为了缓存的需要
不包含任何活动应用程序组件。这种进程存在的唯一原因是做为缓存以改善组件再次于其中运行时的启动时间。系统经常会杀死这种进程以保持进程缓存和系统内核缓存之间的平衡。