【问题标题】:Using an AlarmManager to check periodically that my permanent service is running使用 AlarmManager 定期检查我的永久服务是否正在运行
【发布时间】:2013-04-29 09:12:55
【问题描述】:

我有一个Service,它应该与服务器保持永久连接,以便接收通知。对我的应用来说,及时从服务器获取消息至关重要。

我无法使用 GCM Push,因为连接将在本地网络中,并且手机可能没有任何互联网连接。我也知道在服务中保持永久连接的电池问题,但我会让用户选择此选项并通知他/她潜在的电池消耗(实际上,当设备始终处于相同状态时,该功能主要有意义连接到电源的地方)。我也知道Android系统可以随时杀死我的Service,甚至用户可以使用任务杀手来摆脱当时正在运行的所有服务。

也就是说,我考虑过定期使用AlarmManager 来检查我的Service 是否正在运行并重新启动它以防万一。我不相信这个选项,因为服务器可以在服务被杀死但还没有被AlarmManager重新启动后发送消息。

我的问题基本上是是否有更好的策略来确保我按时收到消息?

到目前为止,我能找到的所有相关信息都代表避免使用永久服务并使用其他东西,但由于我用例的性质,我没有其他选择。

【问题讨论】:

    标签: android push-notification android-service alarmmanager


    【解决方案1】:

    您可以考虑在任意数量的设备广播(例如 wifi 连接状态和启动)上设置广播接收器;

    <receiver android:name=".receivers.BootReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
    
        <receiver android:name=".receivers.WifiReceiver">
            <intent-filter>
                <action android:name="android.net.wifi.STATE_CHANGE" />
            </intent-filter>
        </receiver>
    

    【讨论】:

    • 其实这可能帮不上什么忙。如果 OP 已将他的服务设置为永久运行,则只有在他的服务明确关闭自身时才会调用 onDestroy()(使用 stopService() 或 stopSelf())。如果 Android 因为需要资源而想要关闭服务,Android 将简单地杀死托管服务的进程,在这种情况下,onDestroy() 将永远不会被调用。
    • 没错,我已经想到了,但是当Android系统或任务管理器杀死进程时,不会调用onDestroy()方法......另外,常量START_STICKY似乎不是也没有多大帮助:服务在被杀死一段时间后没有启动......
    • 我同意 onDestroy 的东西,它不能保证甚至不常见,从我对后代的回答中删除。谢谢大卫。
    【解决方案2】:

    将您的服务设置为前台服务(请参阅this)。 Android 只会在极端情况下终止该服务。如果服务意外崩溃,您仍然可以将警报管理器用作“安全网”来重新启动服务。这是你能做的最好的。没有什么是 100%。

    【讨论】:

    • 这实际上是一个好主意 :) 我认为这是完美的,因为由于通知,用户知道服务正在后台运行,他/她可以点击它来禁用它。如果 Android 终止该服务,用户也会知道它。为了完整起见,我可以说我在onStartCommand() 回调中调用了startForeground()。这里有一个例子:github.com/commonsguy/cw-android/blob/master/Notifications/…
    猜你喜欢
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 2021-08-15
    相关资源
    最近更新 更多