美文网首页Android学习笔记Android开发
Android Note - Activity生命周期

Android Note - Activity生命周期

作者: 肉丝汤 | 来源:发表于2016-04-05 15:51 被阅读139次
    Android生命周期官方示意图

    上图是官方示意图,将整个生命周期分为6个部分

    • Created 首次创建并被初始化,整个生命周期中只调用一次
    • Started 初始化完成,用户此时已经可以看到Activity窗口,但并不能交互
    • Resumed 完成创建,此时可以与用户进行交互
    • Paused 失去焦点,此时不可与用户进行交互
    • Stopped 处于用户不可见状态,但并没有被销毁
    • Destoryed 被系统销毁,释放资源

    回调函数


    Activity的生命周期是由framework层的ActivityServiceManager控制的,用户并不能控制Activity的生命周期,但是可以通过Activity生命周期变化的几个回调方法来影响并管理Activity生命周期

    • onCreate()
      • 新建Activity的回调方法,只有当Task栈中没有对应的Activity时才调用该方法
      • 此回调方法会默认调用一个名为savedInstanceState的Bundler对象(该对象在内存中),并通过检测该对象是否为null来判断是否创建新的实例或恢复被Destroy的Activity对象
      • 必须调用父类的onSaveInstanceState()才能恢复Activity的状态信息
    • onStart()
      • 初始化完成后的回调方法,用户此时可以看到Activity的界面,但不能进行交互操作
      • 此回调方法中的操作与onStop()方法对应,即在onStop()中释放了哪些资源,就要在onStart()方法中重新创建
      • 在此回调方法之后有一个方法onRestoreInstanceState()可以恢复Activity的状态信息
    • onResume()
      • 启动或重新启动Activity完成后的回调方法,此时用户可以进行交互
    • onPause()
      • Activity失去焦点后的回调方法,此时界面可见,但是无法交互 - 在此回调方法中可以保存数据到缓存中(并非写入数据库或者文件),停止animation,释放GPS、Camera等资源。注意在onPause()中避免进行耗费CPU资源的操作
    • onRestart()
      • 重新启动Activity时的回调方法,该方法中会直接执行start方法
    • onStop()
      • Activity不可见时的回调方法,用户此时已经看不到Activity的界面,但是Activity本身未被销毁
      • 因为系统在内存紧张时,可能会在调用onDestory()方法之前就销毁Activity所以在onStop()回调方法中释放资源,防止内存泄漏。此外对于耗费CPU资源的操作,如保存数据到数据库或文件中也可以在该回调方法中操作
      • 该回调方法中系统也会默认调用onSaveInstanceState()方法,保存Activity的状态信息
    • onDestory()
      • Activity被移出Task栈,并被系统销毁

    常见场景的分析


    • 启动Activity
      当系统得到启动一个Activity的请求时,会到当前进程的ActivityTask栈中寻找对应的Activity;如果没有找到则创建该Activity。会依次调用onCreate() -> onStart() -> onResume() 进入Resumed状态
    启动Activity
    • 销毁Activity
      当Activity从Task栈被退出时,启动销毁流程;如果本身处于Stopped状态,则直接调用onDestroy()销毁;如果处于Resumed状态,则会依次调用onPause() -> onStop() -> onDestroy() 进入Destroyed状态
    销毁Activity
    • 在Activity A基础上启动新Activity B
      因为启动B,A要从Resume的状态变为Stopped状态,依次调用onPause() -> onStop();而B依然按照正常启动的方式依次调用onCreate() -> onStart() -> onResume();但是A只有在B启动完毕进入Resumed状态后才会进入Stopped状态,所以对于A与B整个时间序列上,是如下表的形式
    在Activity A基础上启动新Activity B
    • 将Activity B弹出并还原Activity A(假定A未被销毁)
      B被Task栈弹出,所以要被销毁至Destroyed状态;而A此时处于Stopped状态,要切换至Resumed状态,依次调用onRestart() -> onStart() -> onResume();同理,B会先进入Paused状态,等A Resume完成后才进入Stopped状态。时间序列如下
    将Activity B弹出并还原Activity A(假定A未被销毁)
    • 弹出与关闭对话框
      当弹出对话框时,Activity在视图上可见但处于失去焦点的状态,即Paused;所以此时Activity会调用onPause()方法;当对话框被关闭时,Activity会调用onResume()方法重新获取焦点
    弹出与关闭对话框

    屏幕旋转


    如果未配置Manifest中的android:configChanges,则在切换横竖屏时Activity的生命周期将重新开始,会调用onCreate(),生命周期重新开始
    如果配置Manifest中的android:configChanges="keyboardHidden|orientation|screenSize",则将调用onConfigurationChanged,并且不会调用onCreate(),而是直接从onStart()开始调用

    参考资料


    Android生命周期
    Android Activity生命周期都该做哪些事情?


    相关文章

      网友评论

        本文标题:Android Note - Activity生命周期

        本文链接:https://www.haomeiwen.com/subject/tsuplttx.html