早上好,
我想在后台添加本地化服务。经过多次不成功的搜索后,我决定在这里提出这个问题。
我的问题是,我找不到完整的文档来解释如何在Android的背景下创建服务。
我在github上找到了一个首选代码,它使用以下函数:
startForegroundService和startService。
我关心的是,我想传递在我的活动意图启动的类中恢复的数据。这些数据必须在活动中使用(用于显示和备份)。所以我想到了几个解决方案,包括一个最有可能的解决方案,就是在后台使用的类中安装一个回调。
所以我有两个问题:
在Github中,我窃取了启动意图的代码:https://github.com/mahdices/AndroidBackgroundLocation/blob/39facab3252dd43742f7626a57feb76bbce10d93/app/src/main/java/com/ces/backgroundlocation/MainActivity.java#L34
final Intent intent = new Intent(MainActivity.this, MyLocationManager.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForegroundService(intent);
} else {
startService(intent);
}PS :最有趣的是,我觉得后台的服务并没有真正启动。(可能是因为我不了解后台服务以及如何使用它们)
提前谢谢你的回答。
发布于 2022-07-26 18:27:34
关于服务的这是正式文件 --这里有几个部分。它值得一读,因为它几乎涵盖了一切。
我认为您不需要前台服务。这个术语有点混乱,但前台服务在用户没有与应用程序交互时仍然运行,就像音乐播放器一样。(这些文档的前台服务部分有更多信息。)
它之所以成为前台,是因为服务基本上是从后台提升的,并且成为一个前台组件,它将使应用程序的进程在与Activity相同的水平上运行。区别在于您可以看到一个Activity,但您不一定知道前台Service正在运行。这就是为什么Android对前台服务设置了一系列限制,包括要求您在前台服务运行时显示永久通知。这就是为什么您必须调用startForeground将一个Service放在前台,并且在执行时必须传递一个Notification。
因此,假设您不需要前台服务-除非需要,否则不应该运行前台服务。如果您的Service只在用户与您的应用程序交互时才运行(并且可能在应用程序处于后台时继续运行,您的应用程序及其后台服务不会立即被关闭),那么只提供一个普通的服务就可以了。
有两种方法可以运行Service调用startService或绑定到bindService。startService让它运行,直到您调用stopService为止。bindService添加到绑定到服务的客户端的计数--如果它尚未运行,它将启动,并将一直运行直到所有客户端解除绑定。
这两个系统一起工作,以保持服务的运行。如果您已经调用了startService,并且所有客户端都解除了绑定,那么它仍然会运行,因为它已经显式启动,直到调用stopService为止。如果调用stopService,但客户端仍然绑定,则服务仍将运行。因此,您可能会发现,使用这两种方法(而不是仅使用一种方法)来保持服务的运行会更有用。
一般来说,如果您想要访问正在运行的Service,就需要绑定到它。这是这个的文档,但基本思想是,Service创建一个IBinder对象,其中包含一组方法和变量,这些方法和变量与正在运行的实例交互,当某些东西绑定到服务时,它将获得该Binder对象,并通过这些方法访问该服务。或者,如果您愿意,只需将一组公共方法放在Service上,并在Binder中添加一个对服务实例的引用,如文档示例中所示:
class LocalService : Service() {
// Binder given to clients
private val binder = LocalBinder()
inner class LocalBinder : Binder() {
// Return this instance of LocalService so clients can call public methods
fun getService(): LocalService = this@LocalService
}
override fun onBind(intent: Intent): IBinder {
return binder
}
}因此,基本上,您可以通过绑定来访问正在运行的服务,并且接收一个具有对该服务的引用的对象。
使用startService更像是告诉服务运行并执行它的任务,就像不直接与之交互的独立组件一样。启动服务可以例如与一些应用程序级别的变量交互,比如全局var或Activity之类的东西,但这是有限的,而且常常很麻烦。使用绑定服务的方式就是这样做的。
我已经浏览了一些东西(比如需要绑定到服务的样板),但这都在文档中--一旦您知道了它们的示例代码是一个很好的开始构建的地方!
发布于 2022-07-26 17:21:07
看看这篇中篇文章。
此外,绑定服务将解决您的问题,继续将数据传递到您的服务并从它获得更新。
https://medium.com/@huseyinozkoc/android-services-tutorial-with-example-fa329e6a5b4b
发布于 2022-07-26 18:22:24
我将在您的用例中解释它们的不同之处。我希望是有用的:对于位置跟踪应用程序,首先,您应该确定您的规则,您的业务逻辑是什么?
如果你只想跟踪他,而你的应用程序在前台,你不需要任何ForegroundService。您只需要运行一个BoundService,它绑定到(例如)您的活动,并在您的活动被破坏时停止。
另一方面,ForegroundService允许您跟踪位置,即使您的应用程序已经关闭,显示给用户一条消息:“嘿!我在跟踪您的位置,如果您不介意:)。”您必须显示此通知,因为在没有此通知的情况下,Android不会让您跟踪位置。
很快,我会写一篇文章,解释更多,并附在这里
https://stackoverflow.com/questions/73127173
复制相似问题