Android

Jeppack之lifecycle

使用lifecycle解耦页面和组件

对于一个需要在activity生命周期的某个阶段执行响应操作的组件,可以让其实现LifecycleObserver接口,并通过注解的方式,在响应的阶段进行操作:

public class MyChronometer extends Chronometer implements LifecycleObserver {

private long elapsedTime;

public MyChronometer(Context context, AttributeSet attrs) {
super(context, attrs);
}

@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
private void startMeter(){
setBase(SystemClock.elapsedRealtime() - elapsedTime);
start();
}

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

并在activity中注册:

public class MainActivity extends AppCompatActivity {

    ActivityMainBinding binding;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding= DataBindingUtil.setContentView(this,R.layout.activity_main);
        getLifecycle().addObserver(binding.chronometer);
    }
}

使用LifecycleService解耦Service与组件

执行的操作放在一个实现了LifecycleObserver接口的观察者中:

public class MyLocationObserver implements LifecycleObserver {
private Context context;
private MyLocationListener listener;
private LocationManager locationManager;
private static String TAG="shopkeepertag";

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

@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
private void startGetLocation() {
Log.d(TAG, "startGetLocation: ");
locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
listener = new MyLocationListener();
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3000, 1, listener);
}

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

static class MyLocationListener implements LocationListener{

@Override
public void onLocationChanged(@NonNull Location location) {
Log.d(TAG, "onLocationChanged: "+location.toString());
}
}
}

service要继承自LifecycleService,并注册一个观察者:

public class MyLocationService extends LifecycleService {
public MyLocationService() {
Log.d("sk", "MyLocationService: ");
MyLocationObserver observer=new MyLocationObserver(this);
getLifecycle().addObserver(observer);
}
}

在activity中启动或者关闭服务时,观察者类就能自动执行操作。

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

在Application的不同生命周期要执行的操作用注解的方式放在一个实现了LifecycleObserver接口的观察者中:

public class ApplicationObserver implements LifecycleObserver {
private static String TAG="shopkeepertag";

@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
public void onCreated(){
Log.d(TAG, "onCreated: ");
}

@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onStart(){
Log.d(TAG, "onStart: ");
}

@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void onResume(){
Log.d(TAG, "onResume: ");
}

@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void onPause(){
Log.d(TAG, "onPause: ");
}

@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onStop(){
Log.d(TAG, "onStop: ");
}

@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroy(){
Log.d(TAG, "onDestroy: ");
}
}

在application通过ProcessLifecycleOwner注册一个观察者:

public class MyApplication extends Application {

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

发表评论