Lifecycle-library-stable

why發表於2019-02-25

Google 最近釋出了穩定Lifecyclelibrary。筆者認為:如果你正在使用alpha或者beta版本,以下內容可能對你有用。

Deprecated LifecycleActivity

在stable version 1.0.0 之前,LifeCycle Library 並沒有實現 LifecycleOwner這個介面,所以我們不得不讓我們專案XXXActivity繼承LifecycleActivity。筆者認為這樣有一個毛病:該死的侵入性

但是,在stable version 1.0.0 之後,Google可能意識到這個問題,AppCompatActivity 已經實現了LifecycleOwner 介面,這樣就可以直接繼承原生的AppCompatActivity,然後使用它給你帶了的功能體驗

AppCompatActivity be good for you?

我按照官方文件建議,替換LifecycleAvtivity ,使用AppCompatActivity,程式碼如下:

public class BaseActivity extends AppCompatActivity{
    
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        getLifecycle().addObserver(presenter);
    }
    
}
複製程式碼

筆者提出幾點注意事項

  • support:appcompat-v7 版本一定要>=26.1.0。27.0.2 對應的lifecycle version == 1.0.3
  • presenter 必須實現
    LifecycleObserver 介面

Deprecated LifecycleRegistryOwner

如果你想自定義Lifecycle owner ,你應該實現 LifecycleOwner,而不是LifecycleRegistryOwner

Just Demo

  • build.gradle

appcompat 26.1.0 依舊使用的stable version 1.0.0, 可以考慮手動新增最新版本。 筆者嘗試使用exclude 將appcompat中的lifecycle去掉,發現很多庫(eg:recyclerview constrait-layout fragment …)都依賴Lifecycle, 筆者便放棄了

implementation `com.android.support:appcompat-v7:26.1.0`
implementation "android.arch.lifecycle:runtime:1.0.3" 
annotationProcessor "android.arch.lifecycle:compiler:1.0.3" 
複製程式碼
  • Activity
public class BaseActivity extends AppCompatActivity{
    
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        getLifecycle().addObserver(presenter);
    }
    
}
複製程式碼
  • Observer
public class Presenter implements LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
    public void onAny(LifecycleOwner owner, Lifecycle.Event event) {
        Log.w("@@@@ L41", "Presenter onAny -> " + "");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public void onCreate() {
        Log.w("@@@@ L41", "Presenter onCreate -> " + "");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void onPause() {
        Log.w("@@@@ L41", "Presenter onPause -> " + "");
    }
}
複製程式碼