当用户在系统与你的应用之间切换的过程中,你的应用中的Activity实例也会在自己的不同生命周期中切换。例如,用户第一次打开你的应用,应用展现在用户的手机桌面,获取用户的输入焦点。在这个过程中,Android系统调用了你的Activity中的一系列的生命周期方法,这些方法建立了应用组建和用户之间的联系。如果用户启动了应用中的另外一个Activity,或者直接切换到另外一个应用,系统也调用了Activity生命周期中的一系列方法使应用可以在后台运行。

在Activity生命周期的回调方法中你可以定义Activity在用户第一次进入和重新进入应用的行为。举例来说,当你做一个流媒体播放器,你可以在用户切换到另外一个应用的时候暂停视频并停止网络连接,当用户切换回来的时候,重新连接网络,并且从用户之前暂停的点继续播放。


理解生命周期中回调方法
   在Activity生命周期之中,系统调用了App生命周期中的回调方法集,这些生命周期回调方法就像一个一级一级的金字塔。Activity生命周期的每一个阶段都对应金字塔的一个台阶。当系统创建了一个新的Activity实例,回调方法一级一级的从塔底向塔顶移动,当位于金字塔顶部的时候,这个Activity就位于用户前台,用户此时就可以与Activity互动了。

当用户要离开Activity的时候,系统调用另外一串方法,使Activity的状态从塔顶移动到塔底。在有些情况下,Activity只是完成部分的状态迁移并且等待用户的指令,并重新回到塔顶的状态。

根据Activity复杂度的不同,你或许不用实现所有的生命周期方法。可是,理解每个生命周期回调函数的意义从而确保你的应用按照用户的期望正确的动作则非常重要。正确的实现生命周期的回调方法,从而使应用正确的动作,主要有以下几点需要注意:
     确保应用在用户使用你的时候可以接电话或者切换到其他应用而不崩溃。
     确保你的应用在用户不使用的时候不消耗系统资源。
     确保用户在从其他的应用切换回你的应用的时候能够继续之前的工作
     在用户屏幕切换或者其他动作的时候不崩溃或者丢失用户数据
   图一所显示的Activity不同状态之间的迁移的几种情形,可是在这些状态当中只有三种是稳定的状态,所谓稳定就是Activity可以在这个状态持续保持一段时间,者三个状态是:
     Resumed:这个状态下,Activity来到用户前台,并且完成与用户的交互。(有些情况下我们也称这个状态为运行态。)
     Paused:在这个状态下,Activity被另外一个在前台运行的半透明的Activity或者被另外一个Activity部分盖住,在这个状态下Activity不能接受用户的输入,也不能执行任何代码 。
     Stopped:在这个状态下,Activity被全部盖住,对用户完全不可见,可以认为已经在后台了。在停止状态下,Activity的所有实例,以及他的所有状态信息都被保存,可是不能执行任何代码。
     另外的状态(Created和Started)是一个过渡状态,系统将迅速通过呼叫生命周期的回调函数来迁移到其生命周期的下一站。系统在呼叫了onCreate()->onStart()->onResume()
   指定你的应用的启动Activity当用户启动你的应用程序的时候系统调用了那个你声明为启动Activity的onCreat()方法。这个Activity作为你的应用主进入点你可以通过修改AndroidManifest.xml这个位于你的工程根目录的文件来实现这一点。
   以下为一个示例:

<span style="font-family:KaiTi_GB2312;"><activity android:name=".MainActivity" android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter>
</activity></span>

注意:当你用Android SDK建立一个工程的时候,工程中的默认会包含一个Activity,而且会被默认为启动Activity
如果MAIN或者LAUNCHER在你的应用中被多次定义,你的应用的图标将不会在用户的应用列表中出现

Start一个Activity

Android应用与其他的过程式编程语言从一个Main()开始运行不同,Android系统通过触发一个特别的Activity生命周期中的一个回调方法来启动一个Activity。Android中有一系列的回调方法启动一个Activity,也有一系列的回调方法来终止一个Activity。

启动一个新的Activity实例
   大部分应用都会提供多个不同的Activity来实现不同的用户功能,当用户通过点击应用图标来启动应用,或者另外一个Activity接受用户的指令来来调用你的应用,系统都会通过调用onCreate()创建一个新的Activity实例。

你必须通过实现onCreate()方法来完成基本的应用启动逻辑,而且这个只会在Activity的生命周期中发生一次。你如你可以通过onCreate()应该定义用户接口和一些系统级的量。

Destroythe Activity销毁一个Activity
   Activity生命周期的第一个回调方法是onCreate(),而其最后一个回调方法是onDestroy()。系统通过调用这个方法将Activity的实例彻底的从系统内存中移除。
