Android 中的后台服务被杀死

2024-02-24

我们开发了一个 Android 应用程序,其中涉及后台服务。为了实现这个后台服务,我们使用了IntentService。我们希望应用程序每隔一段时间轮询一次服务器60 seconds。所以在IntentService,在 while 循环中轮询服务器。在 while 循环的末尾我们使用了Thread.sleep(60000)以便下一次迭代仅在 60 秒后开始。
但在Logcat,我发现有时应用程序需要 5 分钟以上才能唤醒(从睡眠中醒来并开始下一次迭代)。从来都不是1 minute正如我们所希望的那样。

这是什么原因呢?后台服务是否应该以不同的方式实现?

Problem2

Android 会在一段时间后杀死这个后台进程(意图服务)。不能具体说是什么时候。但有时后台服务会被杀死几个小时甚至几天。如果您能告诉我原因,我将不胜感激。因为服务不应该被杀死。只要我们愿意,它们就会在后台运行。

Code :

@Override
 protected void onHandleIntent(Intent intent) {
  boolean temp=true;
  while(temp==true) {
    try {
      //connect to the server 
      //get the data and store it in the sqlite data base
    }
    catch(Exception e) {
      Log.v("Exception", "in while loop : "+e.toString());
    }
    //Sleep for 60 seconds
    Log.v("Sleeping", "Sleeping");
    Thread.sleep(60000);
    Log.v("Woke up", "Woke up");

    //After this a value is extracted from a table
    final Cursor cur=db.query("run_in_bg", null, null, null, null, null, null);
    cur.moveToLast();
    String present_value=cur.getString(0);
    if(present_value==null) {
       //Do nothing, let the while loop continue  
    }
    else if( present_value.equals("false") || present_value.equals("False") ) {
       //break out of the while loop
       db.close();
       temp=false;
       Log.v("run_in_bg", "false");
       Log.v("run_in_bg", "exiting while loop");
       break;
    }
  }

}

但是,每当服务被终止时,都会发生在进程处于睡眠状态时。最后一条日志写着——Sleeping : Sleeping。为什么服务会被杀死?


主要问题是我们不能说

服务并不意味着被杀死。只要我们愿意,它们就会在后台运行。

基本上,事实并非如此。系统仍然可以在内存不足和其他可能的情况下终止服务。 有两种方法可以克服这个问题:

  1. 如果您正在实施该服务,请覆盖onStartCommand()并返回START_STICKY作为结果。它会告诉系统,即使由于内存不足而想要终止您的服务,也应该在内存恢复正常后立即重新创建它。
  2. 如果您不确定第一种方法是否有效 - 您必须使用 AlarmManagerhttp://developer.android.com/reference/android/app/AlarmManager.html http://developer.android.com/reference/android/app/AlarmManager.html。这是一个系统服务,它将在您通知时执行操作,例如定期执行。这将确保如果您的服务将被终止,甚至整个进程将终止(例如强制关闭) - AlarmManager 将 100% 重新启动。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 中的后台服务被杀死 的相关文章

