文档章节

Activity 的生命周期

骑着乌龟的蜗牛
 骑着乌龟的蜗牛
发布于 2014/12/09 18:38
字数 2753
阅读 74
收藏 0

Activity

(参见:http://blog.sina.com.cn/s/blog_75016706010164wb.html,略有修改)

每一个Activity就是一个屏幕,程序把它呈献给用户。程序越复杂Activity就越多。

典型情况下,至少包含一个用来处理应用程序的主UI功能的主屏幕。这个主屏一般由多个Fragment组成,并且通常是由一组次要Activity支持的。要在主屏之间进行切换,就必须要启动一个新的Activity或者从一个Activity返回。

Activity 的框架代码:

public class MainActivity extends Activity {
/** 第一次创建Activity 是被调用 */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}


把一个UI分配给一个Activity 需要在onCreate方法里调用setContentView

如下:TextView 的一个实例被用成ActivityUI

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView tv = new TextView(this);
        setContentView(tv);
    }


要在程序里使用Activity,必须在Manifest里声明一下。

<activity 
    android:name="com.example.MainActivity">
</activity>


在<activity>标签中,可以添加intent-filter节点来指定能够用来启动该Activity的Intent。每一个Intent-filter 都定义了一个或者多个Activity所支持的动作或者分类。如果让某个Activity可以被程序启动器使用,必须监听MAIN动作和LAUNCHER分类的Intent-filter。

 

<activity
      android:name="com.example.persontest.MainActivity"
      android:label="@string/app_name" >
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <categoryandroid:name="android.intent.category.LAUNCHER" />
     </intent-filter>
</activity>


Activity的生命周期

Android 程序不能控制它们自己的进程的生存期,而android 运行时可以管理每一个应用程序的进程,也就是说,它可以管理进程中的每个Activity

除了运行时可以终止一个Activity进程并对其进行管理之外,Activity的状态也可以帮助你确定其父应用程序的优先级。而应用程序的优先级又影响着运行时终止进程几其运行的Activity的可能性。

l  Activity

每一个Activity的状态是由它在Activity栈中所处的位置决定的,Activity栈是所有的正在运行的Activity的后进先出的集合。 当一个新Activity启动时,它就变为Activity状态,并被移动到栈顶。如果用户使用Back键返回到刚才的Activity,或者前台的Activity被关闭了,那么栈中的下一个Activity就会移动到栈顶,变为活动状态。如图:

应用程序的优先级受其最高优先级的Activity的影响。当Android的内存管理器决定终止哪个应用程序来释放资源时,它会使用这个栈来决定应用程序的优先级。

l  Activity 的状态

随着Activity的创建和销毁,他们会从栈中移近移出。这个过程它也经历了下面4种可能的状态:

1.活动状态:当一个Activity位于栈顶时,它是可见的、具有焦点的前台Activity,这时它可以接受用户输入。Android 会不惜一切代价来保持它处于活动状态,并根据需要来销毁栈下面部分的Activity,以保证这个Activity拥有它所需要的资源。当另一个Activity变为活动状态时,这个Activity就将被暂停。

2.暂停状态:在某些情况下,Activity是可见的,但是没有获得焦点,此时它处于暂停状态。当一个透明的或者非全屏的Activity位于该Activity之前时,就会达到这个状态。当Activity被暂停的时候,它仍然会被当做近似于活动的状态的状态,但是它不能接收用户的输入事件。在极端的情况,Android会终止暂停的Activity,以便为活动的Activity释放资源。当一个Activity不可见时,它就会变成停止状态。

3.停止状态:当一个Activity不可见的时候,他就处于不可见状态。此时Activity仍然会停留在内存中,保存所有的状态信息,然而当系统的其他地方要求使用内存的时候,它们就会被终止的首要对象。在一个Activity停止的时候,保存数据和当前的UI状态以及停止任何非关键操作是很重要的。一旦一个Activity被退出或者关闭,它就会变为非活动状态。

4.非活动状态:当一个Activity被终止以后,再启动之前它就是处于非活动状态。处于非活动状态的Activity已经从Activity栈中移除了,因此,在它们可以被显示和使用之前,需要被重新启动。

l  监控状态改变 

为了保证Activity可以对状态改变作出反应,Android 提供了一系列事件处理程序,当Activity在完整的、可见的和活动的生命周期之间转化时,它们机会触发。

public class MainActivity extends Activity {
    
