我正在寻找一种优雅的方式来监控应用程序的生命周期,因为我正在开发一个需要注册一些监听器的SDK。当应用程序转到后台或不可见时,我想取消注册监听器,而我的库对应用程序的生命周期没有任何意识。
例如,当应用程序转到后台时,我想通过unregister
监听器停止sensorEvent。但是,我不想让我的消费者明确地从我的SDK中调用另一个方法来从他们的主机应用程序级别启动/停止服务。
我想过使用Lifecycle Arch Components
,但似乎我仍然需要让消费者在主机级调用addObserver
方法来观察。此外,我的库被包装在另一个SDK中,该SDK可能也可能没有生命周期状态。
一般SDK在没有要求主机应用程序级别显式调用register / unregister方法的情况下监听生命周期事件的更好方法是什么?
答案 0 :(得分:0)
使用Activity Lifecycle Callbacks。您可以执行诸如提供执行注册的基础Application
类,然后客户端应用程序只需扩展您的Application
基类。
我认为有一种方法可以通过让客户端应用程序简单地包含您的lib来实现它。至少需要一些编译时插件重写客户端的字节码来调用你的代码。我不确切知道你是怎么做到的。
答案 1 :(得分:0)
您可以使用 Android架构组件Lifecycle
module 将轻量级生命周期感知添加到您自己的库/应用中。
实际上,这就是支持库类(如FragmentActivity
等)所依赖的内容。更具体地说,您只需要将生命周期依赖项包含到您的库中,这样就可以添加Lifecycle
组件而不会使您的库充满Livedata
和ViewModel
。
现在,使用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
的解决方案