首页 > 代码库 > Android四大组件之——Activity的生命周期(图文详解)

Android四大组件之——Activity的生命周期(图文详解)

      上一篇文章讲了Activity的定义、状态和后退栈,现在讲讲Activity的重点和难点——Activity的生命周期。

 

  • Activity生命周期的回调方法:

     

//创建Activitypublic void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);    }//Activity快要变成可见的    @Override    protected void onStart() {        super.onStart();    }//Activity变成可见的,处于运行状态    @Override    protected void onResume() {        super.onResume();    }//其他Activity获得用户焦点,(Activity快要暂停了)    @Override    protected void onPause() {        super.onPause();    }//Activity不再可见,处于停止状态    @Override    protected void onStop() {        super.onStop();    }//Activity快要被销毁了    @Override    protected void onDestroy() {        super.onDestroy();
}

 

       这些方法定义了Activity完整的生命周期,实现这些方法,我们能监控Activity生命周期中的三个嵌套循环(monitor three nested loops in the activity lifecycle)
 
        1.Activity的entire lifetime(全部的生命期)发生在
                              调用onCreate()和调用onDestory()之间。
        在onCreate()方法中执行全局状态的建立(例如定义布局),在onDestroy()方法中释放所有保存的资源。
       
 
       2.Activity的visible lifetime(可见的生命期)发生在
                              调用onStart()onStop()之间。
         在这个期间,用户能在屏幕上看见Activity,和它进行交互。
        系统在Activity的完整寿命中可能多次调用onStart()和onStop(),正如Activity交替地对用户可见或隐藏。
 
      3Activity的foreground lifetime (前台的生命期)发生在
                               调用onResume()onPause()之间。
       在这期间,Activity在屏幕上所有其他Activity的前面,有用户输入焦点。
       一个Activity能频繁的在前台进入和出去之间转变。
 

       下面这张图很好的讲解了Activity的生命周期和上面说的三种生命期:

       

      

       下面通过一个Demo来学习以下Activity的生命周期:

      Demo很简单,就只有两个Activity,MainActivity和SecondActivity和一个按钮。点击按钮,由MainActivity跳转到SecondActivity。

      MainActivity:

 1 package com.example.activitytest; 2  3 import android.app.Activity; 4 import android.content.Intent; 5 import android.os.Bundle; 6 import android.util.Log; 7 import android.view.View; 8 import android.view.View.OnClickListener; 9 import android.widget.Button;10 11 public class MainActivity extends Activity {12   13     private Button btn;14     private static final String TAG = "ActivityTest";15     @Override16     protected void onCreate(Bundle savedInstanceState) {17         super.onCreate(savedInstanceState);18         Log.d(TAG, "MainActivity onCreate");19         setContentView(R.layout.activity_main);20         btn = (Button)findViewById(R.id.btn);21         btn.setOnClickListener(new OnClickListener() {22             23             @Override24             public void onClick(View v) {25                    Intent intent = new Intent(MainActivity.this,SecondActivity.class);26                    startActivity(intent);27             }28         });29         30     }31     @Override32     protected void onPause() {33         Log.d(TAG, "MainActivity onPause  ");34         super.onPause();35     }36     @Override37     protected void onResume() {38         Log.d(TAG, "MainActivity onResume  ");39         super.onResume();40     }41     @Override42     protected void onStart() {43         super.onStart();44         Log.d(TAG,"MainActivity onStart  ");45     }46     @Override47     protected void onStop() {48         super.onStop();49         Log.d(TAG, "MainActivity onStop  ");50     }51     @Override52     protected void onDestroy() {53         super.onDestroy();54         Log.d(TAG, "MainActivity onDestroy  ");55     }56     @Override57     protected void onRestart() {58         super.onRestart();59         Log.d(TAG, "MainActivity onRestart  ");60     }61 }

   SecondActivity:

 

 1 package com.example.activitytest; 2  3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.util.Log; 6  7 public class SecondActivity extends Activity { 8     private static final String TAG = "ActivityTest"; 9        @Override10     protected void onCreate(Bundle savedInstanceState) {11            setContentView(R.layout.second_layout);12            super.onCreate(savedInstanceState);13            Log.d(TAG,"onCreate");14     }15        @Override16     protected void onStart() {17         super.onStart();18         Log.d(TAG, "onStart");19     }20        @Override21     protected void onResume() {22         super.onResume();23         Log.d(TAG, "onResume");24     }25      @Override26     protected void onPause() {27         super.onPause();28         Log.d(TAG, "onPause");29     }30      @Override31     protected void onStop() {32         super.onStop();33         Log.d(TAG, "onStop");34     }35      @Override36     protected void onDestroy() {37         super.onDestroy();38         Log.d(TAG, "onDestroy");39     }40      @Override41     protected void onRestart() {42         super.onRestart();43         Log.d(TAG, "onRestart");44     }45 }
SecondActivity

 使用Activity需要在Manifest.xml文件中注册:

 

 1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 3     package="com.example.activitytest" 4     android:versionCode="1" 5     android:versionName="1.0" > 6  7     <uses-sdk 8         android:minSdkVersion="8" 9         android:targetSdkVersion="21" />10 11     <application12         android:allowBackup="true"13         android:icon="@drawable/ic_launcher"14         android:label="@string/app_name"15         android:theme="@style/AppTheme" >16         <activity17             android:name=".MainActivity"18             android:label="@string/app_name" >19             <intent-filter>20                 <action android:name="android.intent.action.MAIN" />21                  <category android:name="android.intent.category.LAUNCHER" />22                 23             </intent-filter>24         </activity>25         <activity26             android:name=".SecondActivity"27             android:label="SecondActivity"28             android:theme="@android:style/Theme.Dialog"29             >30         </activity>31     </application>
Manifest.xml

    1. 运行应用,MainActivity运行。

     可以看出一个Activity运行调用的回调方法是:onCreate()->onStart()->onResume()

  

    2. 点击跳转按钮,由MainActivity跳转到SecondActivity:

      1>SecondActivity是Dialog。

    

     由于SecondActivity是Dialog,所以MainActivity依然可见,所以只调用了它的onPause()方法。

     2>若将SecondActivity改为不是Dialog(只需在Manifest.xml文件中删掉 android:theme="@android:style/Theme.Dialog"这一行即可)

     再点击跳转按钮:

   

      对于MainActivity,由于不可见,状态由运行变为停止。

      依次调用了它的回调方法:onPause()->onStop()

      3.Activity处于运行状态时,点击返回按钮。

     

        点击返回按钮,Activity由运行状态变为死亡状态,依次调用它的回调方法:onPause()->onStop()->onDestroy()

      4.Activity处于运行状态,点击主页按钮,返回桌面。

    

       Activity由运行状态变为停止状态,依次调用它的回调方法:onPause()->onStop()

       5.Activity处于停止状态,即由桌面返回到Activity。

       

        停止->运行,依次调用回调方法:onRestart()->onStart()->onResume()

      6.Activity处于运行状态,旋转屏幕:

      

        可以看出,旋转屏幕是一个销毁Activity然后重新创建Activity的过程。

         运行->暂停->停止->死亡->运行

        依次调用回调方法:onPause()->onStop->onDestroy()->onCreate()->onStart()->onResume()

 

          本人邮箱:JohnTsai.Work@gmail.com,欢迎交流讨论。      

          欢迎转载,转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai

          如果喜欢,请点推荐!

Android四大组件之——Activity的生命周期(图文详解)