Android 使用AlarmManager定期检查我的永久服务是否正在运行
我有一个Android 使用AlarmManager定期检查我的永久服务是否正在运行,android,push-notification,android-service,alarmmanager,Android,Push Notification,Android Service,Alarmmanager,我有一个服务,它应该保持与服务器的永久连接,以便接收通知。对于我的应用程序来说,按时从服务器获取消息至关重要 我无法使用GCM推送,因为连接将在本地网络中,并且手机可能没有任何互联网连接。我也知道在服务中保持永久连接的电池问题,但我会让用户选择此选项,并告知他/她潜在的电池耗电情况(实际上,当设备始终处于同一位置连接电源时,此功能主要有意义)。我也知道Android系统可以随时终止我的服务,甚至用户也可以使用任务杀手来清除当时运行的所有服务 话虽如此,我考虑定期使用AlarmManager来检查
服务
,它应该保持与服务器的永久连接,以便接收通知。对于我的应用程序来说,按时从服务器获取消息至关重要
我无法使用GCM推送,因为连接将在本地网络中,并且手机可能没有任何互联网连接。我也知道在服务中保持永久连接的电池问题,但我会让用户选择此选项,并告知他/她潜在的电池耗电情况(实际上,当设备始终处于同一位置连接电源时,此功能主要有意义)。我也知道Android系统可以随时终止我的服务,甚至用户也可以使用任务杀手来清除当时运行的所有服务
话虽如此,我考虑定期使用AlarmManager
来检查我的服务是否正在运行,如果没有,则重新启动它。我不相信这个选项,因为服务器可以在服务被终止后发送消息,但还没有被AlarmManager
重新启动
我的问题基本上是,是否有更好的策略来确保我按时收到邮件?
到目前为止,我能找到的所有相关信息都代表着避免使用永久服务和使用其他服务,但由于我的使用案例的性质,我没有其他选择。您可以在任何数量的设备广播上设置广播接收器,如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>
将您的服务设置为前台服务(请参阅)。Android只会在极端情况下终止这项服务。如果服务意外崩溃,您仍然可以将alarm manager用作“安全网”来重新启动服务。这是你能做的最好的了。没有什么是100%。事实上,这可能没有多大帮助。如果OP已将其服务设置为永久运行,则只有在其服务显式关闭时(使用stopService()
或stopSelf()
),才会调用ondstroy()
)。如果Android因为需要资源而想关闭该服务,Android会简单地终止托管该服务的进程,在这种情况下,onDestroy()
将永远不会被调用。确切地说,我已经考虑过了,但是当Android系统或任务管理器终止该进程时,不会调用方法onDestroy()。。。此外,持续的启动粘性似乎也没有多大帮助:服务在被终止一段时间后不会启动……我同意onDestroy的内容,它不保证,甚至不常见,从我对后代的回答中删除。谢谢David。这实际上是一个很棒的主意:)我认为这很完美,因为通过通知,用户知道某个服务正在后台运行,他/她可以点击它来禁用它。如果安卓停止了这项服务,用户也会知道。为了完整起见,我可以说我在onStartCommand()
回调中调用了startForeground()
。这里有一个例子: