生命周期相关,Activity或者Fragment或者APP或者Service生命周期的管理框架。
优点
- 降低组件和模块的耦合度
- 降低内存泄漏
- Activity和Fragment,以及service,application均支持lifecycle
引用库
//lifecycle
def lifecycle_version = "2.3.1"
//Lifecycles only (without ViewModel or LiveData)
implementation "androidx.lifecycle:lifecycle-runtime:$lifecycle_version"
//optional - helpers for implementing LifecycleOwner in a Service
implementation "androidx.lifecycle:lifecycle-service:$lifecycle_version"
//optional - ProcessLifecycleOwner provides a lifecycle for the whole application process
implementation "androidx.lifecycle:lifecycle-process:$lifecycle_version"
组件和页面解耦
组件
实现生命周期监听LifecycleObserver。
在页面onResume的时候开始计时,在onPasue的时候停止计时。
package com.elaine.testlifecycle.widget;
import android.content.Context;
import android.os.SystemClock;
import android.util.AttributeSet;
import android.widget.Chronometer;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;
/**
* 计时器
* 页面显示则计时,若不显示则停止计时
* author: elaine
* date: 2021/5/7
*/
public class CustomChronometer extends Chronometer implements LifecycleObserver {
//退出的时间
private long exitTime;
public CustomChronometer(Context context) {
super(context);
}
public CustomChronometer(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomChronometer(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
private void startTime() {
setBase(SystemClock.elapsedRealtime() - exitTime);
start();
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
private void stopTime() {
exitTime = SystemClock.elapsedRealtime() - getBase();
stop();
}
}
使用
在布局中引用该组件
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".widget.WidgetActivity">
<com.elaine.testlifecycle.widget.CustomChronometer
android:id="@+id/cc_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
在Activity中添加组件监听
package com.elaine.testlifecycle.widget;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import com.elaine.testlifecycle.R;
public class WidgetActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_widget);
CustomChronometer customChronometer = findViewById(R.id.cc_time);
//组件添加监听
getLifecycle().addObserver(customChronometer);
}
}
组件和service解耦
服务
添加观察者。
package com.elaine.testlifecycle.service;
import androidx.lifecycle.LifecycleService;
/**
* 服务
* 继承LifecycleService
*/
public class CustomService extends LifecycleService {
public CustomService() {
CustomServiceObserver customServiceObserver = new CustomServiceObserver();
//服务的生命周期添加观察者
getLifecycle().addObserver(customServiceObserver);
}
}
服务生命周期观察者
实现接口LifecycleObserver,这样就可以设置生命周期。
package com.elaine.testlifecycle.service;
import android.util.Log;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;
/**
* 服务生命周期观察
*
* author: elaine
* date: 2021/5/7
*/
public class CustomServiceObserver implements LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
private void startGetInternetState() {
Log.e("网络情况=======", "开始获取");
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
private void stopGetInternetState() {
Log.e("网络情况=======", "结束获取");
}
}
使用
添加两个按钮,一个开启服务,一个关闭服务。
package com.elaine.testlifecycle.service;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import com.elaine.testlifecycle.R;
public class ServiceActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_service);
Button btnStart = findViewById(R.id.btn_start);
Button btnStop = findViewById(R.id.btn_stop);
//开启服务
btnStart.setOnClickListener(v -> startService(new Intent(ServiceActivity.this, CustomService.class)));
//关闭服务
btnStop.setOnClickListener(v -> stopService(new Intent(ServiceActivity.this, CustomService.class)));
}
}
ProcessLifecycleOwner监听APP生命周期
Application
ProcessLifecycleOwner添加实现LifecycleObserver接口的ApplicationLifecycleObserver监听,LifecycleApp添加对外开放判断APP前后台的方法。
package com.elaine.testlifecycle.processlifecycleowner;
import android.app.Application;
import android.util.Log;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;
import androidx.lifecycle.ProcessLifecycleOwner;
/**
* ProcessLifecycleOwner
* 管理Application生命周期
* <p>
* author: elaine
* date: 2021/5/6
*/
public class LifecycleApp extends Application {
//用于判断APP是否在后台
private static boolean isRunInBackground;
//自身
private static LifecycleApp instance;
/**
* 对外开放的方法
*
* @return LifecycleApp
*/
public static LifecycleApp getInstance() {
return instance;
}
/**
* 判断APP是否在后台
* 对外开放的方法
*
* @return 是否在后台
*/
public boolean getIsRunInBackground() {
return isRunInBackground;
}
@Override
public void onCreate() {
super.onCreate();
instance = this;
//ApplicationLifecycleObserver加入生命周期监听
ProcessLifecycleOwner.get().getLifecycle().addObserver(new ApplicationLifecycleObserver());
}
/**
* 监听APP进入前台或后台
*/
private static class ApplicationLifecycleObserver implements LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_START)
private void onAppForeground() {
Log.e("app====", "app在前台");
isRunInBackground = false;
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
private void onAppBackground() {
Log.e("app====", "app在后台");
isRunInBackground = true;
}
}
}
引用application
在AndroidManifest.xml文件的application标签下,添加如下代码:
android:name=".processlifecycleowner.LifecycleApp"
使用
在需要判断APP是否在前后台的地方调用以下方法,代码如下:
LifecycleApp.getInstance().getIsRunInBackground()