博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Activity 的生命周期
阅读量:6539 次
发布时间:2019-06-24

本文共 6392 字,大约阅读时间需要 21 分钟。

hot3.png

Activity

(参见:,略有修改)

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

 

      
        
        
     

Activity的生命周期

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

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

l  Activity

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

183722_sWmS_730588.png

应用程序的优先级受其最高优先级的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在完整的、可见的和活动的生命周期之间转化时,它们机会触发。

183744_5avL_730588.png

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将被调到即使当前进程将终止。

 

转载于:https://my.oschina.net/litengit/blog/354289

你可能感兴趣的文章
标准与扩展ACL实验
查看>>
励志决心
查看>>
【技巧】easyUI的datagrid,如何在翻页以后仍能记录被选中的行
查看>>
Android中visibility属性VISIBLE、INVISIBLE、GONE的区别
查看>>
某篇ctr预估ppt的链接
查看>>
在CentOS7中配置网络时常见的LSB加载失败问题
查看>>
Kafka 0.7.2 单机环境搭建
查看>>
经过强制类型转换以后,变量a, b的值分别为( )short a = 128; byte b = (byte) a;
查看>>
Dcloud课程6 php脚本如何在Linux下定时更新数据
查看>>
js进阶 14-7 jquery的ajax部分为什么需要对表单进行序列化
查看>>
PHP array_merge() 函数
查看>>
JavaScript&jQuery.3组内置对象
查看>>
day6面向对象--类的特殊成员方法
查看>>
vertical-align,text-align 和 align的区别
查看>>
Octavia 创建 loadbalancer 的实现与分析
查看>>
写代码原则
查看>>
新浪短网址接口实现
查看>>
JavaScript组合设模式--改进上述引入的例子
查看>>
10.界面装饰
查看>>
HDU 1312
查看>>