    /** 在Activity生命周期开始时被调用  */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // The activity is being created.
        //初始化一个Activity 并且填充UI
        setContentView(R.layout.activity_main);
    }
    
    /********在onCreate 方法完成后调用,用于恢复UI状态***********/
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        //从savedInstance恢复UI状态
        //这个Bundle 也传递给了onCreate
        //自Activity上次可见后,只有当系统终止了该Activity时,才会被调用
    }
 
    /********当activity从停止状态重新启动时调用************/ 
    //Called after your activity has been stopped, prior to it being started again. Always followed by onStart()
    @Override
    protected void onRestart() {
        super.onRestart();
        //加装载改变,知道Activity在此进程中已经可见
    }
    
    /********当activity对用户即将可见的时候调用。 **************/
    // The activity is about to become visible.
    @Override
    protected void onStart() {
        super.onStart();
        //既然Activity可见,就应用任何要求UI change
    }
    
    /********当activity将要与用户交互时调用此方法,此时activity在activity栈的栈顶,用户输入已经可以传递给它 ********/ 
    // The activity has become visible (it is now "resumed").
    @Override
    protected void onResume() {
        super.onResume();
    }
    
    /****Activity即将移出栈顶保留UI状态时调用此方法 ***/
    //把UI状态改变保存到savedInstanceState
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        //如果进程被运行时终止并被重启,那么这个Bundle将被传递给哦你Create和onRestoreInstanceState
        super.onSaveInstanceState(outState);
    }
    
    /**
     * 当系统要启动一个其他的activity时调用(其他的activity显示之前),
     * 这个方法被用来提交那些持久数据的改变、停止动画、和其他占用 CPU资源的东西。
     * 由于下一个activity在这个方法返回之前不会resumed,所以实现这个方法时代码执行要尽可能快。
     * 这是该Activity依然可见 ,但没有焦点
     */
    @Override
    protected void onPause() {
        //当Activity不是前台的活动状态的Activity时,
        //挂起不需要跟新的UI跟新、线程或者CPU秘籍的线程
        super.onPause();
        // Another activity is taking focus (this activity is about to be "paused").
    }
    
    // 在可见生存期结束时调用
    /**当另外一个activity恢复并遮盖住此activity,导致其对用户不再可见时调用。
     * 一个新activity启动、其它activity被切换至前景、当前activity被销毁时都     会发生这种场景。
     */
    @Override
    protected void onStop() {
        //当Activity不可见时,挂起不需要的UI更新、线程或处理,
        //保存所有的编辑或者状态改变,因为在调用这个方法后,进程可能会被终止
        super.onStop();
        // The activity is no longer visible (it is now "stopped")
    }
 
    //在完整生命周期结束时调用
    /**在activity被销毁前所调用的最后一个方法,当进程终止时会出现这种情况*/ 
    @Override
    protected void onDestroy() {
        //清理所有资源
        //关闭数据库连接等
        super.onDestroy();
         // The activity is about to be destroyed.
    }
    
}


 

在一个Activity的完整的生命周期里,既创造和销毁之间,它会经过一个或多个不同状态之间的转移包括从可见的到不可见,从ActiveInactive。每一次状态的转移都将触发以上这些事件。

Activity完整的生命周期

完整的Activity生命周期之间从调用的OnCreate开始,到调用onDestroy结束。有可能在某些情况下,一个Activity被终止时并不调用onDestroy方法。使用OnCreate方法来初始化你的Activity:初始化的用户界面,分配引用类变量,绑定数据控件,并创建服务和线程。在OnCreate方法传递的对象Bundle包含最后一次调用onSaveInstanceState保存的UI状态。你可以使用这个Bundle恢复用户界面到以前的状态,无论是在OnCreate方法或通过覆盖onRestoreInstanceStateMethod方法。覆盖onDestroy方法来清理OnCreate中创建的任何资源,并确保所有外部连接被关闭,例如网络或数据库的联系。为了避免创造短期对象和增加垃圾收集的时间,以致对用户体验产生直接影响。如果你的Activity需要创建一些对象的话,最好在onCreate方法中创建,因为它仅调用一次在一个Actvity的完整生命周期中。

Activity可见的生命周期
一个Activity可见的生命周期始于OnStart调用,结束于OnStop调用。在这两个方法中间,你的Actvity将会对用户是可见的,尽管它可能没有焦点,也可能部分被遮挡着。在一个Activity完整的生命周期中可能会经过几个Activity可见的生命周期,因为你的Activity可能会经常在前台和后台之间切换。在极端情况下,OPhone Runtime将杀掉一个Activity即使它在可见状态并且并不调用onStop方法。

