安卓开发笔记——关于Activity生命周期的一些事情

  温故而知新很重要,对于先前学过的东西,每一次回过头来看都有不一样的体会,要么理解更深了,要么理解更透彻了。

  近来回顾了关于Activity的生命周期,参看了相关书籍和官方文档,有了不小的收获,在以前的认知上有了很大程度上的改善,在这里记录点东西。

先来看下经典生命周期图:

简单概要下:

1、当第一次调用一个Activity就会执行onCreate方法

2、当Activity处于可见状态的时候就会调用onStart方法

3、当Activity可以得到用户焦点的时候就会调用onResume方法

4、当Activity被遮挡住的时候就会调用onPause方法,遮挡结束会返回用户获取焦点状态的onResume方法

5、当Activity处于不可见状态的时候就会调用onStop方法,如果Activity没有被销毁会重新调用onRestart方法,然后返回onStart方法

7、当Activity被销毁时会调用onDestory方法

来段代码测试下:

 1 package com.lcw.rabbit.activity;
 2
 3 import android.app.Activity;
 4 import android.content.res.Configuration;
 5 import android.os.Bundle;
 6 import android.util.Log;
 7
 8 public class MainActivity extends Activity {
 9
10     private String mInfo;
11
12     @Override
13     protected void onCreate(Bundle savedInstanceState) {
14         super.onCreate(savedInstanceState);
15         setContentView(R.layout.activity_main);
16         Log.i("Rabbit", "onCreate------");
17         mInfo="I Am Rabbit";
18     }
19
20     @Override
21     protected void onStart() {
22         super.onStart();
23         Log.i("Rabbit", "onStart------");
24     }
25
26     @Override
27     protected void onResume() {
28         super.onResume();
29         Log.i("Rabbit", "onResume------");
30     }
31
32     @Override
33     protected void onPause() {
34         super.onPause();
35         Log.i("Rabbit", "onPause------");
36     }
37
38     @Override
39     protected void onStop() {
40         super.onStop();
41         Log.i("Rabbit", "onStop------");
42     }
43
44     @Override
45     protected void onDestroy() {
46         super.onDestroy();
47         Log.i("Rabbit", "onDestroy------");
48     }
49
50     @Override
51     protected void onRestart() {
52         super.onRestart();
53         Log.i("Rabbit", "onRestart------");
54     }
55
56     @Override
57     protected void onSaveInstanceState(Bundle outState) {
58         super.onSaveInstanceState(outState);
59         outState.putString("info",mInfo);
60         Log.i("Rabbit", "onSaveInstanceState------info:"+mInfo);
61     }
62
63     @Override
64     protected void onRestoreInstanceState(Bundle savedInstanceState) {
65         super.onRestoreInstanceState(savedInstanceState);
66         String info=savedInstanceState.getString("info");
67         Log.i("Rabbit", "onRestoreInstanceState------info:"+info);
68     }
69
70     @Override
71     public void onConfigurationChanged(Configuration newConfig) {
72         super.onConfigurationChanged(newConfig);
73         Log.i("Rabbit", "onConfigurationChanged------");
74     }
75
76     @Override
77     public void onWindowFocusChanged(boolean hasFocus) {
78         super.onWindowFocusChanged(hasFocus);
79         Log.i("Rabbit", "onWindowFocusChanged------");
80     }
81
82 }

测试结果图:

1、当Activity进入的时候,依次调用onCreate->onStart->onResume,进入运行状态。

2、当手机按下Home键回到手机桌面的时候,依次调用onPause->onStop,进入停滞状态。

3、当再次进入Activity的时候,依次调用onRestart->onStart->onResume,再次进入运行状态。

4、当Activity被其他Activity覆盖或被锁屏,系统会调用onPause方法,暂停当前Activity的执行。

5、当Activity由被覆盖状态回到前台或解锁屏,系统会调用onResume方法,再次进入运行状态。

6、当按下手机Back键,依次调用onPause->onStop->onDestroy,结束当前Activity。

