Android

Android JetPack学习总结(四)

LifeCycle

通过lifeCycle让我们自己创建的类的对象来观察activity的生命周期,根据观察的结果来执行对应的功能。

原先我们要在进入activity视图或者离开时对一些对象进行操作时都需要在activity的生命周期方法中进行响应的修改,例如一个简单的时钟计数器,如果离开这个界面就暂停计数,回到这个界面时恢复计数:

public class MainActivity extends AppCompatActivity {

    Chronometer chronometer;

    private long elapsedTime;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        chronometer=findViewById(R.id.meter);
        chronometer.setBase(SystemClock.elapsedRealtime());
        chronometer.start();

    }

    @Override
    protected void onPause() {
        super.onPause();
        elapsedTime=SystemClock.elapsedRealtime()-chronometer.getBase();
        chronometer.stop();
    }

    @Override
    protected void onResume() {
        super.onResume();
        chronometer.setBase(SystemClock.elapsedRealtime()-elapsedTime);
        chronometer.start();
    }
}

如果一个activity中有很多个组件需要我们去处理生命周期切换时发生的动作,那么显然是极其臃肿的,利用LifeCycle可以将对生命周期的处理转移到组件本生中去。

自定义时钟类,继承LifecycleObserver接口

这个接口能够使得这个时钟类能感应到生命周期的变化,并在对应时刻做出相应地处理。

public class MyChronometer extends Chronometer implements LifecycleObserver {

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

    
}
用注解来监听生命周期变化
public class MyChronometer extends Chronometer implements LifecycleObserver {

    private long elapsedTime;

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

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

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    private void resumeMeter(){
        setBase(SystemClock.elapsedRealtime()-elapsedTime);
        start();
    }
}
在activity中把该时钟添加观察者
public class MainActivity extends AppCompatActivity {

    MyChronometer chronometer;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        chronometer=findViewById(R.id.meter);
        getLifecycle().addObserver(chronometer);
    }

}

发表评论