我正在开发的 Android 应用程序使用蓝牙从附近的信标(设备)读取数据。当应用程序位于前台时,它工作正常(测试了 20 分钟)。然而,应用程序进入后台几分钟后,它就会停止读取。
我注意到当应用程序进入后台时,会执行 onpause() 方法;我的应用程序仍然读取几分钟,然后停止读取任何内容(当我手动将应用程序带到前台时,执行 oncreate 方法并且应用程序正常连续)。
为什么我的应用程序在进入后台几分钟后就停止读取了。我的应用程序是一项 Activity ,而不是服务。
- 应将 Activity 转换为服务或
- 我应该创建intentservice还是
- 我应该创建foregroundservive
我不明白上述 3 种服务之间的区别以及其中是否有任何对我有帮助。
虽然线程稍旧,但我回顾了 Prevent that the app get stopped or paused by the OS和 How can we prevent a Service from being killed by OS?和 my app killed by android system when it running in background
但是我迷路了。欢迎任何讨论
编辑
据我从@davidgyoung 的回答中了解到,我必须编写一项服务。我假设我的应用程序的 GUI 部分进入了 mainactivity;那么我如何确保我的 mainactivity/GUI 在内存中仍然处于 Activity 状态,并且在服务尝试广播/通知 GUI 时未被 Android 杀死
/编辑
最佳答案
Activity 不适合在后台长时间运行。Android 操作系统会销毁不可见的 Activity,因为其他功能需要内存。虽然服务是正确的选择,但即使是服务也会在操作系统的内存压力下被销毁,因此如果服务被操作系统终止,您仍然需要重新启动该服务并且您仍然想要进行信标扫描。
所有这些问题都是在我们构建 Android Beacon Library 时出现的。 ,我们决定采用这些解决方案来继续扫描:
使用服务在后台扫描信标。它不一定是 IntentService,但这是一个合理的选择。
使用
AlarmManager
在未来 5 分钟重新启动扫描服务,以防它被终止。 (这种延迟使操作系统有时间从临时需要的额外内存中恢复过来。)如果扫描服务仍在运行,只需重新安排警报即可。注册操作系统级别事件(启动、电源连接/断开),以便在用户使用任务切换器终止应用程序后重新启动扫描服务。
如果您决定使用 Android Beacon 库,那么所有这些都是为您构建的(我们也欢迎贡献!)如果您想推出自己的 Beacon 库,您可能需要 look at the source code看看这些东西是如何 build 的。也可以随意复制和修改。这就是开源的魅力!
全面披露:我是 Android Beacon Library 开源项目的首席开发人员。
关于android:如何确保我的应用程序在后台运行时不会暂停,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36673927/