上面是对Activity生命周期的初步演示,但仅仅了解这些是远远不够的,为了使程序更加健壮,用户体验更加友好,我们还需要去关注一些细节方面的东西。

这里我们需要额外的关注3个方法:onWindowFocusChanged、onSaveInstanceState、onRestoreInstanceState

1、onWindowFocusChanged:在Activity窗口获得或失去焦点时被调用;

(1)创建时首次呈现在用户面前;

(2)当前Activity被其他Activity覆盖;

(3)当前Activity转到其他Activity或按Home键回到主屏,自身退居后台;用户退出当前Activity。

当Activity被创建时onWindowFocusChanged是在onResume之后被调用,当Activity被覆盖或者退居后台或者当前Activity退出时,onWindowFocusChanged是在onPause之后被调用。

  

2、onSaveInstanceState:

(1)在Activity被覆盖或退居后台之后,系统资源不足将其杀死,此方法会被调用;

(2)在用户改变屏幕方向时,此方法会被调用;

(3)在当前Activity跳转到其他Activity或者按Home键回到主屏,自身退居后台时,此方法会被调用。

第一种情况我们无法保证什么时候发生,系统根据资源紧张程度去调度;

第二种是屏幕翻转方向时,系统先销毁当前的Activity,然后再重建一个新的,调用此方法时,我们可以保存一些临时数据;

第三种情况系统调用此方法是为了保存当前窗口各个View组件的状态。onSaveInstanceState的调用顺序是在onPause之后。

3、onRestoreInstanceState:

(1)在Activity被覆盖或退居后台之后,系统资源不足将其杀死,然后用户又回到了此Activity,此方法会被调用;

(2)在用户改变屏幕方向时,重建的过程中,此方法会被调用。我们可以重写此方法,以便可以恢复一些临时数据。

onRestoreInstanceState的调用顺序是在onStart之后。

我们来模拟下onSaveInstanceState和onRestoreInstanceState的使用:

首先我先在定义一个成员变量,在onCreate方法里赋值:

    private String mInfo;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i("Rabbit", "onCreate------");
        mInfo="I Am Rabbit";
    }

在onSaveInstanceState和onRestoreInstanceState方法里分别进行数据的保存和取出:

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("info",mInfo);
        Log.i("Rabbit", "onSaveInstanceState------info:"+mInfo);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        String info=savedInstanceState.getString("info");
        Log.i("Rabbit", "onRestoreInstanceState------info:"+info);
    }

然后翻转屏幕看下日志打印效果:

从日志打印结果,我们可以很清楚的看到程序执行流程:

1、我们的Activity被销毁重建了,onSaveInstanceState在onPause之后被执行了,并保持了我们的变量值。

2、在Activity被重建获取焦点前(onResume前)执行了onRestoreInstanceState方法,并取出了我们先前保存的变量值。

知道这个流程,我们就可以用onSaveInstanceState和onRestoreInstanceState来保存一些临时变量,比如按钮状态,标志位等等等。

关于屏幕方向改变Activity会重建的应对策略:

1、指定为竖屏:在AndroidManifest.xml中对指定的Activity设置:

android:screenOrientation="portrait"

或者在onCreate方法中指定:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);  //竖屏  

2、指定为横屏:在AndroidManifest.xml中对指定的Activity设置:

android:screenOrientation="landscape"

或者在onCreate方法中指定:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); //横屏  

3、锁定屏幕虽然可以实现我们想要的效果,但并不是很好的一种做法,为了避免这样销毁重建的过程,我们可以在AndroidMainfest.xml中对对应的<activity>配置:

android:configChanges="orientation"

如果是Android4.0,则是:

android:configChanges="orientation|keyboardHidden|screenSize"

然后我们在Activity里重写onConfigurationChanged方法:

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.i("Rabbit", "onConfigurationChanged------");
    }

看下执行效果:

这样Activity在翻转屏幕的时候就不会被销毁重建了,只是调用了onConfigurationChanged方法。

时间: 2024-10-03 21:54:14

安卓开发笔记——关于Activity生命周期的一些事情的相关文章

安卓开发笔记——深入Activity

