Android ActivityLifeCallbacks解析

peqa2188 7年前發布 | 6K 次閱讀 安卓開發 Android開發 移動開發

今天利用下班的時間來整理一篇在實際遇到的一個新的知識點,對于我來說是新的。

文章的名字也是ActivityLifeCallbacks,意思為Activity的生命周期回調。實際上,并不是標題黨那么嚇人,就是android.app.Application里的一個接口,只是之前沒有實際使用過,所以花了一個晚上的時間來整理這么一個blog,讓自己加深記憶,同時也算總結一下它的基本用法。

那么,這篇的文章的主角,就是android.app.Application中的一個接口,名字就是ActivityLifecycleCallbacks,android的源碼中并沒有給出這個內部接口的文檔(一點都沒有),去官方API查也沒有什么有用的信息,只是把接口中需要實現的方法羅列了出來,然后,就沒有然后了。

既然這樣,我們就從實際項目中出發。 ActivityLifecycleCallbacks是Application中的一個內部接口,public修飾的,那么就意味著一些類可以實現這個接口來完成個功能。 ActivityLifecycleCallbacks想簡單可以簡單,想復雜也可以復雜,就看我們需要完成什么功能。接下來,我們從這個接口的內部去看看,它都定義了哪些需要實現的功能。

Application. ActivityLifecycleCallbacks

public interface ActivityLifecycleCallbacks {
// When activity is created, this method will be called.
 void onActivityCreated(Activity activity, Bundle savedInstanceState);

 // When onStart method runs, the method will be called.
 void onActivityStarted(Activity activity);

 // When onResume method runs, the method will be called.
 void onActivityResumed(Activity activity);

 // When onPause method runs, the method will be called.
 void onActivityPaused(Activity activity);

 // When onStopped method runs, the method will be called.
 void onActivityStopped(Activity activity);

 // When activity needs to save state with bundle, this method will be called.
 void onActivitySaveInstanceState(Activity activity, Bundle outState);

 // When onDestroy method runs, the method will be called.
 void onActivityDestroyed(Activity activity);

}

在上面的源碼中,我給每一個方法標識出了注釋,其實,不難發現, ActivityLifecycleCallbacks這個接口就是在描述一個Activity的生命周期,Activity的每一個生命周期都對應一個接口中的一個方法,同時,目標Activity從創建(onCreate)到銷毀(onDestroy),每一個接口方法中都有Activity的實例作為參數傳入,那么對應這個Activity實例,我們就可以做一些簡單或者復雜的實現了。

學習新的內容,對于程序猿來說,一定要先學會使用,然后在去探究它的內部原理,由淺入深,這樣體會更深,把握脈絡更準確,有可能創造來更優秀的東西。

它的基本使用是很簡單的:

  • 我們可以直接利用Application的子類來實現接口,也可以自己定義類來實現接口,那么我們就選擇最簡單的,直接利用Application的子類。
  • 在MyApplication的onCreate方法中,注冊這個接口。
  • 完成接口方法的具體實現。

    public class BaseApplication extends Application implements Application.ActivityLifecycleCallbacks {
    @Override
      public void onCreate() {
    super.onCreate();
      this.registerActivityLifecycleCallbacks(this);

    }

    @Override

    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {

    Log.i("BaseApplication", "onActivityCreated");

    }

    @Override

    public void onActivityStarted(Activity activity) {

    Log.i("BaseApplication", "onActivityStarted");

    }

    @Override

    public void onActivityResumed(Activity activity) {

    Log.i("BaseApplication", "onActivityResumed");

    }

    @Override

    public void onActivityPaused(Activity activity) {

    Log.i("BaseApplication", "onActivityPaused");

    }

    @Override

    public void onActivityStopped(Activity activity) {

    Log.i("BaseApplication", "onActivityStopped");

    }

    @Override

    public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

    Log.i("BaseApplication", "onActivitySaveInstanceState");

    }

    @Override

    public void onActivityDestroyed(Activity activity) {

    Log.i("BaseApplication", "onActivityDestroyed");

    }

    }

在這個簡單的實現里,我們只需要完成上面的三條就可以了,那ActivityLifecycleCallbacks就可以發揮作用了。我們的實現超級簡單就是打印log,所以,log的打印順序會跟著Activity的生命周期順序來完成。

