1. 程式人生 > >Android四大元件之Activity,Activity生命週期

Android四大元件之Activity,Activity生命週期

      Android四大基本元件分別是Activity,Service服務,Content Provider內容提供者,BroadcastReceiver廣播接收器。

      Activity作為四大元件之一,其生命週期也就是它所在的程序的生命週期。Activity生命週期需要深入理解,後續的開發和除錯都會使用到。

  一、  應用程式中,一個Activity通常就是一個單獨的螢幕,它上面可以顯示一些控制元件也可以監聽並處理使用者的事件做出響應。

          下圖是一張經典的Activity生命週期流程圖

                                  

     1、onCreate()

當第一次呼叫一個Activity就會執行

     2、onStart()表示當前的Activity處於可見狀態

     3、onResume()表示當Activity可以得到使用者焦點

     4、onPause()表示當前Activity被遮擋,即失去使用者焦點

     5、onStop()表示當前Activity不可見

     6、 onDestory()表示當前的activity被銷燬

     7、當Activity沒有被銷燬的時候重新呼叫這個Activity就會呼叫onRestart方法

     根據官方給出的說明,可以清楚的知道,在什麼狀態下,應該處理那些事件。即那些事件放在哪個狀態下處理是合適的。

二、為了加深對Activity生命週期的認知,需要看下在多個Activity的時候,對應的生命週期的資訊。

       例如,我們在第一個Activity裡面,通過點選button按鈕來啟動第二個Activity。

package com.android.activity.demo;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class FirstActivity extends Activity implements View.OnClickListener {

    private static final String TAG = "FirstActivity";

    private Button mButton1 = null;
    private Button mButton2 = null;
    private Button mButton3 = null;
    private Button mButton4 = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        XLog.i(TAG, "onCreate()");
        setContentView(R.layout.activity_first);
        findView();
        setListener();
    }

    private void findView() {
        mButton1 = (Button) findViewById(R.id.btn_start_second_activity01);
        mButton2 = (Button) findViewById(R.id.btn_start_second_activity02);
        mButton3 = (Button) findViewById(R.id.btn_start_second_activity03);
        mButton4 = (Button) findViewById(R.id.btn_start_second_activity04);
    }

    private void setListener() {
        mButton1.setOnClickListener(this);
        mButton2.setOnClickListener(this);
        mButton3.setOnClickListener(this);
        mButton4.setOnClickListener(this);
    }


    @Override
    protected void onRestart() {
        super.onRestart();
        XLog.i(TAG, "onRestart()");
    }

    @Override
    protected void onStart() {
        super.onStart();
        XLog.i(TAG, "onStart()");
    }

    @Override
    protected void onResume() {
        super.onResume();
        XLog.i(TAG, "onResume()");
    }

    @Override
    protected void onPause() {
        super.onPause();
        XLog.i(TAG, "onPause()");
    }

    @Override
    protected void onStop() {
        super.onStop();
        XLog.i(TAG, "onStop()");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        XLog.i(TAG, "onDestroy()");
    }

    @Override
    public void onClick(View view) {
        int id = view.getId();
        XLog.i(TAG, "onClick() id = 0x" + Integer.toHexString(id));
        switch (id) {
        case R.id.btn_start_second_activity01: {
            startSecondActivityByAction();
            break;
        }

        case R.id.btn_start_second_activity02: {
            startSecondActivityByClass();
            break;
        }

        case R.id.btn_start_second_activity03: {
            startSecondActivityByPackage();
            break;
        }

        case R.id.btn_start_second_activity04: {
            startSecondActivityByComponent();
            break;
        }

        default:
            break;
        }
    }

    private void startSecondActivityByAction() {
        XLog.i(TAG, "startSecondActivityByAction()");
        Intent intent = new Intent();
        intent.setAction("android.intent.action.SECONDACTIVITY_START");
        intent.addCategory(Intent.CATEGORY_DEFAULT);
        try {
            startActivity(intent);
        } catch (Exception e) {
            XLog.i(TAG, "start activity error!");
        }
    }

    private void startSecondActivityByClass() {
        XLog.i(TAG, "startSecondActivityByClass()");
        Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
        try {
            startActivity(intent);
        } catch (Exception e) {
            XLog.i(TAG, "start activity error!");
        }
    }

    private void startSecondActivityByPackage() {
        XLog.i(TAG, "startSecondActivityByPackage()");
        Intent intent = new Intent();
        intent.setClassName(getPackageName(), getPackageName() + ".SecondActivity");
        try {
            startActivity(intent);
        } catch (Exception e) {
            XLog.i(TAG, "start activity error!");
        }
    }

    private void startSecondActivityByComponent() {
        XLog.i(TAG, "startSecondActivityByComponent()");
        Intent intent = new Intent();
        intent.setComponent(new ComponentName(getPackageName(), getPackageName() + ".SecondActivity"));
        try {
            startActivity(intent);
        } catch (Exception e) {
            XLog.i(TAG, "start activity error!");
        }
    }
}

  第二個Activity的部分

