天天看點

Android基礎#36:Android傳回鍵與Home鍵差別,以及Application的registerActivityLifecycleCallbacks

1. 内容簡介:

在Android系統中,activity是由framework層建立的,而且,由framework管理這activity的生命周期。了解app中各個Actiivty的生命周期,對于開發Android應用程式至關重要。

那麼,當activty進行切換的時候,如何知道相關activity的狀态(生命周期相關函數的調用)呢?可以通過App的registerActivityLifecycleCallbacks來實作。

當按下Android傳回鍵或Home鍵,activity生命周期是如何執行的呢?

2. Android傳回鍵與Home鍵對activity生命周期的影響:

在Android中,當按下Home鍵,預設情況下stop前台的actiity,即activity設定成onstop,而不是ondestory。如果再次啟動該activity不是調用onCreate,而是調用onSavedInstanceState方法,保持上次Activity的狀态則是從onRestart開始->onStart->onResume;

而當按下back鍵則不同,back鍵預設finish前台的activity,即activity的狀态為onDestory為止,再次啟動該activity則從onCreate開始,不會調用onSavedInstanceState方法。

3. Application的registerActivityLifecycleCallbacks:注冊Activity生命周期回調函數

功能:通過注冊Application的registerActivityLifecycleCallbacks,可以監聽Acitivty的生命周期相關函數的調用情況。

代碼如下:

package com.test.myapplication5;


import android.app.Activity;
import android.app.Application;
import android.os.Bundle;
import android.util.Log;


public class MyApp extends Application {
    private static final String TAG = "MainApplication";
    private static MyApp appInstance;


    public static Application getAppInstance() {
        return appInstance;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(TAG, "===onCreate======");
        appInstance = this;

        registActivityLife();
    }



    private void registActivityLife() {

        this.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {

            @Override
            public void onActivityCreated(Activity activity, Bundle bundle) {
                Log.i(TAG, "[registActivityLife] onActivityCreated activity " + activity.getLocalClassName());
            }

            @Override
            public void onActivityStarted(Activity activity) {
                Log.i(TAG, "[registActivityLife] onActivityStarted activity " + activity.getLocalClassName());
            }

            @Override
            public void onActivityResumed(Activity activity) {
                Log.i(TAG, "[registActivityLife] onActivityResumed activity " + activity.getLocalClassName());
            }

            @Override
            public void onActivityPaused(Activity activity) {
                Log.i(TAG, "[registActivityLife] onActivityPaused activity " + activity.getLocalClassName());

            }

            @Override
            public void onActivityStopped(Activity activity) {
                Log.i(TAG, "[registActivityLife] onActivityStopped activity " + activity.getLocalClassName());

            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
                Log.i(TAG, "[registActivityLife] onActivitySaveInstanceState activity " + activity.getLocalClassName());

            }

            @Override
            public void onActivityDestroyed(Activity activity) {
                Log.i(TAG, "[registActivityLife] onActivityDestroyed activity " + activity.getLocalClassName());
            }
        });
    }
}
           

運作結果:

28755-28755/com.test.myapplication5 I/MainApplication: [registActivityLife] onActivityCreated activity MainActivity
28755-28755/com.test.myapplication5 I/MainApplication: [registActivityLife] onActivityStarted activity MainActivity
28755-28755/com.test.myapplication5 I/MainApplication: [registActivityLife] onActivityResumed activity MainActivity
28755-28755/com.test.myapplication5 I/MainApplication: [registActivityLife] onActivityPaused activity MainActivity

28755-28755/com.test.myapplication5 I/MainApplication: [registActivityLife] onActivityCreated activity activity.MyBrowserActivity2
28755-28755/com.test.myapplication5 I/MainApplication: [registActivityLife] onActivityStarted activity activity.MyBrowserActivity2
28755-28755/com.test.myapplication5 I/MainApplication: [registActivityLife] onActivityResumed activity activity.MyBrowserActivity2
28755-28755/com.test.myapplication5 I/MainApplication: [registActivityLife] onActivityStopped activity MainActivity
28755-28755/com.test.myapplication5 I/MainApplication: [registActivityLife] onActivitySaveInstanceState activity MainActivity
           

相關activity的代碼略。

繼續閱讀