一.序
自從Google IO 大會提出 Android Architecture Components武花,越來越多的使用組件加入其中。其中
Handling lifecycles with lifecycle-aware components 這篇文章就向我介紹了LifeCycle這個超實用組件望艺。
二.LifeCycle簡介
2.1為什么我們要使用LifeCycle票腰?
我們寫代碼的時候難免會寫寫一些Presenter或者M(jìn)ananger或者一些業(yè)務(wù)性很強(qiáng)的View堕油。來把很一些業(yè)務(wù)邏輯從Activity中分解掉。但是不免遇到的問題就是乐严。上述這些輔助類不像Activity和Fragment一樣擁有比較完善的生命周期瘤袖。
當(dāng)然我們我們也可以這樣寫:
public interface IPresenter {
void onCreate();
void onStart();
void onResume();
void onPause();
void onStop();
void onDestroy();
}
public class MainPresenter implements IPresenter {
public MainPresenter(Context context){
}
@Override
public void onCreate() {
}
@Override
public void onStart() {
}
@Override
public void onResume() {
}
@Override
public void onPause() {
}
@Override
public void onStop() {
}
@Override
public void onDestroy() {
}
}
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private IPresenter mPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate: ");
setContentView(R.layout.activity_main);
mPresenter = new MainPresenter(this);
mPresenter.onCreate();
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart: ");
mPresenter.onStart();
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume: ");
mPresenter.onResume();
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "onPause: ");
mPresenter.onPause();
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "onStop: ");
mPresenter.onStop();
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy: ");
mPresenter.onDestroy();
}
}
這個例子很簡單。我們當(dāng)然可以這么寫昂验。但是如果對于一個復(fù)雜Activity和Fragment來說捂敌。可能綁定了多個Presenter既琴,Manager占婉,或者View。那這個代碼寫起來就會很復(fù)雜甫恩。尤其是當(dāng)這些東西被其他人復(fù)用的時候逆济,很難讓別人也注意到這些細(xì)節(jié)。(就是在他們的Activity中的對應(yīng)生命周期要調(diào)用這些)
2.2 隆重推出LifeCycle
Google也發(fā)現(xiàn)了這樣的問題。所以在support包 26.1.0版本后 奖慌,android.support.v4.app
中的FragmentActivity
和Fragment
中已經(jīng)集成了Lifecycle
相關(guān)的功能抛虫。
簡單說一下LifeCycle的原理吧:
假定一個需要觀察生命周期的Presenter
實例
- 首先通過
Fragment
或者FragmentActivity
中getLifeCycle
方法返回的LifecycleRegistry
實例的addObserver()
方法,加入到FastSafeIterableMap
中简僧。 - 然后將
Presenter
的生命周期快進(jìn)到現(xiàn)在的節(jié)點(diǎn):例如現(xiàn)在LifecycleOwner
的狀態(tài)是STARTED
建椰。Presenter
將會連續(xù)收到ON_CREATE
,ON_START
兩事件岛马。 - 剩下的交給
LifeCycle
棉姐,自此之后Presenter
的生命周期將和宿主保持一致。
關(guān)鍵類介紹:
-
FastSafeIterableMap
管理觀察者的數(shù)據(jù)結(jié)構(gòu)啦逆,對于在迭代的時候進(jìn)行修改做了一些優(yōu)化伞矩。 -
LifecycleRegistry
LifeCycle業(yè)務(wù)核心類,完成觀察者增減蹦浦,觀察者STATE
切換等核心邏輯 -
LifecycleOwner
宿主Activity實現(xiàn)這個接口,android.support.v4.app
中的Fragment
撞蜂,FragmentActivity
已經(jīng)實現(xiàn)這個接口了盲镶。我們也可以給我們自己的Activity實現(xiàn)這個,詳情請看3.2章節(jié)蝌诡。 -
ClassesInfoCache
通過運(yùn)行時注解的方式找到Presenter
中想觀測的生命周期溉贿。
三.簡單用法
3.1 Presenter實現(xiàn)LifecycleObserver
public class MainPresenter implements LifecycleObserver {
public static final String TAG = "MainActivity";
public String name;
public MainPresenter(String name) {
this.name = name;
}
//通過運(yùn)行時注解的方式實現(xiàn)生命周期,是不是很像EventBus
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE) public void onCreate() {
Log.d(TAG, name + "onCreate");
}
@OnLifecycleEvent(Lifecycle.Event.ON_START) public void onStart() {
Log.d(TAG, name + "onStart");
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME) public void onResume() {
Log.d(TAG, name + "onResume");
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) public void onPause() {
Log.d(TAG, name + "onPause");
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP) public void onStop() {
Log.d(TAG, name + "onStop");
}
//比較特殊的一個回調(diào)會在任何生命周期回調(diào)的時候都回調(diào)這里
//@OnLifecycleEvent(Lifecycle.Event.ON_ANY) public void onDestroy() {
// Log.d(TAG, "ON_ANY");
//}
}
Activity只需要把實現(xiàn)了LifecycleObserver
的MainPresenter
交給LifeCycle
管理即可
public class MainActivity extends AppCompatActivity {
public static final String TAG = "MainActivity";
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate");
setContentView(R.layout.activity_main);
MainPresenter mainPresenter = new MainPresenter(TAG);
//把MainPresenter交給LifeCycle管理就OK了
getLifecycle().addObserver(mainPresenter);
}
@Override protected void onStart() {
super.onStart();
Log.d(TAG, "onStart");
}
@Override protected void onRestart() {
super.onRestart();
Log.d(TAG, "onRestart");
}
@Override protected void onResume() {
super.onResume();
Log.d(TAG, "onResume");
}
@Override protected void onPause() {
super.onPause();
Log.d(TAG, "onPause");
}
@Override protected void onStop() {
super.onStop();
Log.d(TAG, "onStop");
}
@Override protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy");
}
}
輸出結(jié)果如下
當(dāng)然值得注意的
- 啟動階段 先回調(diào)Activity的生命周期再回調(diào)LifeCycle的生命周期
- 結(jié)束階段 先回調(diào)LifeCycle的生命周期再回調(diào)Activity的生命周期
發(fā)揮一下想象力浦旱,只要是附著在Activity或者Fragment上的任何實例都可以采用這樣的管理方式宇色,讓其達(dá)到一個自生自滅的問題。是不是就少去了很多內(nèi)存泄漏的問題颁湖。
3.2當(dāng)然也可以這樣用
創(chuàng)建一個自定義的LifeCycle
public class MainActivity1 extends Activity implements LifecycleOwner {
private LifecycleRegistry mLifecycleRegistry;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "Activity->onCreate");
setContentView(R.layout.activity_main);
mLifecycleRegistry = new LifecycleRegistry(this);
}
@NonNull @Override public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
}
四.最佳實踐
當(dāng)然這么好用的東西已經(jīng)和Arch中的其他組件宣蠕,例如DataBinding以及ViewModel可以有一些配合。以后有機(jī)會會嘗試一下甥捺。