大部分的应用可能不需要实现这个方法,因为很多本地类的实例在onPause()和onStop()方法中已经销毁了。当然如果你的应用有些后台运行的线程,或者一些其他的长期占有的系统资源,你也应该在onDestroy()中销毁他们。

注意:系统一般都会在调用了onPause()和onStop()之后再调用onDestroy(),但是如果你在onCreate()方法中调用了finish()则是一个例外。

Pause、Resume一个Activity
   在应用的使用过程中,一个在前台的Activity可能会被部分的遮盖,这回导致Activity进入Pause状态。当一个Activity被完全遮盖时,其进入stop状态。

当你的Activity进入pasued状态,系统调用你的Activity的onPause()方法,从而使你有机会停止你的正在运行的动作,保存你应该保存的信息以保证用户回来的时候不丢失信息


Pause YourActivity
   当系统调用你的Activity的onPause方法,从技术角度来说意味着你的Activity还部分可视,可视更多的是用户将要离开此Activity,这个Activity将进入Stopped状态。你应该使用onPause()方法完成以下功能:
     停止一切可能会消耗CPU的动画后者动作
     提交未保存的修改,当然是用户期望保存的修改
     释放一切可能会消耗电池而你的应用也不需要的资源

一般来说,你不需要用onPause方法将用户修改存储到永久存储器上,唯一的例外就是用户期望自动存储的信息。不管怎么说,你应该避免执行一些消耗CPU的动作,以避免影响Activity之间切换的感觉,你应该在onStop方法中执行那些大运算量的关闭操作。

ResumeYour Activity
   系统如果要将你的Activity从Paused状态唤醒,需要调用onResume方法。

记得你Activity任何一次到前台的运行都需要调用onResume方法。所以你所要实现onResume方法来初始化那些被onPause方法释放的组件。

Stop、Restart一个Activity
   恰当的停止和重启你的Activity是其生命周期中非常重要的过程,他们保证你的应用对用户来说一致都是可用的,并且不会丢失他们的数据,你需要:
      当用户从你的应用切换到其他的应用,你的Activity能够正确的停止;当用户从跟其他的应用切换回你的应用,你的应用可以正确的重启;
      当用户在你的Activity中启动了另外一个新的Activity,当前Activity在新的Activity创建之后停止;当用户点击返回按钮,原先的Activity可以正确重启;
      当用户在使用你的应用的时候接到一个电话,你的Activity可以正确的停止;
   Activity类提供了两个生命周期方法onStop() 和 onRestart(),从而可以定义该Activity停止和重启的过程中的动作。与pause状态不同,stop状态保证UI不再可见,而用户的输入焦点在另外一个Activity中。

注意:在Activity处于停止状态时,系统还是将其保存在系统内存当中,所以你可以不实现onStop() 和 onRestart()方法,甚至你可以连onStart()方法也不必实现。因为大部分Activity都比较简单,你可以通过onPause方法来停止正在运行的动作,断开系统资源。

Stop YourActivity
   当你的Activity被呼叫了onStop方法,它已经不可见了,应该释放所有用户在不使用情况下不需要的资源。当Activity被停止,系统可能销毁这个Activity实例,甚至在极端情况下杀死应用进程已恢复内存等系统资源。

尽管onPause方法在onStop方法之前调用,但是你需要使用onStop方法来执行那些耗CPU资源的操作,例如同步数据库。


Start/RestartYour Activity
   当一个处于停止状态的Activity需要被唤醒到前台运行,它的onRestart方法将被调用,同时onStart方法也会被调用。onRestart方法只有在系统从Stop状态下被激活才会被调用,所以你可以利用其来恢复那些在stop过程中被释放的资源。
   通过onRestart方法来恢复Activity状态的做法不是非常普遍,所以我们没有为这个方法列出一个指南。因为onStop方法应该将Activity中的资源释放,所以你需要在onRestart中将这个资源重新实例化,同样在Activity创建的时候也需要将这些资源实例化,因为这个原因我们一般将onStart和onStop做资源申请与释放上的对应。
   例如,用户切换出你的应用并且长时间没有返回,onStart方法就是去确认系统资源有没有被正确设置的好地方。

当系统需要系会你的Activity,它需要调用你的Activity的onDestroy()方法。因为你已经在onStop方法中释放了大部分的资源,onDestroy方法应当没有很多工作需要完成。这个方法是你释放资源,避免内存泄露的最后的机会,你需要确保所有附加的线程等被正确的停止


Recreate一个Activity
   在一些情况下,Activity因为应用的正常动作被销毁,例如用户按返回按钮,或者应用受到finish()调用。系统也会在Activity长时间不用或者系统需要资源的情况下销毁Activity。
   当你的Activity因为按返回或者自我终结的方式销毁的,系统就会认为Activity不被需要了,会在系统中消失。但是,在因为系统的限制而被销毁的Activity,虽然其实例已经被销毁,但是系统仍然会记住其曾经存在过,当用户切换回来的时候,系统会重新创建一个实例,并且将在销毁时保存在bundle中的实例状态数据传递给这个实例。

