如何从android库中了解应用程序生命周期

时间:2018-05-05 00:05:44

标签: android android-lifecycle

我正在寻找一种优雅的方式来监控应用程序的生命周期,因为我正在开发一个需要注册一些监听器的SDK。当应用程序转到后台或不可见时,我想取消注册监听器,而我的库对应用程序的生命周期没有任何意识。

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

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

一般SDK在没有要求主机应用程序级别显式调用register / unregister方法的情况下监听生命周期事件的更好方法是什么?

2 个答案:

答案 0 :(得分:0)

使用Activity Lifecycle Callbacks。您可以执行诸如提供执行注册的基础Application类,然后客户端应用程序只需扩展您的Application基类。

我认为有一种方法可以通过让客户端应用程序简单地包含您的lib来实现它。至少需要一些编译时插件重写客户端的字节码来调用你的代码。我不确切知道你是怎么做到的。

答案 1 :(得分:0)

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

实际上,这就是支持库类(如FragmentActivity等)所依赖的内容。更具体地说,您只需要将生命周期依赖项包含到您的库中,这样就可以添加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语言支持,并且它还要求您的库的使用者使用(至少)SupportLibrary版本26.1.0。

如果您无法满足上述任何约束条件,您还可以尝试显示on this Medium post

的解决方案