android - 如何从 android 库中了解应用程序生命周期
问题描述
我正在寻找一种优雅的方式来监视应用程序的生命周期,因为我正在开发需要注册一些侦听器的 SDK。当应用程序进入后台或不可见并且我的库不知道应用程序的生命周期时,我想取消注册监听器。
例如,当应用程序进入后台时,我想通过unregister
侦听器停止 sensorEvent。但是,我不想让我的消费者从我的 SDK 中显式调用另一个方法来从他们的主机应用程序级别启动/停止服务。
我想过使用Lifecycle Arch Components
,但似乎我仍然需要让消费者调用addObserver
主机级别的方法来观察。此外,我的库被包装在另一个可能有也可能没有生命周期状态的 SDK 中。
通用SDK在不询问主机应用程序级别显式调用注册/取消注册方法的情况下监听生命周期事件的更好方法是什么?
解决方案
您可以使用Android 架构组件的Lifecycle
模块将轻量级生命周期感知添加到您自己的库/应用程序中。
事实上,这就是 Support Library 类(如FragmentActivity
等)所依赖的。更具体地说,您只需要将 Lifecycle 依赖项包含到您的库中,这样就可以添加组件,而不会使用and使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 语言支持,并且还要求您的库的使用者使用(至少)版本 26.1.0 的 SupportLibrary。
如果您无法满足上述任何限制,您也可以尝试此 Medium 帖子中显示的解决方案
推荐阅读
- html - 将图标与文本大小对齐
- javascript - 将分叉存储库作为 react.js 依赖项导入时出错
- mysql - MYSQL concat char 使用 select 创建表名
- amazon-s3 - 有没有办法在使用 aws cloudformiohn deploy 进行部署时在 S3 Bucket 中指向 cloudformation 模板
- aframe - 如何在 A-Frame 中合并几何而不丢失材料信息?
- javascript - 悬停效果发生在所有文章上,而不仅仅是我悬停的文章
- javascript - 如何将淡入淡出添加到内部 HTML?
- reactjs - 无法在我的自定义域上打开 Google App Engine 应用程序
- caching - How to cache images from an API response
- javascript - SQL query based on select option