一直以來(lái)腕铸,Android開(kāi)發(fā)都充斥了大量的不規(guī)范的操作和重復(fù)代碼姨拥,比如生命周期的管理甲脏,開(kāi)發(fā)過(guò)程的重復(fù),項(xiàng)目架構(gòu)的選擇等等仅淑。谷歌IO大會(huì)上似芝,Google官方向推出了 Jetpack悠反,旨在讓開(kāi)發(fā)者們能夠更好铺然,更快疙渣,更規(guī)范地開(kāi)發(fā)出優(yōu)質(zhì)應(yīng)用。
ViewModel + LiveData
- DataBinding
- Navigation
- Room
- WorkManger
- Paging
1. 作用
Lifecycle 是 Android Jetpack 的一部分俗冻,是生命周期感知型組件礁叔,可執(zhí)行操作來(lái)響應(yīng)另一個(gè)組件(Activity 和 Fragment)的生命周期狀態(tài)的變化。Lifecycle是一個(gè)類迄薄,用于存儲(chǔ)有關(guān)組件(如 Activity 或 Fragment)的生命周期狀態(tài)的信息晴圾,并允許其他對(duì)象觀察此狀態(tài)。
- 被觀察者:LifecycleOwner
- 觀察者:LifecycleObserver
在新 SDK 中噪奄,Acticity、Fragment 人乓、LifecycleService默認(rèn)實(shí)現(xiàn)了 LifecycleOwner 接口(也可自己實(shí)現(xiàn))勤篮,觀察者只需要實(shí)現(xiàn) LifecycleObserver 接口。
2.如何使用色罚?
1. 使用方式
Lifecycle 有三種實(shí)現(xiàn)方法:
- LifecycleObserver 配合注解
- FullLifecyclerObserver 擁有宿主所有生命周期事件
- LifecycleEventObserver宿主生命周期事件封裝成 Lifecycle.Event
2.使用場(chǎng)景
場(chǎng)景一: 使用 LifeCycle 解耦頁(yè)面與組件
以定位功能為案例碰缔,我們正常使用定位功能時(shí)都是在Avtivity的OnStart() 中開(kāi)啟定位,在OnStop()中關(guān)閉定位戳护。而使用LifeCycle可以感知宿主的能力進(jìn)行解耦金抡。
// gradle依賴添加
implementation 'androidx.appcompat:appcompat:1.2.0'
public class LocationListener implements LifecycleObserver {
private static String TAG = "MyVideoPlayListener";
// 被注解標(biāo)記過(guò)的方法便會(huì)自動(dòng)調(diào)用
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
private void startLocation(){
Log.i(TAG,"開(kāi)啟定位");
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
private void stopLocation(){
Log.i(TAG,"關(guān)閉定位");
}
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LocationListener listener = new LocationListener();
getLifecycle().addObserver(listener);
}
}
場(chǎng)景二:使用 LifecycleService 解耦 Service 與組件
LifecycleService 就是用來(lái)監(jiān)聽(tīng)和解耦 Service 組件的,它繼承了Service類的同時(shí)也實(shí)現(xiàn)了LifecycleOwner 接口腌且。
// gradle依賴添加
implementation "androidx.lifecycle:lifecycle-service:2.2.0"
public class ServiceLocationListener implements LifecycleObserver {
private static String TAG = "MyVideoPlayListener";
// 被注解標(biāo)記過(guò)的方法便會(huì)自動(dòng)調(diào)用
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
private void startLocation(){
Log.i(TAG,"開(kāi)啟定位");
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
private void stopLocation(){
Log.i(TAG,"關(guān)閉定位");
}
}
public class MyService extends LifecycleService {
private ServiceLocationListener myServiceObserver;
public MyService(){
myServiceObserver = new ServiceLocationListener();
getLifecycle().addObserver(myServiceObserver);
}
}
場(chǎng)景三:使用 ProcessLifecycleOwner 監(jiān)聽(tīng)?wèi)?yīng)用程序的生命周期
具有生命周期的組件除了 Activity梗肝、Fragment 和 Service 外,還有 Application铺董。ProcessLifecycleOwner 就是用來(lái)監(jiān)聽(tīng)整個(gè)應(yīng)用程序的生命周期情況巫击。
// gradle依賴添加
implementation "androidx.lifecycle:lifecycle-process:2.2.0"
public class ApplicationObserver implements LifecycleObserver {
private String TAG = this.getClass().getName();
/**
* 在應(yīng)用程序的整個(gè)生命周期中只會(huì)被調(diào)用一次
*/
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
public void onCreate() {
Log.d(TAG,"Lifecycle.Event.ON_CREATE");
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onStart() {
Log.d(TAG,"Lifecycle.Event.ON_START");
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void onResume() {
Log.d(TAG,"Lifecycle.Event.ON_RESUME");
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void onPause() {
Log.d(TAG,"Lifecycle.Event.ON_PAUSE");
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onStop() {
Log.d(TAG,"Lifecycle.Event.ON_STOP");
}
/**
* 永遠(yuǎn)不會(huì)被調(diào)用,系統(tǒng)不會(huì)分發(fā)調(diào)用 ON_DESTROY 事件
*/
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroy() {
Log.d(TAG,"Lifecycle.Event.ON_DESTROY");
}
}
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
ProcessLifecycleOwner.get().getLifecycle().addObserver(new ApplicationObserver());
}
}
注意事項(xiàng):
- ProcessLifecycleOwner 是針對(duì)整個(gè)應(yīng)用程序的監(jiān)聽(tīng)精续,與 Activity 的數(shù)量無(wú)關(guān)坝锰。
- Lifecycle.Event.ON_CREATE 只會(huì)被調(diào)用一次,而 Lifecycle.Event.ON_DESTROY 永遠(yuǎn)不會(huì)被調(diào)用重付。
- Lifecycle.Event.ON_PAUSE 和 Lifecycle.Event.ON_STOP 的調(diào)用會(huì)有一定的延后顷级,因?yàn)橄到y(tǒng)需要為“屏幕旋轉(zhuǎn),由于配置發(fā)生變化而導(dǎo)致的 Activity 重新創(chuàng)建” 的情況預(yù)留一些時(shí)間确垫。