国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android框架組件Lifecycle的使用詳解

2019-10-21 21:44:15
字體:
來源:轉載
供稿:網友

1.前言

Lifecycle是Google推出的一系列的框架組件的其中一個,主要是用來感知Activity和Fragment的生命周期。

本文主要介紹如何使用Lifecycle。

2.一個常見的開發例子

public class TestActivity extends Activity{  @Override  protected void onCreate(@Nullable Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    xxx.onCreate();  }  @Override  protected void onStart() {    super.onStart();    xxx.onStart();  }  @Override  protected void onStop() {    super.onStop();    xxx.onStop();  }}

通常,我們都會寫出一些類似上面的代碼來監聽生命周期。如果有太多這樣的調用將會使某個生命周期方法變的非常臃腫。如下一段例子:

  @Override  protected void onStart() {    super.onStart();    xxx.onStart();    xxx1.onStart();    xxx2.onStart();    //...    }

Lifecycle組件能夠解決這個問題,從而使代碼能夠寫得更優雅。

3.Lifecycle使用例子

下面來看下如何使用Lifecycle。

3.1 添加依賴

在相應的moudle目錄下的build.gradle中添加以下依賴:

dependencies {  //...  def lifecycle_version = "1.1.1"  implementation "android.arch.lifecycle:runtime:$lifecycle_version"}

3.2 實現LifecycleObserver接口

public class TestLifeCycle implements LifecycleObserver {  private static final String TAG = "test";  @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)  public void onCreate() {    Log.d(TAG, "onCreate: ");  }  @OnLifecycleEvent(Lifecycle.Event.ON_START)  public void onStart() {    Log.d(TAG, "onStart: ");  }  @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)  public void onResume() {    Log.d(TAG, "onResume: ");  }  @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)  public void onPause() {    Log.d(TAG, "onPause: ");  }  @OnLifecycleEvent(Lifecycle.Event.ON_STOP)  public void onStop() {    Log.d(TAG, "onStop: ");  }  @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)  public void onDestroy() {    Log.d(TAG, "onDestroy: ");  }  @OnLifecycleEvent(Lifecycle.Event.ON_ANY)  public void onAny() {    Log.d(TAG, "onAny: ");  }}

通過實現LifecycleObserver接口,然后在相應的方法上面添加注解@OnLifecycleEvent(Lifecycle.Event.XXX)即可。實際上,這就是一個觀察者。當執行到某個生命周期時,會通知觀察者執行對應的方法。

3.3 Activity中添加觀察者

public class TestActivity extends AppCompatActivity {  @Override  protected void onCreate(@Nullable Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.test_activity);    getLifecycle().addObserver(new TestLifeCycle());  }}

繼承AppCompatActivity后,即可通過添加觀察者來監聽此Activity的生命周期了。相比第2小節的例子,只要一句話就完事,是不是簡單多了呢。到這里,Lifecycle的簡單使用例子就完成了。

我們先來看下一個完整的生命周期的輸出結果:

07-24 23.23:55.892 15728-15728/com.test.start D/test: onCreate: 
07-24 23.23:55.892 15728-15728/com.test.start D/test: onAny: 
07-24 23.23:55.893 15728-15728/com.test.start D/test: onStart: 
07-24 23.23:55.893 15728-15728/com.test.start D/test: onAny: 
07-24 23.23:55.895 15728-15728/com.test.start D/test: onResume: 
07-24 23.23:55.895 15728-15728/com.test.start D/test: onAny: 
07-24 23.23:58.183 15728-15728/com.test.start D/test: onPause: 
07-24 23.23:58.184 15728-15728/com.test.start D/test: onAny: 
07-24 23.23:58.576 15728-15728/com.test.start D/test: onStop: 
07-24 23.23:58.577 15728-15728/com.test.start D/test: onAny: 
07-24 23.23:58.585 15728-15728/com.test.start D/test: onDestroy: 
07-24 23.23:58.586 15728-15728/com.test.start D/test: onAny:

可以看到,onAny是每個生命周期都會調用到一次。其他的話,就是正常調用。

注意,目前只能通過繼承AppCompatActivity來實現這種簡單的方式,直接繼承Activity的話稍復雜,祥見后面的分析,暫且不表。

3.4 Fragment中添加觀察者

public class TestFragment extends Fragment {  @Override  public void onCreate(@Nullable Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    getLifecycle().addObserver(new TestLifeCycle());  }}