注意:Activity在用户旋转屏幕的时候都会销毁并重新创建一个Activity

保存和恢复 Activity 状态

当你的Activity加入stop状态的时候系统调用onSaveInstanceState(),你可以一系列的键值对来存储目前的状态。当Activity需要Resume的时候,系统调用onRestoreInstanceState()将这些键值对恢复出来。

转载自:http://blog.csdn.net/kernel_learner/article/details/8446942

深入理解Activity的生命周期相关推荐

  1. 学习笔记之一:深入理解Activity的生命周期

    Activity作为安卓的四大组件之一,我们可以理解成界面.正常情况下,除了Window,Dialog和Toast,我们能看见的界面的确只有Activity. Activity的生命周期可分为两种情况 ...

  2. 实验3:理解Activity 的生命周期

    代码清单3-1 新增一个TAG常量(QuizActivity.java) 代码清单3-2 为onCreate(...)方法添加日志输出代码(QuizActivity.java) 代码清单3-3 覆盖更 ...

  3. Android 之 Activity 的生命周期(PS:文章多图,流量警告)

    前言: 本篇文章纯粹个人见解,如有错误或不到位的地方,请指出,多谢! 一般都会直接上官方生命周期图,我就不,皮一下好开心. 我先上我的效果图: 从我的效果图看出,一般的打开关闭操作.我也在每个生命周期 ...

  4. 请简述android的生命周期,简述Android Activity的生命周期

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? Activity的生命周期是Android最基本和最重要的知识点之一.如果能深入地理解Activity的生命周期,对我们 ...

  5. android 弹窗 onpause,Android 下拉通知栏时Activity的生命周期——重新理解onPause()

    下拉通知栏时发生了什么 在某个APP中,发现下拉通知栏的时候,正在播放的视频会暂停,于是有点好奇这段操作是不是在生命周期中实现的.在网上众多关于Activity生命周期的讨论中,很多人认为onPaus ...

  6. 深入理解 Android Activity的生命周期

    深入理解 Android Activity的生命周期 2010-10-13 14:08:29|  分类: Android |  标签:周期  调用  activity  android  protec ...

  7. Activity的生命周期理解

    Activity拥有4个基本状态: 活动状态:当前Activity位于前台,可以看见也可以获得焦点,可以接受用户输入的 暂停状态:其他Activity位于前台,该Activity依然可见,但是不能获得 ...

  8. android的应用入口点函数,android 没有main函数,怎么找到程序执行入口呢?以及activity主要生命周期的方法说明...

    android应用程序,由一到多个Activity组成.每个Activity没有很紧密的联系,因为我们可以在自己的程序中调用其它Activity,特别是调用自己的代码之外生成的Activity,比如a ...

  9. Android 中 Activity 的生命周期

    接触 Android 有一段时间了,但是今天才去看 Activity 的生命周期,着实是因为在项目中用到了,需要去关闭释放一些数据. 以下内容来自网络,说的很直白,我就不用整理了 onCreate() ...

最新文章

  1. Velocity知识点总结
  2. java进程优先级,跨平台方式改变java进程优先级
  3. linux下vi修改文件用法
  4. 如何阻止YouTube在iOS,Android和Web上自动播放视频
  5. UML学习(一)-----用例图
  6. 在新项目中使用 Vue3 使用总结
  7. 洛谷P4325、P4413题解(Java语言描述)
  8. Leetcode 111.二叉树的最小深度
  9. EVC获取当前工作路径
  10. 送给创业的朋友:落入坑洞的猎人
  11. AVL树原理理解:旋转与平衡
  12. 用递归求字符串的全组合
  13. layDate时间控件
  14. Android 文本监听接口TextWatcher详解
  15. android 手写字体识别,Android手写识别 (Tesseract-OCR的使用)
  16. Redis Redis主从架构(图灵学院)
  17. [flink]各种大厂开源案例
  18. 如何截取音频片段并制作成手机铃声
  19. VBS 请求WebAPI接口_如何设计WEB API
  20. scikit-learn入门到精通(二):seting和estimator

热门文章

  1. 不同公司系统的对接心得
  2. 查看aix服务器序列号,CentOS和AIX查看系统序列号
  3. 小知识:Java中冒号(:)有哪些用法?
  4. pyinstaller打包exe速记
  5. 揭晓计算机的神秘面纱——计算机是如何工作的(一)
  6. 线性表中的尾插法双链表的学习
  7. 李宏毅机器学习之Deep Learning简介
  8. spring框架aop_使用Spring框架和AOP进行动态路由
  9. oppo手机计算机的隐藏功能介绍,OPPO手机6大隐藏功能,你知道吗
  10. 基于UGUI实现类似Excel表格功能