OnStop方法用于暂停或停止动画,线程,定时器,服务或其他专门用于更新用户界面程序。当用户界面是再次可见时,使用OnStart(或onRestart)方法来恢复或重新启动这些程序,。

onRestart方法优先于onStart被调用当一个Activity被重现可见时,使用它你可以实现一些Activity重新可见时的特殊的处理。

OnStart / OnStop方法也被用来注册和注销专门用于更新用户界面Intent接收者。

Activity活跃的生命周期

一个Activity活跃的生命周期始于OnResume调用,结束于OnPause调用。一个活跃的Actvity总是在前台并且接收用户输入事件。当一个新的Actvity启动,或该设备进入休眠状态,或失去焦点,Activity活跃的生命周期就结束了。尽量在onPauseonResume方法中执行较量轻的代码以确保您的应用程序能够快速响应Acitvity在前台和后台之间切换。在调用onPause之前,onSaveInstanceState会被调用。这个方法提供了一个机会保存当前的UI状态到Bundle当中。 Bundle信息将会被传递到OnCreateonRestoreInstanceState方法。使用onSaveInstanceState保存 UI状态(如检查按钮状态,用户焦点,未提交用户输入)能够确保目前相同的用户界面当Activity下次被激活时。在Activity活跃生命周期中,你可以安全地认为onSaveInstanceStateonPause将被调到即使当前进程将终止。

 


© 著作权归作者所有

骑着乌龟的蜗牛
粉丝 4
博文 20
码字总数 22788
作品 0
大兴
程序员
私信 提问
【Android学习总结】之Activity:深入理解、体验Activity的生命周期

【本博客内的文章是本人的学习笔记总结,如有错误请各位批评指正,谢谢!欢迎加入群285077071讨论】 关于Activity的生命周期的学习,我将从以下几个方面入手来全面认识: 一、什么是生命周期...

kinbos
2018/06/26
0
0
Android面试之Activity补漏

Activity生命周期详解 从一个问题开始:一个Activity开启另外一个Activity,生命周期是怎么走的呢?到了金三银四就开始慌了,一趴基础发现漏洞真的多哎~ 一 Activity的四种状态: Activity...

那个人
03/22
0
0
模块化解耦框架RxFluxArchitecture3-订阅管理绑定生命周期

相关系列文章 模块化解耦框架RxFluxArchitecture1-框架简介 模块化解耦框架RxFluxArchitecture2-基本功能实现 模块化解耦框架RxFluxArchitecture3-订阅管理绑定生命周期 模块化解耦框架RxFlu...

coolfireApy
05/14
0
0
Android Fragment---与Activity生命周期的协调

拥有Fragment的Activity的生命周期直接影响了其中的Fragment的生命周期,这样,针对Activity的每一个生命周期的回调都会有一个类似的针对Fragment的回调。例如,当Activity收到onPause()回调...

长平狐
2012/10/16
1K
0
Android Fragment---处理Fragment生命周期

管理Fragment的生命周期有点像管理Activity的生命周期,跟Activity一样,Fragment也存在三种状态: 恢复态: 这种状态下,Fragment显示在正在运行的Activity中。 暂停态: 这种状态下,另一个...

长平狐
2012/10/16
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring使用ThreadPoolTaskExecutor自定义线程池及实现异步调用

多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实现异步调用多线程。 一、ThreadPoolTaskExecutor 本文采用 Executors 的工厂...

CREATE_17
今天
5
0
CSS盒子模型

CSS盒子模型 组成: content --> padding --> border --> margin 像现实生活中的快递: 物品 --> 填充物 --> 包装盒 --> 盒子与盒子之间的间距 content :width、height组成的 内容区域 padd......

studywin
今天
7
0
修复Win10下开始菜单、设置等系统软件无法打开的问题

因为各种各样的原因导致系统文件丢失、损坏、被修改,而造成win10的开始菜单、设置等系统软件无法打开的情况,可以尝试如下方法解决 此方法只在部分情况下有效,但值得一试 用Windows键+R打开...

locbytes
昨天
8
0
jquery 添加和删除节点

本文转载于:专业的前端网站➺jquery 添加和删除节点 // 增加一个三和一节点function addPanel() { // var newPanel = $('.my-panel').clone(true) var newPanel = $(".triple-panel-con......

前端老手
昨天
8
0
一、Django基础

一、web框架分类和wsgiref模块使用介绍 web框架的本质 socket服务端 与 浏览器的通信 socket服务端功能划分: 负责与浏览器收发消息(socket通信) --> wsgiref/uWsgi/gunicorn... 根据用户访问...

ZeroBit
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部