首页 > 解决方案 > 如何从 android 库中了解应用程序生命周期

问题描述

我正在寻找一种优雅的方式来监视应用程序的生命周期,因为我正在开发需要注册一些侦听器的 SDK。当应用程序进入后台或不可见并且我的库不知道应用程序的生命周期时,我想取消注册监听器。

例如,当应用程序进入后台时,我想通过unregister侦听器停止 sensorEvent。但是,我不想让我的消费者从我的 SDK 中显式调用另一个方法来从他们的主机应用程序级别启动/停止服务。

我想过使用Lifecycle Arch Components,但似乎我仍然需要让消费者调用addObserver主机级别的方法来观察。此外,我的库被包装在另一个可能有也可能没有生命周期状态的 SDK 中。

通用SDK在不询问主机应用程序级别显式调用注册/取消注册方法的情况下监听生命周期事件的更好方法是什么?

标签: androidandroid-lifecycle

解决方案


您可以使用Android 架构组件的Lifecycle模块将轻量级生命周期感知添加到您自己的库/应用程序中。

事实上,这就是 Support Library 类(如FragmentActivity等)所依赖的。更具体地说,您只需要将 Lifecycle 依赖项包含到您的库中,这样就可以添加组件,而不会使用and使Lifecycle您的库膨胀。LivedataViewModel

现在,使用该Lifecycle组件,您可以执行以下操作:

// using commom-java8 module
public class Falcon implements DefaultLifecycleObserver {

  public Falcon(@NotNull LifecycleOwner lifecycleOwner){
    // your initialization code

    lifecycleOwner.getLifecycle().addObserver(this); // register our instance
  }

  // Now you can selectively override lifecycle callbacks that you are
  // interested in and the Lifecycle component will take care of calling
  // them at appropriate time


  @Override public void onCreate(@NonNull LifecycleOwner owner){
    // library logic here
  }      
}

然后,您图书馆的消费者可以做类似的事情

public SpaceXDashboardActivity extends AppCompatActivity {

  @Override
  public void onCreate(@Nullable Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    // usual code....

    Falcon falcon = new falcon(this /* LifecycleOwner */);
  }
}

通过这种方式,您可以让您的 Android 库了解组件的生命周期,同时提供对实际组件的重要抽象,并防止内存泄漏!

请注意,此解决方案要求您使用对 Android 的新 Java 8 语言支持,并且还要求您的库的使用者使用(至少)版本 26.1.0 的 SupportLibrary。

如果您无法满足上述任何限制,您也可以尝试此 Medium 帖子中显示的解决方案


推荐阅读