如何创建dalvik不会杀死的android服务?

时间:2014-05-29 18:18:35

标签: java android service foreground wakelock

在我开始提问之前,我想先写下这个问题:我知道这是一个不好意思强迫服务永远运行......我根本就不在乎。

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

好吧,我有这个未使用的HTC Sensation运行4.0.3(ICS),我已经自愿前往当地剧院完成任务。任务是在节目中需要它的时候响铃。我们不想要一张SIM卡,因为有人可能会在节目播放期间不小心打电话给电话。

所以我创建了一个虚假的手机应用程序,它通过TCP从我设置的服务器接收信号,以便通过LAN向设备发送信号。现在我让侦听器在服务中的无限循环中运行。但是,我仍然遇到无法响应TCP信号的服务。

我真的很感激,如果一些Android大师可以给我一些提示/技巧,使这项服务尽可能可靠,好/坏编码技术除了我想尽一切可能使这项服务无法收回。这款手机现在只有一个工作,那就是一直在监听收到的信息,无论如何。

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

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

你们能想到的其他任何东西?

3 个答案:

答案 0 :(得分:2)

无法确保Android永远不会终止服务。如果你把它作为前台服务,它会减少几率,但是你无法保证它。

答案 1 :(得分:2)

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

使用它和startForeground()方法可能有效。

亲切的问候

答案 2 :(得分:0)

基于服务javadoc的这句话......

  

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

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

要添加其他级别的可靠性,请使用此文档作为指南,在您的活动中保持唤醒锁定: 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();