Android:单例实例与服务

标签 android android-service

在这里我想问一个我在写代码时找不到答案的基本问题。

据我了解,在应用程序 onCreate() 中创建单例实例比 android 服务更不容易受到攻击。在我的应用程序中,我想监听应该不太可能被破坏的位置更新。如果我保留服务,它可能会在低内存中被杀死,但应用程序可以在后台运行,这将保留实例。所以我想使用单例实例而不是服务。

这是正确的方法吗?

最佳答案

Android 可以(并且将会)在资源不足的情况下终止后台进程,有时也只是因为它想要这样做(特别是在低端设备上以节省电池和内存资源)。它通过杀死托管您的应用程序的操作系统进程来实现这一点。在这种情况下,您的应用将不再在后台运行,因此您在 Application.onCreate() 中创建的任何单例也将消失。

Android 对您的单例一无所知,因此没有理由恢复它。

但是,如果您创建一个 Service 并且该 ServiceonStartCommand() 返回 START_STICKY,这会告诉您的 Service 希望一直保持运行(如果可能)的 Android。在这种情况下,如果 Android 终止了托管您的 Service 的操作系统进程(由于资源限制,或者只是因为它想要),Android 将自动重启您的 Service(因为Android 知道您的 Service 并且知道它想要一直运行)。这是执行此操作的正确方法。

注意有些设备(特别是小米等中国设备,还有华为、LG、联想等)不会自动重启 STICKY 服务。这些设备维护一个允许在后台运行的“ protected 应用程序”或“特权应用程序”列表,Android 只会为该列表中的应用程序重启 STICKY 服务。您需要让您的用户手动将您的应用添加到此列表。无法以编程方式将您的应用程序添加到这些设备上的此列表中。

参见 https://stackoverflow.com/a/42120277/769265https://stackoverflow.com/a/41369032/769265

关于Android:单例实例与服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42853189/

相关文章:

安卓重复服务

android - 什么是 Android Binder "Transaction?"

Lollipop 上的android蓝牙路由

android - 如何在android蓝牙文件传输上检测EOF?

java - android studio 3 (linux pc) java 1.8 上的 API 22 5.1 sdk 设备

android - 适合 Android Imageview 矩阵屏幕中心

java - 无法实例化服务service.FetchAddressIntentService : java. lang.IllegalAccessException:不允许访问构造函数

android - 后台持久服务的Activity不会被kill掉

android - 如何选择哪个服务来处理 Intent

android - Android 版 OpenCV : Sample Project ClassNotFound Exception