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);
}
}
实现效果如下:
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());
}
}