【问题标题】:How can I create an android service that dalvik will not kill?如何创建 dalvik 不会杀死的 android 服务?
【发布时间】:2014-07-19 08:44:29
【问题描述】:

在我开始我的问题之前,我想先说一句:我知道强制服务永远运行是个坏主意...我根本不在乎。

此应用程序不供消费者使用。它不会在应用商店上架。它仅供我使用。

好的,我有这个未使用的运行 4.0.3 (ICS) 的 HTC Sensation,我自愿将它送到当地剧院执行任务。任务是让它在节目需要时随时响起。我们不希望里面有 sim 卡,因为有人可能会在演出期间意外拨打电话,而电话本不应该响铃。

因此,我创建了一个假电话应用程序,该应用程序通过 TCP 从服务器接收信号,该服务器已设置为通过 LAN 向设备发送信号。现在我让监听器在服务中无限循环运行。但是,我仍然遇到服务没有响应 TCP 信号。

如果一些 android 专家可以给我一些提示/技巧,使这项服务尽可能可靠,我将不胜感激,除了好的/坏的编码技术之外,我想尽一切可能使这项服务无法被杀死。这款手机现在只有一项工作,那就是始终监听传入的消息,无论如何。

到目前为止我做过的事情:

创建了一个服务(并从该服务启动了一个单独的线程) 使用 startForeground(id, notification); 激活 DeviceAdmin 并创建唤醒锁

你们还能想到什么?

【问题讨论】:

  • stackoverflow.com/questions/3856767/… 但不能保证? Android 知道这不应该在消费类设备上完成,因此他们并不真正支持它。
  • 我目前正在使用 startForeground()。我希望可以使用任何其他设置。
  • 为什么需要成为服务?对于一个只需要欺骗观众的假电话应用来说,一个活动就可以了,你可以让它在前台运行。
  • @x-code - 你的评论有点被打断了,但猜猜你在问什么,它需要是一项服务,因为应用程序需要在任意时间远程启动两小时的表演。
  • @user 对不起,我在句子中间按了发帖按钮。现在应该修好了。

标签: java android service foreground wakelock


【解决方案1】:

我想到的第一个想法是设置一个 AlarmManager,它每 5 秒检查一次服务是否正在运行。 This describes a method to see whether a service is running。 如果服务没有运行,您可以重新启动它。

使用这个和 startForeground() 方法可能会起作用。

亲切的问候

【讨论】:

  • 这是个好主意。我也可以检查一些其他的东西。唯一的问题是重新建立 TCP 连接,因为服务器不知道电话已断开连接,它可能没有等待 socket.accept() 方法
  • AlarmManager 是永久进程吗?即我可以一直指望它运行吗?
  • AlarmManager 应该是永久性的,但会在应用程序关闭时停止接收器。你可以检查这个线程,它和你有类似的问题。 stackoverflow.com/questions/16274988/…
  • 如果我能让它运行并每隔 1 或 2 秒不断检查一次。然后,对 TCP 服务器进行一些修改(使其基于状态,而不是持久化)然后 AlarmManager 应该会形成一个漂亮的安全网,谢谢
【解决方案2】:

无法确保 Android 永远不会终止服务。如果您将其设为前台服务,则会降低几率,但您无法为其投保。

【讨论】:

  • 我相信我已经通过在我的服务的“onStart()”方法中调用方法“startForeground()”来做到这一点。除非你指的是别的东西?
【解决方案3】:

基于来自 Service javadoc 的引用...

与服务在同一进程中运行的其他应用程序组件(例如 Activity)当然可以提高整个进程的重要性,而不仅仅是服务本身的重要性。

...如果您将启动服务的活动留在前台,这几乎可以保证服务不会停止[我发表了一条评论,开始暗示这个可能已被切断的想法。]

要增加另一个级别的可靠性,请在您的活动中保持唤醒锁定,使用此文档作为指南: https://developer.android.com/reference/android/os/PowerManager.WakeLock.html

示例代码:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
wl.acquire();
// ..screen will stay on during this section..
wl.release();

【讨论】:

  • 谢谢你,我相信我确实把它留在了前台。我对 android 还很陌生,但我相信即使在屏幕被锁定后,活动仍然在前台,只要没有其他活动被正确访问?
  • 不,这很好,因为如果设备锁定,锁定屏幕将成为前台活动。您可以通过保持唤醒锁来防止设备锁定。
猜你喜欢
  • 1970-01-01
  • 2023-03-16
  • 2011-10-14
  • 1970-01-01
  • 2015-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-17
相关资源
最近更新 更多