那么既然是這樣,接下來就來分析整體的注冊和執行流程。

public class Application extends ContextWrapper implements ComponentCallbacks2 {
     private ArrayList<ActivityLifecycleCallbacks> mActivityLifecycleCallbacks = new ArrayList<ActivityLifecycleCallbacks>();
     ...
// register method
 public void registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback) {
      synchronized (mActivityLifecycleCallbacks) {
           mActivityLifecycleCallbacks.add(callback);
      }
 }

 // unregister method
 public void unregisterActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback) {
      synchronized (mActivityLifecycleCallbacks) {
           mActivityLifecycleCallbacks.remove(callback);
      }
 }

 // 只舉一個方法來說明,其它的大同小異
 /* package */ void dispatchActivityCreated(Activity activity, Bundle savedInstanceState) {
         Object[] callbacks = collectActivityLifecycleCallbacks();
         if (callbacks != null) {
             for (int i=0; i<callbacks.length; i++) {
                 ((ActivityLifecycleCallbacks)callbacks[i]).onActivityCreated(activity,
                         savedInstanceState);
             }
         }
 }

}

mActivityLifecycleCallbacks是一個數組列表,存放的就是 ActivityLifecycleCallbacks 的實現類,從上面的栗子來看,就是我們自定義的Application,注冊和解除注冊就是一個操作數組列表的動作,沒有復雜的內容。

dispatchActivityCreated()方法就是對接口中的方法進行調用的,其實也沒啥難的,原理很簡單。

首先這個方法/ package /的,這里有點說道,一會我們再詳細說明。方法傳遞了一個Activity作為參數,同時,傳入了一個savedInstanceState的bundle參數,打眼一看,這就是Activity的onCreated方法的反向執行么。那么隨便一猜就知道,這個方法肯定要再onCreate方法中調用的,方法內部執行也很簡單, collectActivityLifecycleCallbacks 方法會收集到所有的 ActivityLifecycleCallbacks ,然后遍歷,就直接完成回調了。對于回調方法的具體執行就是我們在MyApplication中給出的實現。很簡單吧!

最后我們在去驗證一下, dispatchActivityCreated 是如何調用的。既然是跟著Activity生命周期走的,肯定在Activity類中了。進去看一下。

Paste_Image.png

以上就是在Activity類中的onCreate方法的截圖,圖中紅色圈住的部分就是我們在找的調用了。

小結:

關于 ActivityLifecycleCallbacks的使用和原理是很簡單的,基本上大致看看就知道原理和使用了。之所以寫這個小短文,一是自己之前沒使用過,二是既然是新東西就有必要學習并且記錄一下。

關于如何使用它并且在什么場景下使用它,這里有話要說。如果我們有必要對每一個Activity的生命周期進行管控,那么 ActivityLifecycleCallbacks 就有存在的價值,我們在Activity的創建或者銷毀等周期進行一些打點,記錄或者收集頁面信息的時候,這些場景下可能會有用武之地。

但是,Android系統是不建議我們這么做的。為啥這么說,幾點來看吧。

這些方法是Inner—API同時是package范圍內的。上圖!

Paste_Image.png

圖中圈住的兩處就能說明問題了,首先,系統之所以沒有給出明確doc或者說明,而是給了這么一個// Internal API,就是說這些方法是供Android framework內部使用的API,我們在platform下的android.jar下的字節碼文件中是找不到這些方法的,因為它們被隱藏了,也就說這些API不準備對外提供使用,據我所查資料得知,@hide掉的API方法是無法對外提供的,而且在正常提供的android包下是找不到這些方法,只有真正在程序執行的時候,系統會在一個對應的framework.jar下完成隱藏API的內部調用,系統將它們分離開就是不希望這些內部API暴露出去。這也就是為什么我們在第一張圖中,getApplication().dispatchActivityCreated()方法的時候,為什么這個方法是紅色(找不到)的原因。因為它根部就不再android.jar中。

所以,如果不是必須,就盡量不去完成這個任務,了解了這個接口以及原理和使用就可以。如果真的有需要,也要盡量保證不要破壞Activity同時也要小心內存泄漏的問題。

 

 

 

來自:http://www.jianshu.com/p/f49f7bb44126

 

 本文由用戶 peqa2188 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!