在上一篇文章<安卓开发笔记——重识Activity >中,我们了解了Activity生命周期的执行顺序和一些基本的数据保存操作,但如果只知道这些是对于我们的开发需求来说是远远不够的,今天我们继续探索Activity,来了解下关于Activity任务栈和Activity四种启动模式的区别. 为什么需要了解关于Activity的任务栈,其实最直接的体现就是提高用户交互友好性. 举个例子,当我们去浏览一个新闻客户端的时候,我们进入了新闻详情页,在这个页面有相隔两条的新闻标题,当我们去点击这个标题的时

android学习笔记28——Activity生命周期

Activity生命周期 Activity的活动状态由android已Activity栈的形式管理,当前活动的Activity位于栈顶.随着不同应用的运行,每个Activity都有可能从活动状态转入非活动状态,从非活动状态转入活动状态. Activity归纳大致会经过4个状态: 1.活动状态:当前Activity位于前台,用户可见,可获得焦点: 2.暂停状态:其他Activity位于前台,该Activity可见,不可获得焦点: 3.停止状态:该Activity不可见,失去焦点: 4.销毁状态:该

Android学习笔记:Activity生命周期详解

进行android的开发,必须深入了解Activity的生命周期.而对这个讲述最权威.最好的莫过于google的开发文档了. 本文的讲述主要是对 http://developer.android.com/training/basics/activity-lifecycle/index.html 的翻译,加上了个人的一些细节和补充. 一.总体介绍

android学习笔记(5)Activity生命周期学习

对应若水老师视频教程第8课 一定要看这个视频 每个activity都有它的生命周期,开启它,关闭它,跳转到其它activity等等,都会自动调用以下某种方法.对这些个方法覆写后观察学习. protected void onCreate(Bundle savedInstanceState); protected void onStart(); protected void onRestart(); protected void onResume(); protected void onPause(

传播智客学习笔记--L27 Activity生命周期

将Activity设置为对话框样式 生命周期示意图

《第一行代码:Android》学习笔记:Activity生命周期

<第一行代码:Android> 郭霖(著) Activity所在的栈为后进先出(Last In First Out)结构. Activity状态 运行状态(S1): 该Activity处于与User交互的状态,即是位于栈顶的Activity. 系统一般不考虑回收该处内存. 暂停状态(S2): Activity不再处于栈顶(Another activity comes in front of the activity),但仍然是可见的. 系统只有在内存极低时才考虑回收内存. 停止状态(S3):

Android 开发笔记___Activity的生命周期

一个activity就是一个页面,入口函数是oncreate(). onCreate:创建页面,把页面上各个元素加载到内存 onStart:开始页面,把页面显示在屏幕 onResume:恢复页面,让页面活动起来 onPause:暂停页面 onStop:停止页面 onDestroy:销毁页面 onRestart:重启页面 1 package com.example.alimjan.hello_world; 2 3 import android.content.Context; 4 import a

Android学习笔记(三三):Activity生命周期

Android很大的应用场景是手机,有一些应用具有特别的优先级别,例如电话,同时设备的内存是有限的.因在某些情况下系统将踢走activity,以便是否内存.因此在开发过程中,我们需要管理好activity的生命周期.右图是Android的docs中提供的activity的时间触发图. 四大状态 一般来讲,某一时刻,Activity处在下面四个状态之一: Active:已由用户启动,正在前台运行. Paused:已由用户启动,正在运行且可视,但是由于提示或者其他覆盖部分的屏幕.这是用户可以看到ac

Android开发--Activity生命周期回顾理解

Activity和Servlet一样,都用了回调机制.我们通过类比servlet来学习Activity.当一个servlet开发出来之后,该servlet运行于Web服务器中.服务器何时创建servlet的实例,何时调用servlet的方法向用户生成响应,程序员无法控制,这种回调由服务器自行决定.Activity也一样,被开发出来,开发者只要在AndroidManifest.xml文件配置该Activity即可.至于该Activity何时被实例化,它的方法何时被调用,对开发者来说完全是透明的.