长时间运行的 Android“服务”

2023-12-26

我有一个 Android 应用程序,其中“活动”会触发在后台运行的长时间运行的操作。这些操作完成后与活动交互。我正在开发一个处理活动/长时间运行任务耦合的组件,负责销毁和重新创建活动。

现在该组件已作为 Android 服务实现。活动调用bindService并使用生成的IBinder来启动和跟踪任务。我决定不使用 startService,因为我更喜欢通过 Java 接口获得更丰富的 API。

现在问题来了。 Activity A 启动,绑定到服务并调用 serviceApi.runTask(...)。然后,活动 A 被销毁(例如,因为用户翻转手机)并重新创建为活动 A'。然后,A' 再次绑定到服务,宣布其存在,一切都应该运行良好。

除了我的服务被破坏。当 Activity A 被销毁时,它会解除与服务的绑定。 Android 发现不再有客户端,并终止该服务。创建活动 A' 时,会再次创建该服务,并且我会丢失旧服务拥有的所有内容。

我能看到的唯一解决方案是使用单例服务。然后它并不一定是一个 Android 服务,只是一个每个人都可以访问的实例。在 Android 中这会让人皱眉吗?有没有更好的设计来解决这个问题呢?


编辑:即使我调用 startService 然后绑定到它,也不能保证只要应用程序正在运行,服务实例就会存在。如果资源不足,Android 可能会终止粘性服务。终止该服务将导致应用程序出现故障,而我不能这样做。


即使我调用 startService 然后绑定到它,也无法保证只要应用程序正在运行,服务实例就会存在。

Correct.

如果资源不足,Android 可能会终止粘性服务。

也正确。所有“粘性”意味着 Android 可能会重新启动服务。

终止该服务将导致应用程序出现故障,而我不能这样做。

创建保证永远运行的服务是不可能的。对于初学者来说,用户可以随时摆脱你的服务,因为用户讨厌那些永远运行毫无意义的服务的开发人员。仅在极少数情况下才需要编写永久服务;否则,这只是草率的编程。

我能看到的唯一解决方案是使用单例服务。然后它并不一定是一个 Android 服务,只是一个每个人都可以访问的实例。在 Android 中这会让人皱眉吗?

当进程终止时,单例(也称为静态数据成员)将消失。该进程最终将终止,特别是如果没有活动服务并且您的任何活动都不在前台的话。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

长时间运行的 Android“服务” 的相关文章