同樣,也可以監聽到Fragment的生命周期,加一個觀察者即可。

4. Lifecycle角色說明

4.1 Lifecycle類

Lifecycle類持有Activity 或 Fragment等組件的生命周期信息,并且允許其他對象觀察這些信息。

Lifecycle內部使用了兩個枚舉來跟蹤其關聯組件的生命周期狀態:EventState。祥見下面分析。

可以通過調用Lifecycle類的 addObserver() 方法來添加觀察者,如下:

getLifecycle().addObserver(new TestLifeCycle());

4.2 Lifecycle事件

Lifecycle組件可以感知如下事件:

public abstract class Lifecycle {  public enum Event {    ON_CREATE,ON_START,ON_RESUME,ON_PAUSE,ON_STOP,ON_DESTROY,ON_ANY  }}

看起來有7種,實際上也就是6種而已。ON_ANY表示所有的事件都會感知。可以看到,像ActivityonRestart() ,FragmentonCreateView()等等其他生命周期是無法感知的。

4.3 Lifecycle狀態

Lifecycle組件內部維護了一個State來標識Activity或Fragment當前的狀態。如下:

public abstract class Lifecycle {  public enum State {    DESTROYED,    INITIALIZED,    CREATED,    STARTED,    RESUMED;    public boolean isAtLeast(@NonNull State state) {      return compareTo(state) >= 0;    }  }}

一共也就5種狀態而已,其狀態和事件的狀態關系如下圖所示:

Android,框架組件,Lifecycle

4.4 LifecycleOwner接口

LifecycleOwner表示它的實現類具有一個 Lifecycle。它有一個 getLifecycle()方法,該方法必須由實現類實現。

AppCompatActivityFragment都實現了LifecycleOwner接口(Support Library 26.1.0之后的版本),所以可以直接拿來使用。

但是Activity類并沒有實現LifecycleOwner接口,所以,如果我們需要去監聽自定義Activity的話,需要自己手動去實現LifecycleOwner接口。詳見后面分析。

4.5 LifecycleObserver接口(觀察者)

LifecycleObserver其實現類可以通過感知相應的生命周期來完成特定的操作。可以看前面的例子實現。

5. 自定義Activity中實現LifecycleOwner

感知AppCompatActivityFragment的子類生命周期都很簡單,一行代碼就可以完成了。但是感知自定義Activity就稍微復雜了點,實現我們手動去完成以下步驟:

  1. 實現LifecycleOwner接口
  2. 重寫getLifecycle()方法
  3. 手動標記生命周期的狀態

其代碼如下所示:

public class TestActivity extends Activity implements LifecycleOwner {  private LifecycleRegistry mLifecycleRegistry;  @NonNull  @Override  public Lifecycle getLifecycle() {    //返回Lifecycle    return mLifecycleRegistry;  }  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.test_activity);    //創建Lifecycle對象    mLifecycleRegistry = new LifecycleRegistry(this);    //標記狀態    mLifecycleRegistry.markState(Lifecycle.State.CREATED);    //添加觀察者    getLifecycle().addObserver(new TestLifeCycle());  }    @Override  public void onStart() {    super.onStart();    //標記狀態    mLifecycleRegistry.markState(Lifecycle.State.STARTED);  }  @Override  protected void onResume() {    super.onResume();    //標記狀態    mLifecycleRegistry.markState(Lifecycle.State.RESUMED);  }  @Override  protected void onDestroy() {    super.onDestroy();    //標記狀態    mLifecycleRegistry.markState(Lifecycle.State.DESTROYED);  }}

上面的LifecycleRegistry其父類是Lifecycle。

6. 其他

本文主要介紹Lifecycle的使用,相關的原理和源碼分析就先不說了。后面有時間再補充~

參考資料:Handling lifecycles with lifecycle-aware components

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 漳平市| 洞头县| 禄丰县| 枣阳市| 富源县| 连州市| 绩溪县| 阿克| 崇明县| 赤水市| 孟村| 象山县| 漯河市| 延津县| 九江县| 闸北区| 香河县| 宜都市| 林甸县| 元氏县| 比如县| 城步| 临湘市| 台东县| 武平县| 建阳市| 潜山县| 治县。| 郴州市| 海丰县| 叙永县| 油尖旺区| 古交市| 肃宁县| 榆社县| 南川市| 江川县| 秀山| 雷波县| 务川| 安康市|