Android P(api 28) 监听Activity生命周期:全局监听和局部监听


全局监听

在 api 28之前, 使用 android.app.Application.ActivityLifecycleCallbacks 监听 Activity 的生命周期。它始于 api 14(android 4.0)。从它的包名可以看出,它是 Application 级的监听接口。需要在 Application 中通过registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback) 、 unregisterActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback) 进行注册与反注册。
由于是全局性的,所以写些全局性的代码较为合适。


局部监听

用到 jetpack 中的架构组件 Lifecycles

配置

  1. androidx.appcompat 配置
    对于使用 androidx 库,来使用兼容性的 androidx 包下的 Fragment 或 AppCompatActivity,都可以在它们内部,通过 getLifecycle() ,获取到的是 androidx.lifecycle.Lifecycle

androidx 还太新了,各种开源类库支持的力度不够。用了它,可能会有各种麻烦问题出现。

  1. support-appcompat 配置
    不用 androidx ,还是采用 com.android.support:appcompat-v7:28.0.0 这样的配置。
    同样的,通过兼容性的 support-v4下的Fragment 或 support-v7中的 AppCompatActivity,都可以在它们内部,调用 getLifecycle() ,获取到的是android.arch.lifecycle.Lifecycle
    所以需要另引入 android.arch.lifecycle:extensions:1.1.1

使用

如上,获取 Lifecycle,就可以 添加观察者:addObserver(LifecycleObserver observer),在适当时 移除观察者removeObserver(LifecycleObserver observer)
由于 LifecycleObserver 是一个空接口,没有任何抽象方法,要求自实现它,并添加 有android.arch.lifecycle.OnLifecycleEvent注解的抽象方法。如:

import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.LifecycleObserver;
import android.arch.lifecycle.OnLifecycleEvent;

/**
 * desc     :
 * author   : stone
 * email    : [email protected]
 * time     : 2019/3/6 12 17
 */
public interface LifecycleCallback extends LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    void onCreate();

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    void onStart();

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    void onResume();

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    void onPause();

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    void onStop();

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    void onDestroy();

    @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
    void onAny();
}

这样,就能在相应的生命周期方法中处理自己的逻辑了。

注意:

  1. 如上,使用的是观察者模式。可以添加多个观察者 LifecycleObserver 实例。
  2. 局部监听方式,也可以运行在低版本的设备上的;只是要求编译配置版本是 28,support-v7版本是28

发布了400 篇原创文章 · 获赞 364 · 访问量 162万+

猜你喜欢

转载自blog.csdn.net/jjwwmlp456/article/details/89750174
今日推荐