android:如何确保我的应用程序在 运行 处于后台时不会暂停

android: how to make sure my app doesnt get paused when running in the background

Android 我正在开发的应用程序使用蓝牙从附近的信标(设备)读取数据。当应用程序在前台时它工作正常(测试了 20 分钟)。但是,应用程序进入后台后几分钟就会停止读取。

我注意到当应用程序进入后台时,会执行 onpause() 方法;我的应用程序仍然读取了几分钟,然后就停止读取任何内容(当我手动将应用程序调到前台时,oncreate 方法被执行并且应用程序正常连续运行)。

为什么我的应用程序在进入后台几分钟后停止读取。我的应用程序是 activity 而不是服务。

  1. 应该将 activity 转换为服务或
  2. 我应该创建 intentservice 还是
  3. 我应该创建 foregroundserive

我不明白以上三种服务的区别,不知道它们是否对我有帮助。

虽然线程稍旧,但我回顾了 Prevent that the app get stopped or paused by the OS and How can we prevent a Service from being killed by OS? and my app killed by android system when it running in background

但是我迷路了。任何讨论表示赞赏

编辑

据我从@davidgyoung 的回答中了解到,我必须编写一个服务。我假设我的应用程序的 GUI 部分进入 mainactivity;那么我如何确保我的 mainactivity/GUI 在内存中仍然处于活动状态并且在服务尝试 broadcast/notify GUI

时没有被 Android 杀死

/编辑

Activity 并非设计用于在后台长时间 运行。 Android OS 会破坏不可见的活动,因为其他功能需要记忆。虽然 a 服务是合适的选择,但即使是服务也会在内存压力下被 OS 销毁,所以 如果它仍然需要重新启动服务被 OS 杀死,你继续想要进行信标扫描。

当我们构建 Android Beacon Library 时,所有这些问题都出现了,我们确定了这些解决方案来继续扫描:

  • 使用服务在后台扫描信标。它不一定是 IntentService,但这是一个合理的选择。

  • 使用AlarmManager 5 分钟后重新启动扫描服务,以防它被杀死。 (此延迟允许 OS 有时间从临时需要额外内存中恢复。)如果扫描服务仍在 运行ning,只需重新安排警报。

  • 注册 OS 级事件(启动、电源 connect/disconnect),以便在用户使用任务切换器终止应用程序后重新启动扫描服务。

如果您决定使用 Android 信标库,那么所有这些都是为您构建的(我们也欢迎贡献!)如果您想自己动手,您可能需要 look at the source code 看看这些东西是如何建造的。也可以随意复制和修改。这就是开源的魅力!

完全披露:我是 Android Beacon Library 开源项目的首席开发人员。