android lifecycle介紹及實(shí)踐

  • 介紹
    Lifecycle 使得其它組件可以獲取類似activity和Fragment那樣響應(yīng)生命周期的能力。我們可以直接在fragment和activity的相關(guān)生命周期函數(shù)中進(jìn)行操作,但是這樣的代碼不太好維護(hù),耦合性太高。 而生lifecycle-aware組件利用觀察者模式,使得其它對“生命周期”感興趣的組件能自己處理,而不必直接在fragment和activity中進(jìn)行處理。

  • 背景
    最近項(xiàng)目組要啟動一個新項(xiàng)目,以前的項(xiàng)目都是使用簡單的mvp架構(gòu)。其中有一個繁瑣的處理就是,p層和view層強(qiáng)耦合,原因就在于生命周期的處理方式。現(xiàn)在全新啟動一個項(xiàng)目,完全沒有技術(shù)負(fù)擔(dān),所以對這個問題使用lifecycle-aware組件進(jìn)行優(yōu)化。

  • 依賴

allprojects {
    repositories {
        jcenter()
        google()//添加Google Maven倉庫
    }
}
dependencies {
    // Java8 support for Lifecycles
    implementation "android.arch.lifecycle:common-java8:1.1.1"
// Lifecycles only (no ViewModel or LiveData)
    implementation "android.arch.lifecycle:runtime:1.1.1"
    annotationProcessor "android.arch.lifecycle:compiler:1.1.1"
}
  • Presenter層實(shí)現(xiàn)

懶加載fragment相關(guān)的生命周期接口

public interface CoinSignalLifecycleObserver extends DefaultLifecycleObserver {

    default void onFragmentFirstVisible(){}

    default void onFragmentResume(){}

    default void onFragmentPause(){}

}

presenter接口

public interface BasePresenter extends CoinSignalLifecycleObserver {

    default void disPose(Disposable disposable) {
        if (disposable != null && !disposable.isDisposed()) {
            disposable.dispose();
        }
    }
}

fragment的實(shí)現(xiàn)

public class BaseMvpFragment<T extends BasePresenter> extends Fragment{

    protected T presenter;

    protected void initPresenter(){}

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initPresenter();
        if (presenter != null) {
            getLifecycle().addObserver(presenter);
        }
    }
}

Activity的實(shí)現(xiàn),其中activity里有沉浸式相關(guān)代碼

public abstract class BaseMvpActivity<T extends BasePresenter> extends AppCompatActivity implements LifecycleOwner {
    protected LifecycleRegistry mLifecycleRegistry;
    protected T presenter;

    protected ImmersiveHelper immersiveHelper;
    protected View statusView;

    protected abstract void initPresenter();

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mLifecycleRegistry = new LifecycleRegistry(this);
        if (presenter != null) {
            getLifecycle().addObserver(presenter);
        }
        mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
        setLayout();
        statusView = findViewById(R.id.status_bar_view);
        if (statusView != null) {
            immersiveHelper = new ImmersiveHelper(this, statusView);
        }
    }

    protected abstract void setLayout();

    @Override
    protected void onStart() {
        super.onStart();
        mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
    }

    @Override
    protected void onStop() {
        super.onStop();
        mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY);
        if (immersiveHelper == null){
            return;
        }
        immersiveHelper.destroy();
        immersiveHelper = null;
    }

    @Override
    protected void onResume() {
        super.onResume();
        mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
        MobclickAgent.onResume(this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE);
        MobclickAgent.onPause(this);
    }

    /**
     * 是否可以使用沉浸式
     * Is immersion bar enabled boolean.
     *
     * @return the boolean
     */
    public boolean isImmersionBarEnabled() {
        return immersiveHelper.isImmersionBarEnabled();
    }

    public void initImmersionBar() {
        //在BaseActivity里初始化
        immersiveHelper.initImmersionBar();
    }

    public void hideSoftKeyBoard() {
        if (immersiveHelper == null){
            return;
        }
        immersiveHelper.hideSoftKeyBoard();
    }

    public void finish() {
        super.finish();
        hideSoftKeyBoard();
    }
}
  • 總結(jié)
    如上代碼,在實(shí)現(xiàn)p層和view層相關(guān)代碼的時候,它們倆個層次的耦合變得很低。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容