• 有关Android Activity生命周期详解
    时间:2012-04-07   作者:dream80   出处:cnblogs.com

    生命周期,对于初学者来讲可能比较深奥。在各种面试中,常常会被问到xxx的生命周期是什么样子的,比如:Servlet的生命周期,Spring Bean的生命周期。今天就详细的讲解一下Android Activity 的生命周期。文章主要涉及到如下几个部分:生命周期图,测试代码,结果分析。

    1. 生命周期图

            官方有提供 Activity的 生命周期图,如下:



    从上图可以清晰的看到 Activity 生命周期中涉及到的主要 方法包括: onCreate(),onStart(),onResume(),onPause(),onStop,onDestory()。 除了这一个还有 onRestart()。
    前面的六个方法是相互对应的,比如onCreate 和 onDestory。
    其中彩色标示的是几个常态:启动,运行,关闭,杀掉进程。
     
    2.测试代码

            光看看,永远都是抽象的。对于程序员,可用的代码才是具体的。为了验证上面的周期图和具体是如何转换的,我写了一个测试程序。程序只有两个Activity,他们之间相互切换。在这个过程中涉及到LogCat (android.util.log),测试结果主要是在这里查看的,我用的编程工具是 eclipse。具体代码如下:


     LifecycleActivity1.java  

    package org.wpg.android.lifecycle;
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.Menu;
    import android.view.MotionEvent;

    public class LifecycleActivity1 extends Activity {
        /** Called when the activity is first created. */
        private static final String TAG = "LifecycleActivity1";
        @Override
        public void onCreate(Bundle savedInstanceState) {
            //打开的时候调用
     Log.i(TAG, "Activity1 onCreate called!");
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main); 
        } 
        @Override
        protected void onStart() {
            //打开的时候调用
     Log.i(TAG, "Activity1 onStart called!");
            super.onStart();
        } 
     
        @Override
        protected void onRestart() {
            Log.i(TAG, "Activity1 onRestart called!"); 
            super.onRestart();
        } 
        @Override
        protected void onResume() {
            //打开的时候调用
     Log.i(TAG, "Activity1 onResume called!"); //在关闭屏幕开启的时候会调用
     super.onResume();
        } 
        @Override
        protected void onPause() {
            Log.i(TAG, "Activity1 onPause called!");  //当关闭屏幕是调用
     super.onPause();
        } 
        @Override
        protected void onStop() {
            Log.i(TAG, "Activity1 onStop called!"); 
            super.onStop();
        } 
        @Override
        protected void onDestroy() {
            Log.i(TAG, "Activity1 onDestroy called!"); 
            super.onDestroy();
        } 
        /**当点击屏幕时,进入Activity2*/
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
             Intent intent = new Intent(this, LifecycleActivity2.class);
             startActivity(intent); 
            return super.onCreateOptionsMenu(menu);
        }
    }
     
    LifecycleActivity2.java
     
    package org.wpg.android.lifecycle;
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.Menu;
    import android.view.MotionEvent;
    public class LifecycleActivity2 extends Activity {
        /** Called when the activity is first created. */
        private static final String TAG = "LifecycleActivity2";
        @Override
        public void onCreate(Bundle savedInstanceState) {
            Log.i(TAG, "Activity2 onCreate called!"); 
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main); 
        } 
        @Override
        protected void onStart() {
            Log.i(TAG, "Activity2 onStart called!"); 
            super.onStart();
        } 
        @Override
        protected void onRestart() {
            Log.i(TAG, "Activity2 onRestart called!"); 
            super.onRestart();
        } 
        @Override
        protected void onResume() {
            Log.i(TAG, "Activity2 onResume called!"); 
            super.onResume();
        } 
        @Override
        protected void onPause() {
            Log.i(TAG, "Activity2 onPause called!"); 
            super.onPause();
        } 
        @Override
        protected void onStop() {
            Log.i(TAG, "Activity2 onStop called!"); 
            super.onStop();
        } 
        @Override
        protected void onDestroy() {
            Log.i(TAG, "Activity2 onDestroy called!"); 
            super.onDestroy();
        } 
        /**当点击屏幕时,进入Activity2*/
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            Intent intent = new Intent(this, LifecycleActivity1.class);
            startActivity(intent); 
            return super.onCreateOptionsMenu(menu);
        }
    }

    AndroidManifest.xml
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="org.wpg.android.lifecycle"
        android:versionCode="1"
        android:versionName="1.0" >
        <uses-sdk android:minSdkVersion="10" />
        <application
            android:icon="@drawable/ic_launcher"
            android:label="@string/app1" >
            <activity
                android:name=".LifecycleActivity1"
                android:label="@string/app1" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
             <activity
                android:name=".LifecycleActivity2"
                android:label="@string/app2" >
            </activity>
        </application>
    </manifest>

    代码简单讲解:


    代码非常简单,就是写了两个 activity ,覆盖了父类的几个和生命周期有关的方法,和一个主配置文件。
    public boolean onCreateOptionsMenu(Menu menu) {
            Intent intent = new Intent(this, LifecycleActivity1.class);
            startActivity(intent); 
            return super.onCreateOptionsMenu(menu);
        }
     这个代码主要是实现,在点击手机的菜单键的时候实现 activity的切换。


    3.分析


        具体的测试过程以及结果如下:
       a.打开应用:onCreate-》onStart-》 onResume ,在开始的时候这三个方法都会调用。
       b.从第一个activity切换到第二个:先会 onPause第一个,然后onCreate-》onStart-》 onResume,最后在onStop
       c.从第二个切换到第一个:内容与上一步相同
       d.按手机的回退(back)键:先onPause 第一个,然后 onRestart-》 onStart-》 onResume ,然后onStop-》 onDestroy  第二个
       e.按 home 键:会调用 onPause 和 onStop
       f.再安home 键 重新选择程序进入:onRestart-》onStart-》onResume
       g.最终退出:onPause-》 onStop》onDestroy 
       ** e~f 不论当前状态时第一个activity 或者第二个 运行的结果都是一样的。
     
       打开应用是显示的日志如下:

    04-07 12:09:12.510: I/LifecycleActivity1(12228): Activity1 onCreate called!
    04-07 12:09:12.540: I/LifecycleActivity1(12228): Activity1 onStart called!
    04-07 12:09:12.540: I/LifecycleActivity1(12228): Activity1 onResume called!
         从第一个activity切换到第二个:

    04-07 12:12:48.800: I/LifecycleActivity1(12228): Activity1 onPause called!
    04-07 12:12:48.820: I/LifecycleActivity2(12228): Activity2 onCreate called!
    04-07 12:12:48.830: I/LifecycleActivity2(12228): Activity2 onStart called!
    04-07 12:12:48.830: I/LifecycleActivity2(12228): Activity2 onResume called!
    04-07 12:12:49.060: I/LifecycleActivity1(12228): Activity1 onStop called!
      从第二个切换到第一个:

    04-07 12:14:03.020: I/LifecycleActivity2(12228): Activity2 onPause called!
    04-07 12:14:03.040: I/LifecycleActivity1(12228): Activity1 onCreate called!
    04-07 12:14:03.050: I/LifecycleActivity1(12228): Activity1 onStart called!
    04-07 12:14:03.050: I/LifecycleActivity1(12228): Activity1 onResume called!
    04-07 12:14:03.290: I/LifecycleActivity2(12228): Activity2 onStop called!
      按手机的回退(back)键:

    04-07 12:14:56.740: I/LifecycleActivity1(12228): Activity1 onPause called!
    04-07 12:14:56.780: I/LifecycleActivity2(12228): Activity2 onRestart called!
    04-07 12:14:56.780: I/LifecycleActivity2(12228): Activity2 onStart called!
    04-07 12:14:56.790: I/LifecycleActivity2(12228): Activity2 onResume called!
    04-07 12:14:57.030: I/LifecycleActivity1(12228): Activity1 onStop called!
    04-07 12:14:57.030: I/LifecycleActivity1(12228): Activity1 onDestroy called!
      按 home 键:

    04-07 12:16:12.730: I/LifecycleActivity2(12228): Activity2 onPause called!
    04-07 12:16:12.950: I/LifecycleActivity2(12228): Activity2 onStop called!
      再安home 键 重新选择程序进入:

    04-07 12:17:25.870: I/LifecycleActivity2(12228): Activity2 onRestart called!
    04-07 12:17:25.870: I/LifecycleActivity2(12228): Activity2 onStart called!
    04-07 12:17:25.870: I/LifecycleActivity2(12228): Activity2 onResume called!
      最终退出:

    04-07 12:20:45.170: I/LifecycleActivity1(12228): Activity1 onPause called!
    04-07 12:20:45.380: I/LifecycleActivity1(12228): Activity1 onStop called!
    04-07 12:20:45.380: I/LifecycleActivity1(12228): Activity1 onDestroy called!
      关闭显示器和打开显示器也会调用相应的方法:
          onPause 和 OnResume
     
    结论:


         明白了生命周期中的各个方法的执行时机,其实就相当于明白了它的生命周期。在实际开发中可以根据自己的需要,在对应 的方法里面添加相应的内容,关于这方面的技巧就由大家自己摸索,不在这里多说了。

    网友留言/评论

    我要留言/评论

    相关文章

    使用Java进行冒泡排序(冒泡排序示例):冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
    Java面试题中关于HashMap的小小总结:面试过程中往往会被问关于HashMap的问题,比如:说说Hashpmap的原理,HashMap怎样保证key的唯一性。下面小编给大家简单介绍一下关于HashMap的小小总结。
    JAVA正则表达式:Pattern类与Matcher类详解:java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表现模式。 Matcher 一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查。 首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式,然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作。
    线上解决Resin服务响应过慢的几个方法:最近Web服务访问量过大,由于服务器配置比较差,数量也较少,导致服务响应过慢。为了优化服务和提高响应,下面总结出几条查询Resin问题的方法。
    Java 中 Listener 模式示例:Listener模式在Java中很常见,并且很有用,下面例举一下Java的Listener模式,希望对大家有所帮助。
    Java Annotation手册(详解):在上篇文章《Java Annotation入门》中概要性的介绍了Annotation的定义、使用,范围涵盖较广,但是深度不够。所以作者在《Java Annotation入门》后,继续整理了Annotation的概念和知识点,与喜欢research的朋友们共享。
    利用 Java 6 javax.script 包直接处理 JSON:以往我们在Java中处理 JSON 数据时,经常会引用到各种 json 的第三方 jar 包。有时很简单的功能,而引用比较臃肿的包,是比较难以容忍的。很高兴我们可以使用Java 6 提供的 javax.script 包来处理。 Java 有了支持其他脚本语言的特性,例如 JavaScript。而 JavaScript 对 JSON 的支持是天生具备的。让我们来看一些实例。
    (DOM解析xml )Android中的XML解析与生成:DOM解析XML文件时,会将XML文件的所有内容以对象树方式存放在内存中,然后允许您使用DOM API遍历XML树、检索所需的数据。使用DOM操作XML的代码看起来比较直观,并且,在某些方面比基于SAX的实现更加简单。但是,因为DOM需要将XML文件的所有内容以对象树方式存放在内存中,所以内存的消耗比较大,特别对于运行Android的移动设备来说,因为设备的资源比较宝贵,所以建议还是采用SAX来解析XML文件,当然,如果XML文件的内容比较小采用DOM是可行的。
    JRockit读书笔记I — Java代码的高效执行:《Oracle JRockit: The Definitive Guide》一书是由Oracle JRockit的两位资深开发人员写的,其中的Marcus Hirt更是JRockit Mission Control的leader,这本书详细的对Oracle JRockit进行了介绍,最突出的特点非常系统化的介绍了一个JVM通常是如何实现的,而JRockit这样一个极为优秀的JVM又是做了哪些优化,为什么做这些优化,这本书对于对JVM感兴趣的同学而言应该是必读的一本书,其实即使对于JVM兴趣不强的同学,里面的优化思路的介绍也是值得学习,本系列的blog主要是总结看这本书得到的一些收获,由于书中知识量巨大,因此得分成多篇blog来总结了。
    JSTL教程大全 - core篇和sql篇:最近又开始搞WEB部分开发,使用了JTSL,虽然知道这玩意很简单,但是真正做起来还是需要查询相关资料,搜了半天都没找到合适的,最后终于找到了一份较全的文档,给大家分享一下。JSTL标签、<c:choose>、<c:forEach>、<c:forTokens>、<c:if>、<c:import>、<c:otherwise>、<c:out>、<c:param>、<c:redirect>、<c:remove>、<c:url>、<c:when>、<c:set>、<c:catch>