首页 > 编程知识 正文

android生命周期回调,安卓四大组件的生命周期

时间:2023-05-05 14:10:06 阅读:110220 作者:444

Activity生命周期官方文档https://developer.Android.Google.cn/guide/components/activities/activity-life cycle

六个

onCreate —— onStart可见—— onResume有焦点—— onPause无焦点—— onStop不可见—— onDestory onRestart方法在Activity不可见的情况下再次前台

所有生命周期方法的重写实现都必须调用父方法。 由于Activity经常在暂停和恢复之间切换,因此onResume和onPause逻辑应该指示系统在某些情况下会回收内存并导致onStop。 onDestory可能不会被调用,因此根据情况可以在onPause中存储重要的数据。 对于耗时的操作,需要在经典场景1的第一个处理中打开一个子线程

//activityaoncreate-onstart-on resume场景在Activity A中启动Activity B

//activityaon pause-(在activitya被Activity B覆盖后再去) onStop -) activity a自身完成或被系统回收后再去时) onDestory//activityboncreate-onstart-- (activity b等待Activity A的密码运行)如果onresumeactivityb完全透明或对话框主题,则Activity A为onstonstor

//activitybonpause-onstop-on destory//activityaonrestart-onstart-on resume//activity a本身回收到finish或系统后,请单击

//锁定画面onPause、onStop//解锁onResume场景不点击HOME按钮或来电

单击Home键返回到来电on pause-onstop//apponrestart-onstart-on resume//前台活动完成或已收回到系统中。 这样应该进入onCreate-onstart-onresume生命周期。oncreate调用setContentView方法来设置布局定义成员变量,并设置数据初始化视图、控件和UI元素布局要通过将数据绑定到列表等来关联Activity和ViewModel,请尽量减少onCreate的工作量,以免程序启动过度而看不到接口,然后使用savedInstanceState参数

onStart会重新创建在onStop中释放的资源,包括注册广播以收听UI中的变化。 onResume撤消在onPause中停止的操作。 例如,相机预览开始动画意味着Activity位于Activity堆栈的顶部,并获得了焦点

onPause释放系统资源,传感器(如GPS )手柄、Camera等停止动画在此可以存储APP应用程序、用户数据、进行网络调用、执行数据库事务这意味着它不适合耗时的工作

地图导航页面通常在这里不释放。 因为我希望你还能继续工作

尽量减少onPause的工作量,避免Activity切换缓慢的纸箱

onStop需要释放不再需要的资源

按需从准确位置更新切换到大致的位置更新

关闭那些CPU执行比较集中的操作

将用户内容(如邮箱草稿)保存到永久存储空间

用户首选项持久性数据或数据库中的数据

用Service定时更新UI上的数据,停止Service

您可以在此处保存APP应用程序或用户数据、调用网络或执行数据库事务处理

onDestoty必须释放以前回调中未释放的所有资源,如onStop。 不建议在onDestroy上执行释放资源的任务。 onDestroy的执行时间可能会延迟,根据实际需求

在onPause或onStop中组合执行isFinishing判断

异常的生命周期内存不足时,Activity会回收到系统中,而不是直接退出Activity以释放内存,而是退出存在Activity的进程,不仅是Activity,还会释放该进程上运行的其他

:横竖屏切换、系统语言改变、输入设备的改变、切换到多窗口模式( Android 7.0 Api 24 )使用【设置】里的【应用管理器】来停止应用以终止进程

Activity 会先销毁再重建

onSaveInstanceState

super.onSaveInstanceState 里已经实现保存视图层次结构的状态的逻辑

保存有关 Activity 的 view hierarchy state 视图层次结构状态的瞬时信息(如输入框的值、列表滑动后停留的位置),系统用于恢复先前状态的已保存数据称为实例状态,是存储在 Bundle 对象中的键值对集合,默认情况下,系统使用 Bundle 实例状态来保存 Activity 布局中每个 View 对象的相关信息,系统因系统限制(例如配置变更或内存压力)而销毁 Activity 时候,如果用户尝试回退到该 Activity,系统将使用一组描述 Activity 销毁时状态的已保存数据新建该 Activity 的实例,无需编写代码就能恢复布局状态为其先前的状态,

Bundle 对象并不适合保留大量数据,在主线程中进行序列化和反序列化,会产生一定内存消耗

保存临时数据为主,保存简单轻量的界面状态,如果保存大量数据应该配合使用 ViewModel 进行处理

调用在 onStop 之前

主动调用 finish 方法和点击返回键的时候是不会调用该方法保存状态的

onRestoreInstanceState

super.onRestoreInstanceState 已经实现恢复视图层次结构的状态的逻辑

调用在 onStart 之后

可用于恢复一些 onSaveInstanceState 方法中保存的数据

横竖屏切换

不设置 Activity 的 android:configChanges 时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

设置 Activity 的 android:configChanges=“orientation” 时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

设置 Activity 的 android:configChanges=“orientation|keyboardHidden” 时,切屏不会重新调用各个生命周期,只会执行 onConfigurationChanged 方法

常见问题

1 如果在 onCreate 方法中直接调用 finish 方法,生命周期是怎样的?

系统会跳过其他生命周期直接调用 onDestory 方法,其实在任何一个生命周期调用 finish 方法都会跳过这之前的所有其他生命周期

2 什么时候只会走 onPause,而不会走 onStop ?

锁屏打开一个完全透明或对话框主题的 Activity

3 Activity 在什么时候会出现不执行 onDestory 的情况?

主线程异常崩溃

应用被强杀

4 下拉状态栏时 Activity 的生命周期是什么?

不走任何生命周期,状态栏和 AlertDialog、Toast 等都是通过 WindowManager.addView 方法来显示的,对 Activity 的生命周期没有影响,另外可以通过 onWindowFocusChanged(boolean hasFocus) 监听状态栏,hasFocus 为 false 可以表示下拉状态,从而可以实现暂停视频等需求

5 启动一个其它应用的 Activity 的生命周期分析?

6 如何统计 Activity 的工作时间?

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。