Android之MVVM架構指南(三):Lifecycle

使用 Lifecycle 管理 Activity 和 Fragment 組件的生命週期能夠減小重複的樣板代碼以及減小沒必要要的麻煩。bash

開發中生命週期存在的問題

假設咱們要實現一個定位的功能,咱們須要在Activity的生命週期回調方法中添加定位sdk的啓動和中止方法:markdown

public class LocationActivity extends AppCompatActivity{

	private LocationListener listener;		

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// 綁定UI控件
		listener = new LocationListener(this);		
		listener.onLocationUpdate(new LocationCallback(){
			@Override
			public void onUpdate(Position position){
				// 根據位置數據更新UI
			}
		});
	}

	@Override
	protected void onstart(){
		listener.start();
	}

	@Override
	protected void onStop(){
		listener.stop();
	}

}


複製代碼

這是一個很常見的處理方式,可是存在一些缺點:ide

  1. 每次使用定位sdk都須要在生命週期中寫啓動和中止的方法,若是有多個activity使用了sdk就存在不少冗餘代碼。this

  2. 生命週期方法中放置大量代碼,這使得它們難以維護。spa

使用 Lifecycle

使用 Lifecycle 的方法很是簡單,先看 LocationListener的代碼:code

public class LocationListener implements LifecycleObserver {
    
    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void start(){
        // 啓動定位服務
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void stop(){
        // 中止定位服務
    }

}
複製代碼

經過上面的代碼能夠看到咱們只是在原來代碼的基礎上實現了LifecycleObserver接口,並在start()stop()方法上加上了表明觸發它們的生命週期時機的註解,註解裏的參數對應着activity的生命週期。orm

接下來就是在activity中使用就更簡單了。server

public class LocationActivity extends AppCompatActivity{

	private LocationListener listener;		

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// 綁定UI控件
		listener = new LocationListener(this);		
		listener.onLocationUpdate(new LocationCallback(){
			@Override
			public void onUpdate(Position position){
				// 根據位置數據更新UI
			}
		});

		getLifecycle().addObserver(listener); 
	}

}
複製代碼

到此就實現了最開始定位的功能。接口

自定義 Lifecycle 組件

在支持庫 Support Library 26.1.0 中 activity 和 fragment 提供了默認的getLifecycle()方法,可是若是咱們想在低版本和非 activity 、fragment類中也實現生命週期該怎麼辦呢?方法以下:生命週期

public class MyActivity extends Activity implements LifecycleOwner {
    private LifecycleRegistry mLifecycleRegistry;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mLifecycleRegistry = new LifecycleRegistry(this);
        mLifecycleRegistry.markState(Lifecycle.State.CREATED);
    }

    @Override
    public void onStart() {
        super.onStart();
        mLifecycleRegistry.markState(Lifecycle.State.STARTED);
    }

    @NonNull
    @Override
    public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
    }
}
複製代碼

使用原理

整個 Lifecycle 中有幾個重要的類:

  • Lifecycle 抽象類,定義了一些操做LifecycleObserver 的抽象方法,以及表明生命週期的StateEvent枚舉類。

  • LifecycleObserver接口,內部沒有定義任何方法,經過Lifecycle.addObserver()能夠註冊監聽生命週期變化,以註釋的方法聲明監聽。

  • LifecycleOwner 接口,該接口是由生命週期宿主(activity / fragment)實現的,只有一個Lifecycle getLifecycle() 方法。

  • LifecycleRegistry 類,它是 Lifecycle的子類,其內部定義了具體的實現細節,默認狀況下,一個宿主實現了 LifecycleOwner 接口後就應該在其內部聲明一個LifecycleRegistry ,並在本身的生命週期回調方法中爲其設置各類狀態:

this.mLifecycleRegistry.markState(State.CREATED);
複製代碼

相關文章
相關標籤/搜索