创建不会死的服务的最佳方式。(如WhatsApp或Facebook)

时间:2017-01-19 10:31:00

标签: android android-service

我一直试过 - 开始粘 - 重启服务的警报 - 在删除任务时启动服务 - 使用工作服务(有延迟并执行任务缓慢)

是否有适当的方法来制作像流行应用程序一样的绝对可靠的后台服务?

3 个答案:

答案 0 :(得分:11)

在android中无法创建“不死”的后台服务。

您可以创建服务并采取一些措施让它尽可能地运行,但操作系统有时将其终止,并且在操作系统决定重新启动之前您的服务将无法运行(如果是粘性服务)。

你可以做的事情:

  • 使服务变得粘滞,以便OS在操作系统杀死后重新启动它。无法预测何时重新启动。它几乎是即时的,可能需要几秒,几分钟,几小时或更长时间。
  • 打开应用时启动服务。
  • 使用MY_PACKAGE_REPLACED广播升级应用时启动服务。
  • 使用BOOT_COMPLETEDREBOOT广播(重新)启动设备时启动服务。
  • 覆盖服务中的onTaskRemoved,以便在用户从最近的应用列表中删除您的应用时安排重新启动服务。
  • 使用FCM定期向应用程序发送消息,并提供启动服务的说明,以防它再次运行。

你永远不会有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。在这种情况下使用服务不是一个好方法。