Android Jetpack 之 Lifecycle

38 阅读2分钟

1、Lifecycle 介绍

Lifecycle 是android.arch.lifecycle 包下各种类和相关接口,通过该Lifecycle 组件可以让开发者构建能够感知其他组件(主要是Activity,Fragment)的生命周期的变化。也就是说通过注册Lifecycle的类,可以监听Activity或者Fragment的生命周期的变化。

2、使用 Lifecycle 解耦页面与组件

自定义一个定时器,与Activity解耦,看代码

/**
 * 定时器,退出界面再次进入,继续计时
 */

public class MyChronometer extends Chronometer implements LifecycleObserver {

    private long exitTime = 0;

    public MyChronometer(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    private void startTime() {
       setBase(SystemClock.elapsedRealtime() - exitTime);
        start();
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    private void pauseTime() {
        exitTime = SystemClock.elapsedRealtime() - getBase();
        stop();
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    private void onRelease() {
        onRelease();
    }
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <cn.kt.app.jetpack.MyChronometer
        android:id="@+id/myChronometer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="24sp" />
</LinearLayout>
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MyChronometer myChronometer = findViewById(R.id.myChronometer);
        getLifecycle().addObserver(myChronometer);
    }
}

实现效果如下:

SVID_20220323_220028_1.gif

3、使用 LifecycleService 解耦 Service 与组件

定义一个MyLocationObserver 位置变化时上报经纬度,实现与service解耦,看代码:

/**
 * 位置发生改变时,上报当前位置经纬度
 */
public class MyLocationObserver implements LifecycleObserver {

    private static final String TAG = "MyLocationObserver";

    private LocationManager locationManager;
    private Context mContext;

    public MyLocationObserver(Context mContext) {
        this.mContext = mContext;
    }

    private final LocationListener myListener = new LocationListener() {
        @Override
        public void onLocationChanged(@NonNull Location location) {
            Log.i(TAG, " onLocationChanged: " + location.toString());
        }
    };

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    private void startLocation() {
        Log.d(TAG, " startLocation ");
        locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
        // 申请权限
        if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                && ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3000, 1f, myListener);
    }


    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    private void stopLocation() {
        Log.d(TAG, " stopLocation ");
        locationManager.removeUpdates(myListener);
    }

}
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
public class MyService extends LifecycleService {

    private static final String TAG = "MyService";

    @Override
    public void onCreate() {
        super.onCreate();
        MyLocationObserver myLocationObserver = new MyLocationObserver(this);
        getLifecycle().addObserver(myLocationObserver);
    }
}

使用命令修改经纬度位置

./adb -s emulator-5554 emu geo fix 128.22 80.11

监听到位置的变化

2022-03-24 08:37:44.836 18168-18168/cn.kt.app D/MyLocationObserver:  startLocation
2022-03-24 08:37:48.786 18168-18168/cn.kt.app D/MyLocationObserver: Location[gps 36.880000,128.219998 hAcc=5 et=+19075d0h37m48s773ms etAcc=+1ms alt=0.0 vel=0.0 bear=0.0 vAcc=1 sAcc=1 bAcc=30 {Bundle[mParcelledData.dataSize=96]}]
2022-03-24 08:37:58.640 18168-18168/cn.kt.app D/MyLocationObserver: Location[gps 50.219998,128.219998 hAcc=5 et=+19075d0h37m58s639ms etAcc=+1ms alt=0.0 vel=0.0 bear=0.0 vAcc=1 sAcc=1 bAcc=30 {Bundle[mParcelledData.dataSize=96]}]
2022-03-24 08:38:09.564 18168-18168/cn.kt.app D/MyLocationObserver: Location[gps 80.109998,128.219998 hAcc=5 et=+19075d0h38m9s562ms etAcc=+1ms alt=0.0 vel=0.0 bear=0.0 vAcc=1 sAcc=1 bAcc=30 {Bundle[mParcelledData.dataSize=96]}]

4、使用 ProcessLifecycleOwner 监听应用程序生命周期

public class ApplicationObserver implements LifecycleObserver {

    private static final String TAG = "ApplicationObserver";

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    private void onCreate() {
        Log.i(TAG, " onCreate ");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    private void onAppForeground() {
        Log.i(TAG, " app moved to foreground");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    private void onAppBackground() {
        Log.i(TAG, " app moved to background");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    private void onDestroy() {
        Log.i(TAG, " onDestroy ");
    }
}
public class BaseApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        ProcessLifecycleOwner.get().getLifecycle().addObserver(new ApplicationObserver());
    }
}