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

Gau*_*rma 2 android android-service

我已经尝试过,直到现在 - 开始粘滞 - 重启服务的警报 - 删除任务启动服务 - 使用作业服务(有延迟并执行任务很慢)

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

Tim*_*Tim 15

在android中创建"不死"的后台服务是不可能的.

您可以创建一个服务并采取一些措施让它尽可能地运行,但操作系统有时终止它并且您的服务将不会运行,直到操作系统决定重新启动它(如果它是一个粘性服务).

你可以做的事情:

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

你永远不会有100%的正常运行时间,但这会让你接近.

  • 因此,我获得了 3 2 星评级。而且这个问题由于人们拥有这些带有定制ROM的中国手机而变得更加复杂,这些手机有自己的任务杀手和安全中心 (2认同)

gba*_*tta 5

后台服务如果对用户不可见,总是会被 Android 系统提前或稍后终止。这就是内存管理的工作方式。

如果您确实需要使服务持续运行,则需要向用户显示永久通知(例如当您使用广播应用程序或音乐播放器应用程序时)。

Whatsapp 和 facebook 可能做的是通过任何类型的消息传递远程唤醒应用程序,例如 Firebase Cloud Messaging(前 Google Cloud Messaging)或在某些事件上使用 Broadcast Receiver...但这肯定不会发生服务。

阅读 Android 文档的这一部分以更好地理解这一点: 服务进程生命周期

如您所见,要优先考虑您的服务进程,您需要在前台启动它并使用 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);
Run Code Online (Sandbox Code Playgroud)

  • 感谢你的回答。我也尝试过。但用户抱怨他们不喜欢状态栏中的图标。有什么办法去掉图标吗? (2认同)