每一个Android开发者都应该知道,android系统有四个重要的基本组件,即Activity(活动)、Service(服务)、Broadcast Receive(广播接收器)和Content Provider(内容提供器),其中,Activity是最重要的组件,打开你手机上的APP,你眼睛所能看到的都是Activity,下面将会介绍关于Activity生命周期的几个问题。

1 Activity生命周期的8个回调函数

下图是Activity的生命周期图,相信许多人都看过不止一次,但有的人是看到这张图时明白,过一段时间就记不清或者忘了,怎么才能完全理解并掌握呢?

其实很简单,只要记住下面两点就行:

(1)      Activity的6个回调函数onCreate()– onStart() – onResume() – onPause() – onStop() – onDestroy()可以分成三组,里边的onResume()和onPause()表示Activity是否在前台获得焦点,onStart()和onStop()表示Activity是否可见,最外边的onCreate()和onDestroy()表示Activity是否存在。OnRestart()函数在Activity第一次启动时并不会被调用,当Activity从onStop()不可见状态重新回到可见状态时会先调用onRestart(),再调用onStart(),除了这7个回调函数外,还有一个函数很重要,就是onSaveInstanceState(), 常常用它来保存Actitity的一些状态变量。

(2)      Activity正常启动后,都会停在onResume()函数之后,想象一下,你打开Android手机的APP,正在看某个Activity上面显示的内容,如果这个Activity打印出了调试信息并且你能够看到,那么大概信息就会如下图所示

你看Activity上面的内容时,Activity就会停在onResume函数之后。

2 Activity几个重要回调函数的说明

上面提到的Activity的8个回调函数,究竟哪些最重要呢?

onCreate()肯定是最重要的,IDE都会默认生成onCreate()函数,它会在Activity第一次被创建时调用,在onCreate()函数中会加载布局,初始化视图,绑定事件和其他的各种初始化操作,一个Activity的其他几个回调函数都有可能不被调用,但onCreate()一定会被调用,因为onCreate()里面往往内容很多,所以不要把所有代码都写到一起,这样不便于维护,而应该分成各种子函数,类似下面的方式:

protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity);
f1();
f2();
f3();
...
}

onPause()是离开Activity时调用的第一个方法,你在onPause()里应该保存一些重要数据,释放系统资源,因为只有onPause()_执行完后,下一个Activity才能正常运行,所以onPause()不能执行耗时操作。

onSaveInstanceState()常常被用作保存Activity临时的状态信息,在系统配置信息发生变化或者内存低导致重建Activity时,这个函数非常有用。比如我们在EditText输入的信息,在屏幕发生旋转时,信息就会丢失,这种情况,我们可以在onSaveInstanceState()保存用户输入的数据,然后在onCreate()或onRestoreInstanceState()进行恢复,后者更加方便一些,因为不需要进行Null值判断。

3 其他小问题

(1)      关于super.onCreate(savedInstanceState)

你会发现,每一个回调函数都会首先调用父类的回调函数,super.onX(),这个是必须的,如果不调用父类的回调函数,运行时应用会崩溃。

(2)      为什么没有看到Activity的构造函数

其实,你可以写Activity的构造函数,无参数的构造函数确实会在onCreate()之前执行,但构造函数实际上作用不大,系统会在Activity构造函数执行后创建上下文环境,然后再调用onCreate()函数,所有的初始化操作都应该放在onCreate()中。

(3) 什么时候只会调用onPause()而不会调用onStop()

onPause()表示Activity失去焦点,onStop()表示不可见,所以必须是Activity失去焦点但部分可见才能只调用onPause而不调用onStop(), 但并不是所有的失去焦点并部分可见就会调用onPause(), 如当前Activity产生的对话框,系统的关机对话框,音量对话框,都使当前Activity失去焦点,但都不会调用onPause()函数。

怎样才能调用onPause()而不调用onStop呢?可以新建两个Activity,用Activity1启动Activtiy2,把Activity2的主题设为

android:theme="@style/Theme.AppCompat.Dialog"

你就发现Activity1只会调用onPause()而不会调用onStop。

当你在Activity打开某个网址是,系统会弹出对话框,会有几个应用让你选泽,如UC浏览器或QQ浏览器等,此时,就只会调用onPause(),还没有调用onStop()。具体方法大家可以自己实验测试。

以上是Activity生命周期的几个问题,其他关于Activity的内容后面可以再讨论。

转载请注明出处 http://www.cnblogs.com/thewalker3000/p/6528768.html

欢迎大家评论

