Android四大組件之——Activity的生命週期(圖文詳解)

      轉載請在文章開頭處註明本博客網址:http://www.cnblogs.com/JohnTsai
html

      聯繫方式:JohnTsai.Work@gmail.comandroid

      [Android四大組件學習系列Activity篇]app

      1.Android四大組件之——Activity(一)定義、狀態和後退棧(圖文詳解)ide

      2.Android四大組件之——Activity的生命週期(圖文詳解)oop

     上一篇文章講了Activity的定義、狀態和後退棧,如今講講Activity的重點和難點——Activity的生命週期。佈局

 

  • Activity生命週期的回調方法:

     

//建立Activity
public 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的生命週期和上面說的三種生命期:post

       

      

       下面經過一個Demo來學習如下Activity的生命週期:學習

      Demo很簡單,就只有兩個Activity,MainActivity和SecondActivity和一個按鈕。點擊按鈕,由MainActivity跳轉到SecondActivity。this

      MainActivity:url

 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     @Override
16     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             @Override
24             public void onClick(View v) {
25                    Intent intent = new Intent(MainActivity.this,SecondActivity.class);
26                    startActivity(intent);
27             }
28         });
29         
30     }
31     @Override
32     protected void onPause() {
33         Log.d(TAG, "MainActivity onPause  ");
34         super.onPause();
35     }
36     @Override
37     protected void onResume() {
38         Log.d(TAG, "MainActivity onResume  ");
39         super.onResume();
40     }
41     @Override
42     protected void onStart() {
43         super.onStart();
44         Log.d(TAG,"MainActivity onStart  ");
45     }
46     @Override
47     protected void onStop() {
48         super.onStop();
49         Log.d(TAG, "MainActivity onStop  ");
50     }
51     @Override
52     protected void onDestroy() {
53         super.onDestroy();
54         Log.d(TAG, "MainActivity onDestroy  ");
55     }
56     @Override
57     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        @Override
10     protected void onCreate(Bundle savedInstanceState) {
11            setContentView(R.layout.second_layout);
12            super.onCreate(savedInstanceState);
13            Log.d(TAG,"SecondActivity onCreate");
14            
15     }
16        @Override
17     protected void onStart() {
18         super.onStart();
19         Log.d(TAG, "SecondActivity onStart");
20     }
21        @Override
22     protected void onResume() {
23         super.onResume();
24         Log.d(TAG, "SecondActivity onResume");
25   
26        }
27      @Override
28     protected void onPause() {
29         super.onPause();
30         Log.d(TAG, "SecondActivity onPause");
31     }
32      @Override
33     protected void onStop() {
34         super.onStop();
35         Log.d(TAG, "SecondActivity onStop");
36     }
37      @Override
38     protected void onDestroy() {
39         super.onDestroy();
40         Log.d(TAG, "SecondActivity onDestroy");
41     }
42      @Override
43     protected void onRestart() {
44         super.onRestart();
45         Log.d(TAG, "SecondActivity onRestart");
46     }
47 }
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     <application
12         android:allowBackup="true"
13         android:icon="@drawable/ic_launcher"
14         android:label="@string/app_name"
15         android:theme="@style/AppTheme" >
16         <activity
17             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         <activity
26             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()

 

    7.Activity處於運行狀態,手機此時鎖屏。

    

    能夠看出,手機鎖屏,此時因爲Activity不可見,會進入中止狀態。

    依次調用回調方法:onPause()->onStop()

 

    8.當應用正在運行時,手機鎖屏,而後解鎖回到應用界面。

    

    能夠看出應用從中止狀態恢復到運行狀態。

    依次調用回調方法:onRestart()->onStart()->onResume()

 

          本人郵箱:JohnTsai.Work@gmail.com,歡迎交流討論。      

          歡迎轉載,轉載請在文章開頭處註明本博客網址:http://www.cnblogs.com/JohnTsai

          若是喜歡,請點推薦!謝謝~

相關文章
相關標籤/搜索