Android开发中,有四大组件:Activity、Service、Content Provider、Broadcast Receiver,可以说,activity的使用是最频繁的了,这里来梳理一下与activity相关的生命周期和启动模式的知识。

  在正常情况下,指内存充足,有用户参与情况下,activity的生命周期过程如下图所示:

  

  当我们启动Activity_A时,经历如下步骤:

  1. onCreate函数被调用,该函数主要进行页面布局资源的初始化和数据初始化;

  2. onStart函数被调用,此时页面控件树已加载完成,但是还没展示出来,还在后台

  3. onResume函数被调用,此时页面显示在前台,处于活动状态                         (这3步是启动一个acitivity会经历的)

  4. 用户触发Activity_B启动

  5. Activity_A的onPause函数被调用,在这里可以进行数据存储、动画停止等操作,但是不能进行耗时操作,让新的activity尽快显示出来,更多的资源回收可在onStop处理,否则影响Acvitiy_B的显示,因为Activity_B的onResume函数需要在Activity_A的onPause函数执行完才执行

  6. Activity_A的onStop调用,回收资源                                                         (5、6步是当前栈顶activity退出前台时会被调用)

  7. 进入Activity_B

  8. 用户触发返回Activity_A

  9. Activity_A的onRestart函数调用,回到第二步

  10. 退出Activity_A,调用次序为: onPause --> onStop --> onDestroy

  Activity在Android源码的路径为:{USER_PATH}/android-5.0.0_r7_code/frameworks/base/core/java/android/app/*.java,如下:

  

  当发生异常情况,如横竖屏变化、内存不足时,activity可能会被系统回收,这时情况如下:

  默认系统会帮我们保存现场,如视图结构、已输入的部分数据,销毁时,会在onPause或onStop之后调用onSaveInstanceState,在重建activity时,在onStart后系统调用onRestoreInstanceState恢复现场。我们看看ScrollView源码怎么处理的:

  

    scrollview的这个功能支持在4.3版本后才有的。在writeToParcel里系统保存了scrollview的滑动位置,用于后面重建activity时恢复现场。

    类似的,可以看源码来了解其他控件是保存了什么数据。

  如果在异常情况发生时,需要自定义保存的数据,建议使用onSaveInstanceState和onResotreInstanceState来进行处理,当然,也可在onCreate使用其传入的参数来获取,但是注意需要进行null的判断,因为第一次启动activity值是空的。

  如果需要系统忽略默认的配置变化后的调用行为,可以在清单文件加入android:configChanges="..."配置,如为:android:configChanges="orientation|screenSize"(在minSDKVersion和targetSDKVersion均大于13时,需要orientation和screenSize都加上,这个和编译环境有关),那么,在横竖屏发生时,需要重写onConfigurationChanged(Configuration newConfig)来进行自定义处理,系统这是不会调用onCreate来重建activity了。除了orientation属性,local属性也很常用,在修改了app使用的语言后,重新刷新页面时用到。

Android开发之---Activity生命周期的更多相关文章

  1. Android开发----WebView&Activity生命周期

    WebView webview是一个再应用中设置好位置和大小的浏览器,而且不会放置任何花哨的UI. 在大多数情况下,除非你调用了原生API,否则不必在webview中专门测试web应用. 首先为Web ...

  2. 【Android实验】第一个Android程序与Activity生命周期

    目录 第一个Android程序和Activity生命周期 实验目的 实验要求 实验过程 1. 程序正常启动与关闭 2. 外来电话接入的情况 3. 外来短信接入的情况 4. 程序运行中切换到其他程序(比 ...

  3. Android-管理Activity生命周期 -重新创建Activity

    按照正常的app行为,很少情况下activity会销毁,只有当用户点击了返回按钮或者activity通过调用finish()发出销毁信号.系统也有可能销毁activity如果它是停止状态并且很久没有使 ...

  4. Android-管理Activity生命周期 -停止和重启Activity

    停止和重启activity在activity的生命周期中很重要,它能让用户感觉你的app总是激活的而且不会丢失他们的进度.activity在下面的这些情况会停止和重启: 用户打开常用app窗口然后从你 ...

  5. Android-管理Activity生命周期 -暂停和恢复一个Activity

    在正常的使用app时,前台的activity有时候会被可见的组件阻塞导致activity暂停.比如,当打开一个半透明的activity(就像打开了一个对话框),之前的activity就会暂停.只要ac ...

  6. Android-管理Activity生命周期 -开始一个Activity

    很多程序都是从main()方法开始启动的,和其他程序不同,android是在activity生命周期的特定状态的特定回调方法中初始化代码的.activity启动和销毁的时候都用很多回调方法. 这里将要 ...

  7. 【Android 应用开发】Activity生命周期 与 Activity 之间的通信

    一. Activity生命周期 上图 1. Activity状态 激活状态 : Activity出于前台 , 栈顶位置; 暂停状态 : 失去了焦点 , 但是用户仍然可以看到 , 比如弹出一个对话框 , ...

  8. Android体系结构及activity生命周期

    Android的系统架构采用了分层架构的思想,如图1所示.从上层到底层共包括四层,分别是应用程序程序层.应用框架层.系统库和Android运行时和Linux内核 Android的系统架构图    每层 ...

  9. android学习笔记 activity生命周期&任务栈&activity启动模式

    activity生命周期 完整生命周期 oncreate->onstart->onresume->onpause->onstop->ondestory 使用场景:应用程序 ...

随机推荐

  1. 跳转Activity两种方法

    摘要:假设从A界面开启另外一个B界面根据是否需要返回数据分为两种方式 一.无需返回数据方式 在A界面中调用startActivity方法进行直接跳转即可 二.需要返回数据方式 1.在A界面中调用sta ...

  2. ssh项目将搜索条件进行联动

    <s:form namespace="/tb" action="tenderList" name="searchForm" id=&q ...

  3. java高新技术-java5的静态导入与编译器语法设置

    静态导入 import语句可以导入一个类或某个包中的所有类 import static 语句导入有一个类中的某个静态方法或所有静态方法 使用Math.random() 可以这样做 package co ...

  4. spring-事务管理

    一个数据库事务是一个被视为单一的工作单元的操作序列.这些操作应该要么完整地执行,要么完全不执行.事务管理是一个重要组成部分,RDBMS 面向企业应用程序,以确保数据完整性和一致性.事务的概念可以描述为 ...

  5. mosquitt win32

    软件 mosquitto-1.4.10-install-win32.exe. 安装时候提示下载后面两个.win32openssl一定是1_0_1,否则没有需要的dll文件. pthreadVC2.dl ...

  6. 关于WEB项目的一点想法

    有点失落.迷茫,差点在上班的时候发了火.原因是之前离职的一位同事,在代码里不加注释,而且百般偷懒,致使很多应该的验证没有验证,很多应该考虑到的情况没有考虑.因为是老员工,我相比他来说是新员工.气势上总 ...

  7. 友盟ionic多渠道自动签名app

    这几天公司的运营部门要求添加流量统计功能,集成了友盟的插件,中间遇到很多的问题,在这里说明记录一下,为遇到相同问题的朋友们减少麻烦 问题一.插件的使用直接将友盟sdk系在放置到项目根目录下plugin ...

  8. IntelliJ IDEA 15 在线激活地址

    License server,直接输入http://www.iteblog.com/idea/key.php地址即可激活IntelliJ IDEA 15:

  9. Google map markers

    现已被屏蔽 http://mabp.kiev.ua/2010/01/12/google-map-markers/ Надо по немногу отходить от празднывания но ...

  10. Pjax调用

    $.pjax({container:'#content_center',url:href,data:data}); $(document).on('pjax:send', function() {// ...