Android Activity生命周期的几个问题的更多相关文章

  1. [转]: 两分钟彻底让你明白Android Activity生命周期(图文)!

    转自:http://blog.csdn.net/android_tutor/article/details/5772285 大家好,今天给大家详解一下Android中Activity的生命周期,我在前 ...

  2. Android Activity生命周期

    从android api文档摘抄出来的activity生命周期图如下: Activity有如下四种状态 a.活动状态  activity处于屏幕前台,获取到了焦点可以和用户进行交互,同一时刻只有一个a ...

  3. Android Activity生命周期详讲

    管理 Activity 生命周期 通过实现回调方法管理 Activity 的生命周期对开发强大而又灵活的应用至关重要. Activity 的生命周期会直接受到 Activity 与其他 Activit ...

  4. android Activity生命周期(设备旋转、数据恢复等)与启动模式

    1.Activity生命周期     接下来将介绍 Android Activity(四大组件之一) 的生命周期, 包含运行.暂停和停止三种状态,onCreate.onStart.onResume.o ...

  5. Android Activity生命周期以及Fragment生命周期的区别与分析

    Android Fragment生命周期图: Activity生命周期图: 对照图: Fragment生命周期分析: 1. 当一个fragment被创建的时候,它会经历以下状态. onAttach() ...

  6. Android Activity 生命周期详解

    学习android开发这么久对于activity的生命周期还没有仔细思考过,所以,我大致的把这些东西整理一下,希望通过这使自己理解的更透彻点吧! 首先看一下Activity生命周期图和它的的四个阶段 ...

  7. xamarin Android activity生命周期详解

    学Xamarin我为什么要写这样一篇关于Android 的activity生命周期的文章 已经学Xamarin android有一段时间了,现在想起当初Xamarin也走了不少的弯路.当然Xamari ...

  8. Android——Activity生命周期(转)

    Activity生命周期   子曰:溫故而知新,可以為師矣.<論語> 学习技术也一样,对于技术文档或者经典的技术书籍来说,指望看一遍就完全掌握,那基本不大可能,所以我们需要经常回过头再仔细 ...

  9. android --Activity生命周期具体解释

    一. 再探Activity生命周期 为了研究activity的生命周期,简单測试代码例如以下. package com.example.testactivity; import android.app ...

随机推荐

  1. Hihocoder #1098 : 最小生成树二·Kruskal算法 ( *【模板】 )

    #1098 : 最小生成树二·Kruscal算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 随着小Hi拥有城市数目的增加,在之间所使用的Prim算法已经无法继续使用 ...

  2. 字典树(Trie树) C++实现

    说明: 以下代码是个人按照自己的理解写的,可能有错误或者不太规范的地方,欢迎指出! 代码如下: //插入.删除.查询.遍历四种操作 //注意:四种操作的函数实现中,T都是指向上一个结点的指针,以此方便 ...

  3. 「NOIP2000」「Codevs1042」 进制转换

    题目描述 Description 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式.例如:123可表示为 1*102+2 ...

  4. 关于GitHub的DNS基础设施,你了解吗?

    在 GitHub,我们最近从头改进了 DNS.这包括了我们如何与外部 DNS 提供商交互以及我们如何在内部向我们的主机提供记录.为此,我们必须设计和构建一个新的 DNS 基础设施,它可以随着 GitH ...

  5. 【旧文章搬运】Windows内核常见数据结构(驱动相关)

    原文发表于百度空间,2008-7-24========================================================================== 这些是驱动中 ...

  6. 通过链接将JSP页面中一变量传到另一JSP界面中

    A.jsp 发送 <a herf="B.jsp?name=<%=name%>">传递到B页面</a> B.jsp  接收 <%String ...

  7. ibatis 中 $与#的区别

    ibatis 中 $与#的区别 使用#: select * from table where id = #id# 如果字段为整型:#id#表示成id select * from table where ...

  8. Ubuntu中右击出现终端

    1 root用户 $sudo apt-get install  nautilus-open-terminal 2重启 3ok

  9. E20180427-hm

    创建: 2018/04/27 dissolve vi. 溶解; 融化,液化; 解散,散去; 分裂,分解;    vt. 使溶解; 使(固态物)溶解为液体,使液化; 使消失,使消逝,消除; 使终止; c ...

  10. Ruby基本语法

    更新: 2017/06/09 更新: 2017/06/20 cattr_accessor定义类变量,相当于@@ 更新: 2017/06/23 生成类的实例 更新: 2017/06/24 补充loop的 ...