随机推荐

  • 将一个元素绑定到两个源

    我目前有两个接受任何数字的文本框 我有一个文本块 它接受输入的两个数字并计算平均值 我想知道是否有一种方法可以将此文本块绑定到两个文本框并利用自定义转换器来计算平均值 我目前正在捕获两个文本框中的文本更改事件并以这种方式计算平均值 但我假设
  • 没有安装的配置文件与安装的 iOS 代码签名密钥匹配

    当我选择 iphone 设备并构建时 它显示 xamarin ios 的错误 错误 555 没有安装的配置文件与安装的 iOS 代码签名密钥匹配 请帮助解决这个问题 尝试以下步骤重新安装证书和配置文件 去苹果会员中心 http develo
  • 如何使用 Spring JPA 对 jsonb 列进行查询?

    我正在使用 Spring JPA 和 PostgreSQL 数据库 我有一个实体如下 Entity TypeDef name json binary typeClass com vladmihalcea hibernate type jso
  • 更改 Kivy 中按钮的背景颜色

    我是 Kivy 的新手 在指定按钮的背景颜色时遇到困难 这是我的简单例子 custombutton py from kivy app import App from kivy uix widget import Widget class M
  • 获取 .Net 中 CryptoStream 的长度

    我正在开发加密 解密文件的软件 我希望能够猜测加密后数据的长度 但我无法使用 CryptoStream Length 它会抛出 NotSupportedException 有什么办法可以猜出来吗 我正在使用 RijndaelManaged
  • 带有尾部斜杠的奇怪 Nginx 行为

    我有一个非常有趣的行为 我想避免在我的网站上的 URL 中出现尾随斜杠 我已经把rewrite 1 permanent 规则进入我的服务器块 所以 https example com something https example com
  • C# 命名管道流 readline 挂起

    我很困惑 我有命名管道的客户端 服务器结构 问题出在某个随机点 经过一段时间的工作后 它只是挂在streamReader ReadLine 上 它只是停下来 不再继续 我很困惑 我根本不知道发生了什么 也不知道如何调试它 为什么以及何时发生
  • 使用VBA将字符串分成Excel中的不同单元格

    例如 我有一个名为 str 的字符串变量 该 str 的值为 apple orange pineapple 每个单词由一个新的 VbLine 分隔 我想把它移到细胞上 A1 包含apple A2 包含orange并且A3包含pineappl
  • asp.net mvc Html.ActionLink() 保留我不想要的路由值

    我认为有以下 ActionLink 它创建以下 URLhttp mywebsite com Controller Action http mywebsite com Controller Action 假设我在末尾添加一个 ID 如下所示
  • 安全地发布网站构建后的最佳方法是什么?

    那么 根据您的经验 最好的方法是什么 是否有一种安全的方法可以在构建自动化工具中编写脚本 触发 编辑 我应该提到这是 windows net 我将部署到 iis6 对于我使用的一些项目卡皮斯特拉诺 http www capify org 推
  • iPhone SDK:自定义视频播放器控件

    在我的 iPhone 应用程序中 我设计了一个自定义视频播放器 目前它非常基本 只有一个播放暂停和停止按钮 但我希望用户能够像使用苹果原始媒体播放器一样擦除视频 我认为这是正确的词 例如 如果您明白我的意思 我希望能够使用 UISlider
  • 删除数据框中不常见的行

    假设我有一个非常简单的数据框 a lt rep 5 30 b lt rep 4 80 d lt rep 7 55 df lt data frame Column c a b d 最会是什么generic删除所有出现次数少于 60 次的行的方
  • 如何在 Qt 中的小部件下绘制阴影?

    我想知道如何在 Qt 中的小部件 不是主小部件 例如标签 下绘制阴影 我需要使用样式表还是需要对其进行编码 用 C 假设您有一个表单和一个标签 想要从中投射阴影 您可以使用QGraphics 阴影效果 http qt project org
  • 在 LINQ 2 SQL 中不先选择数据就进行更新?

    如何在不先在 LINQ 中选择数据的情况下更新记录 由于您必须首先执行 linq select 显然会调用成本高昂的 SQL SELECT 因此更改所需的属性 然后执行 SubmitChanges 我希望避免这种情况 只执行 SQL UPD
  • Hibernate 全局“动态插入”

    有没有办法设置dynamic insertHibernate 全局属性 因此它将是所有实体的默认值 在 NHibernate 中是 foreach var clazz in config ClassMappings clazz Dynami
  • 在 WSL2 上运行的 Jupyter 实验室网络错误

    我在 WSL2 Ubuntu 上运行 Jupyter Lab 并在 Win10 PC 上的 Firefox 中访问它 它们在同一台机器上运行 因此不应该涉及 网络 我正在运行它jupyter lab no browser 服务器在终端中启动
  • 传递函数作为参数?

    这是我的事件 正如您所看到的 我想发送一个以它作为参数的函数 onclick deleteItems image size function GetImageSize 删除函数在js文件中 在我的 js 文件中 我想调用 GetImageS
  • 各组最新值的总和

    对于我的每一行数据 我想计算最近的总和value对于每个group dt data table group c a b a a b a value c 10 5 20 15 15 10 desired c 10 15 25 20 30 25
  • >>'运算符[重复]' aria-label='Java中无符号右移'>>>'运算符[重复]'> Java中无符号右移'>>>'运算符[重复]

    这个问题在这里已经有答案了 可能的重复 为什么 1 gt gt gt 32 1 https stackoverflow com questions 4813909 why is 1 32 1 无符号右移运算符在最左边插入 0 所以当我这样做
  • Android 中的后台服务被杀死

    我们开发了一个 Android 应用程序 其中涉及后台服务 为了实现这个后台服务 我们使用了IntentService 我们希望应用程序每隔一段时间轮询一次服务器60 seconds 所以在IntentService 在 while 循环中