zoukankan      html  css  js  c++  java
  • Activity 生命周期详解

             生命周期,对于初学者来讲可能比较深奥。在各种面试中,常常会被问到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

    结论:

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

  • 相关阅读:
    uoj35 后缀排序
    bzoj1026windy数
    poj2761 feed the dog
    codevs2875RY哥查字典
    bzoj1683[Usaco2005 Nov]City skyline 城市地平线
    codevs2464超级麻将
    初赛乱记
    让NOI Linux变得可用
    [HAOI2015] 按位或
    一句话CF
  • 原文地址:https://www.cnblogs.com/wangpg/p/2435861.html
Copyright © 2011-2022 走看看