android Jetpack应用实战(一)-Lifecycle

文章介绍了如何使用Jetpack中的Lifecycle组件来管理Activity和Service的生命周期,通过观察者模式解耦代码。作者详细讲解了添加Gradle依赖、实现LifecycleEventObserver以及在Activity和Service中应用的例子,强调了Lifecycle在减少代码冗余和提高可维护性方面的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Jetpack已经出来好几年了,之前因为项目的原因会偶尔使用Jetpack 里面的组件,发现真的很优秀的设计,自己也一直没时间(就是懒)没有系统性的学习,所以准备系统性学习下,记录自己的学习心得.

1,加gradle 配置

官网有介绍,导入下面的包,不然用不了,本文只要用到Lifecycles 相关的,因为后面文章也需要,就一起介绍了

https://developer.android.com/jetpack/androidx/releases/lifecycle?hl=zh-cn#groovy

dependencies {
        def lifecycle_version = "2.5.1"
        def arch_version = "2.1.0"

        // ViewModel
        implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
        // LiveData
        implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"
        // Lifecycles only (without ViewModel or LiveData)
        implementation "androidx.lifecycle:lifecycle-runtime:$lifecycle_version"

        // Saved state module for ViewModel
        implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:$lifecycle_version"

        // Annotation processor
        annotationProcessor "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
        // alternately - if using Java8, use the following instead of lifecycle-compiler
        implementation "androidx.lifecycle:lifecycle-common-java8:$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"

        // optional - ReactiveStreams support for LiveData
        implementation "androidx.lifecycle:lifecycle-reactivestreams:$lifecycle_version"

        // optional - Test helpers for LiveData
        testImplementation "androidx.arch.core:core-testing:$arch_version"

        // optional - Test helpers for Lifecycle runtime
        testImplementation "androidx.lifecycle:lifecycle-runtime-testing:$lifecycle_version"
    }

2,LifeCycle

为什么要使用LifeCycle?

我们经常在Activity Service 等生命周期内处理一下初始化,关闭一些功能的操作,造成这些组件代码越来越雍宗,耦合度太高,为此,LifeCycle 这个组件就可以发挥作用了

原理:观察者模式

Activity

通过阅读源码我们发现,Activity 已经帮我们实现了被观察者的代码

public class FragmentActivity extends ComponentActivity implements
        ActivityCompat.OnRequestPermissionsResultCallback,
        ActivityCompat.RequestPermissionsRequestCodeValidator {
  
    /**
     * A {@link Lifecycle} that is exactly nested outside of when the FragmentController
     * has its state changed, providing the proper nesting of Lifecycle callbacks
     * <p>
     * TODO(b/127528777) Drive Fragment Lifecycle with LifecycleObserver
     */
    final LifecycleRegistry mFragmentLifecycleRegistry = new LifecycleRegistry(this);

      @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        //....
        mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
     
    }

      @Override
    protected void onDestroy() {
        //....
        mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY);
    }

     @Override
    protected void onPause() {
        //....
        mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE);
    }

    protected void onResumeFragments() {
        mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
        
    }

     @Override
    protected void onStart() {
         // .......
        mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
    }
    
  @Override
    protected void onStop() {
        // .......
        mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP);
    }

}

你所要做的事情,就是添加自己的观察者就可以了

实现自己的观察者

public class MyTaskListener implements LifecycleEventObserver {

    private String TAG = "MyTaskListener";

    public MyTaskListener() {
    }

    @Override
    public void onStateChanged(@NonNull @NotNull LifecycleOwner source, @NonNull @NotNull Lifecycle.Event event) {

        Log.d(TAG,event.name()+","+event.toString());

    }
}

Activity 中添加观察者

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {


        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MyTaskListener myTaskListener = new MyTaskListener();

        getLifecycle().addObserver(myTaskListener);

    }
}

打印log,我们只要在观察者里面做特定的逻辑即可,Activity 只需要处理UI 即可,Fragment 同理

com.sim.testlifecycle D/MyTaskListener: ON_CREATE,ON_CREATE

com.sim.testlifecycle D/MyTaskListener: ON_START,ON_START

com.sim.testlifecycle D/MyTaskListener: ON_RESUME,ON_RESUME

//下面是熄屏的周期

com.sim.testlifecycle D/MyTaskListener: ON_PAUSE,ON_PAUSE

com.sim.testlifecycle D/MyTaskListener: ON_STOP,ON_STOP

Service

同Activity 一样,不在重复介绍

应用程序的生命周期

作用:判断应用程序处于前台或者后台的状态监听

监听者同Activity 一致

public class MyApplicationObser implements LifecycleEventObserver {
    private String TAG = "MyApplicationObser";

    @Override
    public void onStateChanged(@NonNull @NotNull LifecycleOwner source, @NonNull @NotNull Lifecycle.Event event) {
        Log.d(TAG,event.name()+","+event.toString());
    }
}

注册的方式有一些改变

public class MyApplication extends Application {

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

应用到前台的时候

2023-03-22 09:10:23.572 15961-15961/com.sim.testlifecycle D/MyApplicationObser: ON_START,ON_START

2023-03-22 09:10:23.585 15961-15961/com.sim.testlifecycle D/MyApplicationObser: ON_RESUME,ON_RESUME

应用到后台的时候

2023-03-22 09:10:24.387 15961-15961/com.sim.testlifecycle D/MyApplicationObser: ON_PAUSE,ON_PAUSE

2023-03-22 09:10:24.388 15961-15961/com.sim.testlifecycle D/MyApplicationObser: ON_STOP,ON_STOP

Ps:ON_CREATE 之后调用一次,就是应用创建的时候

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值