態(tài)度決定一切 細(xì)節(jié)決定成敗
一干毅、前言
——回顧了一下之前學(xué)習(xí)過的東西并打算把這些東西整理成文章川慌,加深映像和理解,同時(shí)也傳達(dá)自己的見解供大家參考钳枕,若存在錯(cuò)誤或不足的地方,希望您能指出赏壹。
本篇主要介紹Lifecycle鱼炒,根據(jù)下面結(jié)構(gòu)圖進(jìn)行分析。
LifeCycle相關(guān)鏈接——官方文檔蝌借、接口文檔昔瞧、相關(guān)依賴文檔
二、簡介
(1)是什么
—— Lifecycle 是具有生命周期感知能力的組件菩佑。簡單的理解當(dāng)Activity/Fragment的生命周期產(chǎn)生變化時(shí)硬爆,lifeCycle組件也會(huì)有相應(yīng)的生命周期變化。我們可以通過使用lifeCycle組件在自定義的類中管理Activity/fragment的生命周期擎鸠。
主要由三大部分構(gòu)成:Lifecycle缀磕、LifecycleOwner、LifecycleObserver
- Lifecycle:是一個(gè)持有組件生命周期狀態(tài)與事件(如Activity或Fragment)的信息的類
- LifecycleOwner:Lifecycle的提供者劣光,通過實(shí)現(xiàn)LifecycleOwner接口來訪問Lifecycle(生命周期)對象袜蚕。Fragment和FragmentActivity類實(shí)現(xiàn)了LifecycleOwner接口,它具有訪問生命周期的getLifecycle方法绢涡。您還可以在自己的類中實(shí)現(xiàn)LifecycleOwner牲剃。
- LifecycleObserver:Lifecycle觀察者,實(shí)現(xiàn)該接口的類雄可,通過注解的方式凿傅,可以通過被LifecycleOwner類的addObserver(LifecycleObserver o)方法注冊,被注冊后,LifecycleObserver便可以觀察到LifecycleOwner的生命周期事件数苫。
(2)有什么用
—— 常見的模式是在Activity和Fragment的生命周期方法中實(shí)現(xiàn)依賴組件的操作(取消注冊/監(jiān)聽聪舒,釋放內(nèi)存...),如果不這樣做可能會(huì)觸發(fā)內(nèi)存泄漏甚至應(yīng)用程序崩潰虐急。然而箱残,這種模式會(huì)導(dǎo)致糟糕的代碼組織和錯(cuò)誤的擴(kuò)散,。通過使用生命周期感知組件,您可以將依賴組件的代碼移出生命周期方法被辑,并移到組件本身燎悍。
這里舉個(gè)官方文檔的例子說明一下,也更容易理解
常見的模式
class MyLocationListener {
public MyLocationListener(Context context, Callback callback) { /*...*/ }
void start() { /*connect to system location service*/ }
void stop() { /*disconnect from system location service*/ }
}
class MyActivity extends AppCompatActivity {
private MyLocationListener myLocationListener;
@Override
public void onCreate(...) {
myLocationListener = new MyLocationListener(this, (location) -> { /* update UI */ });
}
@Override
public void onStart() {
super.onStart();
myLocationListener.start();
// manage other components that need to respond
// to the activity lifecycle
}
@Override
public void onStop() {
super.onStop();
myLocationListener.stop();
// manage other components that need to respond
// to the activity lifecycle
}
}
實(shí)際的運(yùn)用中盼理,Activity的onStart()和onStop()方法中會(huì)有很多的調(diào)用來管理UI和其他組件谈山,以響應(yīng)生命周期的當(dāng)前狀態(tài)。管理多個(gè)組件會(huì)在生命周期方法中放置大量的代碼宏怔,這使得它們很難維護(hù)勾哩。
Lifecycle模式
public class MyLocationListener implements LifecycleObserver {
private static final String TAG = "MyLocationListener ";
public MyLocationListener(Context context, Callback callback) { /*...*/ }
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void start(){
Log.e(TAG, "start: " );
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void stop(){
Log.e(TAG, "stop: " );
}
}
//Activity/Fragment中使用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyLocationListener myLocationListener = new MyLocationListener(this, (location) -> { /* update UI */ });
getLifecycle().addObserver(myLocationListener );
}
通過Lifecycle組件可以在各自的類中通過注釋響應(yīng)生命周期的當(dāng)前狀態(tài)。
(3)有什么優(yōu)點(diǎn)
1.結(jié)構(gòu)更加清晰举哟,更容易管理生命周期
2.降低維護(hù)難度
3.降低耦合度
三妨猩、基本使用
(4)怎么使用
- 添加依賴
implementation 'androidx.appcompat:appcompat:1.1.0'
// 可選
dependencies {
def lifecycle_version = "2.1.0"
// ViewModel and LiveData
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
// alternatively - just ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version" // For Kotlin use lifecycle-viewmodel-ktx
// alternatively - just LiveData
implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"
// alternatively - Lifecycles only (no ViewModel or LiveData). Some UI
// AndroidX libraries use this lightweight import for Lifecycle
implementation "androidx.lifecycle:lifecycle-runtime:$lifecycle_version"
annotationProcessor "androidx.lifecycle:lifecycle-compiler:$lifecycle_version" // For Kotlin use kapt instead of annotationProcessor
// alternately - if using Java8, use the following instead of lifecycle-compiler
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
// optional - ReactiveStreams support for LiveData
implementation "androidx.lifecycle:lifecycle-reactivestreams:$lifecycle_version" // For Kotlin use lifecycle-reactivestreams-ktx
// optional - Test helpers for LiveData
testImplementation "androidx.arch.core:core-testing:$lifecycle_version"
}
- 定義觀察者
// 定義一個(gè)類實(shí)現(xiàn)LifecycleObserver接口,通過向其方法添加注釋來監(jiān)視組件的生命周期狀態(tài)
public class MyObserver implements LifecycleObserver {
private static final String TAG = "MyObserver";
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void start(){
Log.e(TAG, "start: " );
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void stop(){
Log.e(TAG, "stop: " );
}
}
- 添加觀察者
//通過調(diào)用生命周期類的addObserver()方法并傳遞觀察者的實(shí)例來添加觀察者。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyObserver myObserver = new MyObserver();
getLifecycle().addObserver(myObserver);
}
這里提供入門級使用方式秽褒,下面舉個(gè)例子
-
案例
——廣播的注冊與取消注冊處理
1.定義廣播接收者
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.e("onReceive: action ",intent.getAction());
Log.e("onReceive: content ",intent.getStringExtra("content"));
}
}
2.定義lifecycle觀察者
class BroadCastObserver implements LifecycleObserver {
private static final String TAG = "BroadCastObserver";
private Activity mActivity;
private MyBroadcastReceiver mBroadcastReceiver;
public BroadCastObserver(Activity activity) {
this.mActivity = activity;
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void register(){
Log.e(TAG, "register: " );
mBroadcastReceiver = new MyBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("xxx");
mActivity.registerReceiver(mBroadcastReceiver, intentFilter);
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void unRegister(){
Log.e(TAG, "unRegister: " );
mActivity.unregisterReceiver(mBroadcastReceiver);
}
}
3.添加觀察者
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
BroadCastObserver mBroadCastObserver = new BroadCastObserver(this);
getLifecycle().addObserver(mBroadCastObserver);
}
4.發(fā)送廣播
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("xxx");
intent.putExtra("content", "廣播1號");
sendBroadcast(intent);
}
好了壶硅,使用方式就簡單介紹到這里。大家有空也可以自己試試Service
四销斟、原理
本來想寫成一篇的庐椒,結(jié)果發(fā)現(xiàn)分析的源碼有點(diǎn)多,只好拆開來蚂踊。避免篇幅太長约谈,看著累。犁钟。棱诱。
《Android Jetpack架構(gòu)組件之Lifecycle源碼分析》
五、總結(jié)
也不知道要寫什么涝动。就簡單描述一下使用過程迈勋,lifecycle使用了觀察者模式。
1.先聲明了一個(gè)觀察者醋粟,用來監(jiān)聽被觀察者(Activity/Fragment)靡菇。
2.觀察者通過實(shí)現(xiàn)LifecycleObserver接口,使用注解來監(jiān)聽被觀察者發(fā)生的變化米愿。
3.那么是如何監(jiān)聽的厦凤,這次就使用到了lifecycle。lifecycle相當(dāng)于一個(gè)橋梁育苟,把兩者關(guān)聯(lián)在一起泳唠。
4.被觀察者通過實(shí)現(xiàn)LifecycleOwner接口先連接了橋梁。
5.觀察者則通過getLifecycle().addObserver()方法也建立起連接宙搬。
通俗描述大概就是這么一回事笨腥,具體的實(shí)現(xiàn)方式還是要根據(jù)源碼來分析拓哺。事實(shí)并沒想的這么簡單,源碼也是挺多脖母。
六士鸥、內(nèi)容推薦
七、項(xiàng)目參考
Demo例子鑲嵌到下面Demo中
Github ——apk下載體驗(yàn)地址
若您發(fā)現(xiàn)文章中存在錯(cuò)誤或不足的地方谆级,希望您能指出烤礁!