package com.android.activity.demo;

import android.app.Activity;
import android.os.Bundle;

public class SecondActivity extends Activity {
    private static final String TAG = "SecondActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        XLog.i(TAG, "onCreate()");
        setContentView(R.layout.activity_second);
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        XLog.i(TAG, "onRestart()");
    }

    @Override
    protected void onStart() {
        super.onStart();
        XLog.i(TAG, "onStart()");
    }

    @Override
    protected void onResume() {
        super.onResume();
        XLog.i(TAG, "onResume()");
    }

    @Override
    protected void onPause() {
        super.onPause();
        XLog.i(TAG, "onPause()");
    }

    @Override
    protected void onStop() {
        super.onStop();
        XLog.i(TAG, "onStop()");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        XLog.i(TAG, "onDestroy()");
    }
}

  對應的AndroidManifest.xml的配置
        <activity
            android:name="com.android.activity.demo.SecondActivity"
            android:label="@string/second_activity_name" >
            <intent-filter>
                <action android:name="android.intent.action.SECONDACTIVITY_START" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

1、當我們啟動一個Activity的時候,輸出的log如下

03-17 09:02:21.766: I/ActivityDemo(12870): FirstActivity onCreate()
03-17 09:02:21.776: I/ActivityDemo(12870): FirstActivity onStart()
03-17 09:02:21.776: I/ActivityDemo(12870): FirstActivity onResume()
可以看到,分別先後呼叫了 onCreate()  onStart() onResume()

2、當我們按返回鍵退出第一個應用的時候,輸出log如下

03-17 09:04:01.624: I/ActivityDemo(12870): FirstActivity onPause()
03-17 09:04:02.115: I/ActivityDemo(12870): FirstActivity onStop()
03-17 09:04:02.115: I/ActivityDemo(12870): FirstActivity onDestroy()

 退出應用的時候,分別先後呼叫了onPause() OnStop() onDestroy()  

3、第一個應用啟動到第二個應用的時候,輸出log如下:
03-17 09:05:36.637: I/ActivityDemo(12870): FirstActivity onClick() id = 0x7f060002
03-17 09:05:36.638: I/ActivityDemo(12870): FirstActivity startSecondActivityByAction()
03-17 09:05:36.765: I/ActivityDemo(12870): FirstActivity onPause()
03-17 09:05:36.777: I/ActivityDemo(12870): SecondActivity onCreate()
03-17 09:05:36.780: I/ActivityDemo(12870): SecondActivity onStart()
03-17 09:05:36.780: I/ActivityDemo(12870): SecondActivity onResume()
03-17 09:05:37.222: I/ActivityDemo(12870): FirstActivity onStop()
啟動到第二個Activity的時候,先是第一個應用的onPause(),失去焦點,被壓到後臺。

第二個應用的onCreate(建立) onStart(可見) onResume(可以獲取焦點)。

當第二個應用onResume()可以獲取焦點的時候,在把第一個應用onStop()不可見

4、從第二個應用返回第一個應用,輸出log如下:

03-17 09:07:03.518: I/ActivityDemo(12870): SecondActivity onPause()
03-17 09:07:03.523: I/ActivityDemo(12870): FirstActivity onRestart()
03-17 09:07:03.523: I/ActivityDemo(12870): FirstActivity onStart()
03-17 09:07:03.523: I/ActivityDemo(12870): FirstActivity onResume()
03-17 09:07:03.905: I/ActivityDemo(12870): SecondActivity onStop()
03-17 09:07:03.905: I/ActivityDemo(12870): SecondActivity onDestroy()

先是第二個應用的onPause,失去焦點。

第一個應用被重新喚醒 onRestart, onStart可見,onResume可以獲取焦點

然後才是第二個應用的onStop不可見,被銷燬ondestory