随机推荐

  • 在 Heroku 上安装 PyODBC 时找不到 sql.h

    我正在尝试在 Heroku 上安装 PyODBC 但我得到fatal error sql h No such file or directorypip 运行时的日志中 我该如何修复这个错误 要跟进下面的答案 Ubuntu 的示例 sudo
  • Azure Functions RunOnStartUp 在配置中设置而不是在编译时设置?

    我有一个 Azure 计时器触发函数 计划在生产中每 3 个月运行一次 然而 在测试环境中 我希望它在每次触发时在启动时运行 目前我有 TimerTrigger TimerInterval RunOnStartup false 我真的不想改
  • 使用 dplyr 和 rollapply 在数据框中滚动预测

    我的第一个问题在这里 我的目标是 给定一个带有预测变量的数据框 每列一个预测变量 行观察值 使用 lm 拟合回归 然后使用滚动窗口使用最后一个观察值来预测值 数据框如下所示 gt DfPredictor 1 40 Y X1 X2 X3 X4
  • 为什么人们一致推荐使用 appConfig 而不是使用设置文件? (。网)

    我经常看到这样的问题的答案 我应该如何在我的 NET 应用程序中存储设置 是通过手动向 app config 或 web config 添加条目来编辑 app config 文件 如下所示
  • 参数“ContactsCtrl”不是函数,未定义

    我在 AngularJS 路由和控制器中遇到问题 这是代码 索引 html div div index js var myApp angular module contacts
  • 水豚服务器和浏览器错误,服务器上没有任何痕迹

    由于某种原因 我的黄瓜测试之一似乎在 poltergeist 驱动程序和 Rails 服务器上都失败了 我得到了浏览器崩溃的完整跟踪信息 但服务器端几乎没有任何信息 当我打开水豚屏幕截图时 我只看到 内部服务器错误 未定义的方法name对于
  • 如何在ckeditor5中的`a`标签中添加“target”属性?

    我已经创建了自己的链接插件 现在我想添加一些其他属性a插件生成的标签 例如target rel 但我无法完成它 这是我的转换器插件代码 我应该添加哪些转换器以便a标签可以支持其他属性吗 license Copyright c 2003 20
  • C++ WinAPI 后台窗口截图

    我想截取没有焦点的窗口的屏幕截图 我的功能适用于某些窗口 但不适用于所有窗口 我不知道为什么 我尝试用它来捕获 Bluestacks App Player 的窗口 效果非常好 但对于 Nox App Player 和其他一些游戏来说 它根本
  • 简化具有重复关联类型限制的 where 子句

    我编写了以下函数来对迭代器求和 use std ops Add fn sum iter i s I init I Item gt I Item where I Iterator Clone i Item Add i i
  • Solr 字段崩溃

    I read http wiki apache org solr FieldCollapsing http wiki apache org solr FieldCollapsing 我尝试了查询 我并没有看到这个领域崩溃 我的意思是我看到了
  • SSRS 的自动化部署选项

    我的任务是研究如何自动化 SSRS 2012 报告的部署过程 有什么好的工具吗 我正在考虑类似按一个按钮 报告就会被部署的事情 Thanks 为了部署我们的 SSRS 报告 我们使用这个可爱的 powershell 项目 https git
  • std::reference_wrapper 和简单指针有什么区别?

    为什么需要有std reference wrapper http en cppreference com w cpp utility functional reference wrapper 应该用在哪里 它与简单的指针有什么不同 它的性能
  • 反应本机相机胶卷

    没有注意到太多关于如何使用 React Native 中的 CameraRoll 库的示例代码 指南 我发现文档中的示例有点 模糊 且令人困惑 我第一次使用任何 API 所以我也不完全理解我应该如何使用该库 到目前为止 我已经将其导入为 i
  • VBA,如果字符串包含某个字母

    我通常不与VBA我无法弄清楚这一点 我试图确定电子表格上的字符串中是否包含某个字母 Private Sub CommandButton1 Click Dim myString As String RowCount WorksheetFunc
  • 为什么 Chrome 无法检查 Docker 容器中的 NodeJS 代码?

    我尝试在 Docker 容器内启动简单的 NodeJS 服务器并使用 chrome inspect 或 WebStorm 对其进行调试 调试端口9229已绑定但检查不起作用 另一方面 当我在没有 docker 的情况下运行相同的代码时 我可
  • 使用 jsPDF rtl 支持将 Html 转为 pdf

    我正在尝试使用 Angular 5 将 html 转换为 pdf这是我的代码 import as jsPDF from jspdf htmlToPdf var doc new jsPDF var specialElementHandlers
  • 从多对多关系续集中选择

    我尝试从一个表中选择并引用另一个表 我在餐桌食品和餐桌配料之间存在多对多的关系 食品型号 module exports function sequelize DataTypes return sequelize define food id
  • 多次读取 Option<&mut T> 的引用

    我有一个Option lt mut T gt 并且想要多次访问包含的引用 如下所示 fn f a Option lt mut i32 gt if let Some x a x 6 if let Some x a x 7 fn main le
  • 如何使用PDF.JS显示整个PDF(不仅仅是一页)?

    我创建了这个演示 http polishwords com pl dev pdfjs test html http polishwords com pl dev pdfjs test html 它显示一页 我想显示所有页面 一个在另一个下
  • 长时间运行的 Android“服务”

    我有一个 Android 应用程序 其中 活动 会触发在后台运行的长时间运行的操作 这些操作完成后与活动交互 我正在开发一个处理活动 长时间运行任务耦合的组件 负责销毁和重新创建活动 现在该组件已作为 Android 服务实现 活动调用bi