亲宝软件园·资讯

展开

Android Activity

程序遇上智能星空 人气:0

前言

Android生命周期分为两部分: 

典型情况下的生命周期分析

图1 Activity的生命周期图解

图2 Activity生命周期的金字塔图 

(1)典型情况下的生命周期指在有用户参与的情况下,Activity所经过的生命周期的改变,正常情况下,Activity的常用生命周期有以下几种情况:

/*1.onCreate:
    每个Activity在写代码的过程中都会看见这个函数,
    是声明周期的第一个方法。
    一般做一些资源和数据初始化的工作,
    比如绑定相对应的资源布局setContentView*/
        @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
/*2.onRestart:
    字面意思表示Activity重新启动,这个状态一般由用户切换应用的行为产生,
    比如从应用切换到桌面或者切打开新的Activity,
    此时这个Activity就会调用onPause和onStop让这个Activity进入展厅状态。
    再回到这个Activity就是onRestart了*/
        @Override
    protected void onRestart() {
        super.onRestart();
    }
/*3.onStart:
    这个状态我理解就是Activity启动中的一个过程,
    就是启动中,但是还不能与用户交互(用户不可见),
    属于一个在后台的状态*/
        @Override
    protected void onStart() {
        super.onStart();
    }
/*4.onResume:
    表示Activity已经可见,且已经开始活动。
    与onStart类似的状态但是就是属于一种在前台的状态*/
        @Override
    protected void onResume() {
        super.onResume();
    }
/*5.onPause:
    是一个非常微妙的状态,处于正在停止的一个临界点,
    就很难重现这种状态,就是在停止过程中,
    先执行onPause然后在onStop执行之前,
    回到Activity执行onResume,这期间就是onPause的状态。
    此处可以做一些存储数据停止动画的工作,但是不能太耗时,
    不然会影响到新Activity的显示,只有这些操作做完,
    新Activity的OnResume才会执行。*/
        @Override
    protected void onPause() {
        super.onPause();
    }
/*6.onStop:
    表示Activity即将停止,可以做一些相对重量级的回收工作,
    同样不能太耗时。*/
    @Override
    protected void onStop() {
        super.onStop();
    }
/*onDestroy
    表示Activity即将被销毁,这是Activity生命的尽头,
    可以做一些回收工作和资源的释放。*/
    @Override
    protected void onDestroy() {
        super.onDestroy();
    }

(2)进一步地,可以将Activity分为3种生存期:

(3)Activity的活动状态

(返回栈:每启动一个新的活动,会在返回栈中入栈,并处于栈顶的位置。每销毁一个活动,处于栈顶的活动会出栈,前一个入栈的活动会重新处于栈顶的位置。)

异常情况下的生命周期分析 (1)系统配置发生改变引起生命周期的异常变化

举例:开启手机的自动旋转后,当Activity从竖屏状态转变为横屏时,系统会自动销毁原先的Activity并重建。如果不做特殊处理,那么每当系统配置改变时,Activity都会销毁重建,

如图所示:

图3 旋转手机时Activity的生命周期变化情况

当手机从竖屏转变为横屏时,可以看到原Activity执行: onPause -> onSaveInstanceState -> onStop -> onDestroy ,走完原Activity的生命周期。当原Activity销毁后又会迅速的开启新的Activity执行 :onCreate -> onStart -> onRestoreInstanceState -> onResume, 最终新的Activity显示在用户界面上。onSaveInstanceState 和 onRestoreInstanceState 两个方法仅在生命周期异常情况下执行。onSaveInstanceState主要是对异常销毁的Activity进行数据保存,onRestoreInstanceState主要是对存储的数据进行恢复,数据存取都是通过Bundle,因此我们可以在Bundle中附加个人数据进行读写。经过测试onSaveInstanceState在onStop前调用,onRestoreInstanceState在onStart方法后调用。这两个方法执行的过程中,系统会自动对视图进行信息数据的存取,例如:ListView的滚动位置等等。(2)资源内存不足导致低优先级的Activity被杀死

当系统资源不足时,系统会按照上述优先级去杀死目标的 Activity 所在的进程,并在后续通过 onSaveInstanceState 和 onRestoreInstanceState 来存储和恢复数据。如果一些后台的进程脱离了四大组件而独立运行,那么这个进程很快就被杀死。我们常常将后台工作放到 Service 中保持进程具有一定的优先级。

图4 configChanges添加orientation后的效果

当系统配置改变时Activity会销毁重建,通过在AndroidMainManifest.xml中为Activity添加configChanges属性去避免这个情况。configChanges的属性有很多,例如:orientation表示屏幕方向变化、KeyboardHidden表示虚拟键盘可访问性变化等,通过设置这些属性后当运行过程中发生上述情况Activity既不会销毁重建也不会调用 onSaveInstanceState 和 onRestoreInstanceState 两个方法,而是执行onConfigChanged方法。

问题: (1)onStart 和 onResume、onPause 和 onStop 从功能描述上看大同小异,到底有什么区别呢?

这两组方法对的回调意义不同,onState 和onStop 是从 Activity 是否可见这个角度来回调的,而 onResume 和 onPause 是从 Activity 是否位于前台这个角度来回调的,不过在实际使用中没有其他明显区别。

(2)假设当前Activity为A,如果这时用户打开了一个新的Activity B,那么B的onResume方法和A的onPause方法谁先执行呢?

根据Android的基本运行机制,不能在onPause中执行重量级的操作,因为必须onPause执行完成以后新Activity才能onResume。onPause和onResume都不能执行耗时的操作,尤其是onPause,这就意味着我们应该在onStop中操作,从而使新的Activity显示出来并切换到前台。

加载全部内容

相关教程
猜你喜欢
用户评论