我一直试过 - 开始粘 - 重启服务的警报 - 在删除任务时启动服务 - 使用工作服务(有延迟并执行任务缓慢)
是否有适当的方法来制作像流行应用程序一样的绝对可靠的后台服务?
答案 0 :(得分:11)
在android中无法创建“不死”的后台服务。
您可以创建服务并采取一些措施让它尽可能地运行,但操作系统将有时将其终止,并且在操作系统决定重新启动之前您的服务将无法运行(如果是粘性服务)。
你可以做的事情:
MY_PACKAGE_REPLACED
广播升级应用时启动服务。BOOT_COMPLETED
和REBOOT
广播(重新)启动设备时启动服务。onTaskRemoved
,以便在用户从最近的应用列表中删除您的应用时安排重新启动服务。你永远不会有100%的正常运行时间,但这会让你接近。
答案 1 :(得分:3)
如果用户不可见,后台服务将始终被Android系统提前或稍后杀死。这是内存管理的工作方式。
如果您确实需要继续运行服务,则需要向用户显示永久通知(例如,当您使用无线电应用程序或音乐播放器应用程序时)。
whatsapp和facebook可能会做的是使用任何类型的消息来远程唤醒应用程序,例如Firebase云消息传递(前Google云消息传递)或使用广播接收器来处理某些事件......但它肯定不是。我一直在服务。
阅读Android文档的这一部分,以便更好地理解这一点: Service Process Lifecycle。
如您所见,要优先考虑您的服务流程,您需要在前台启动它,并使用startForeground(int id,Notification notification)将其传递给正在进行的通知。 在NotificationBuilder中使用setOngoing(true)将通知设置为正在进行的通知:setOngoing(boolean b) doc。
最后,您通常希望在正在进行的通知中添加操作(例如播放器控件或关闭通知的可能性,从而在收集内存时关闭服务)
这是一个完整的示例代码:
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle(getString(R.string.notification_title))
.setContentText(getString(R.string.notification_text))
.setSmallIcon(R.drawable.ic_small_icon)
.setColor(getResources().getColor(R.color.colorAccent))
.setContentIntent(pendingIntent)
.setOngoing(true)
//.addAction(android.R.drawable.close_service,"Close", closeServiceIntent)
.build();
startForeground(Constants.NOTIFICATION_ID, notification);
答案 2 :(得分:-1)
这不是一个好主意,请查看this article。在这种情况下使用服务不是一个好方法。