首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在意图背景位置设置回调

在意图背景位置设置回调
EN

Stack Overflow用户
提问于 2022-07-26 16:58:06
回答 3查看 145关注 0票数 0

早上好,

我想在后台添加本地化服务。经过多次不成功的搜索后,我决定在这里提出这个问题。

我的问题是,我找不到完整的文档来解释如何在Android的背景下创建服务。

我在github上找到了一个首选代码,它使用以下函数:

startForegroundServicestartService

我关心的是,我想传递在我的活动意图启动的类中恢复的数据。这些数据必须在活动中使用(用于显示和备份)。所以我想到了几个解决方案,包括一个最有可能的解决方案,就是在后台使用的类中安装一个回调。

所以我有两个问题:

  • 您是否有正确解释在Android (Java)背景中运行的函数以及如何(如果可能的话)如何提高我的总体理解的文档链接(目前我还不了解正式文档)?
  • 如何将回调传递给intent实例化的类?还是把他们从一个班传到另一个活动?

在Github中,我窃取了启动意图的代码:https://github.com/mahdices/AndroidBackgroundLocation/blob/39facab3252dd43742f7626a57feb76bbce10d93/app/src/main/java/com/ces/backgroundlocation/MainActivity.java#L34

代码语言:javascript
复制
final Intent intent = new Intent(MainActivity.this, MyLocationManager.class);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    startForegroundService(intent);
} else {
    startService(intent);
}

PS :最有趣的是,我觉得后台的服务并没有真正启动。(可能是因为我不了解后台服务以及如何使用它们)

提前谢谢你的回答。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-07-26 18:27:34

关于服务的这是正式文件 --这里有几个部分。它值得一读,因为它几乎涵盖了一切。

我认为您不需要前台服务。这个术语有点混乱,但前台服务在用户没有与应用程序交互时仍然运行,就像音乐播放器一样。(这些文档的前台服务部分有更多信息。)

它之所以成为前台,是因为服务基本上是从后台提升的,并且成为一个前台组件,它将使应用程序的进程在与Activity相同的水平上运行。区别在于您可以看到一个Activity,但您不一定知道前台Service正在运行。这就是为什么Android对前台服务设置了一系列限制,包括要求您在前台服务运行时显示永久通知。这就是为什么您必须调用startForeground将一个Service放在前台,并且在执行时必须传递一个Notification

因此,假设您不需要前台服务-除非需要,否则不应该运行前台服务。如果您的Service只在用户与您的应用程序交互时才运行(并且可能在应用程序处于后台时继续运行,您的应用程序及其后台服务不会立即被关闭),那么只提供一个普通的服务就可以了。

有两种方法可以运行Service调用startService或绑定到bindServicestartService让它运行,直到您调用stopService为止。bindService添加到绑定到服务的客户端的计数--如果它尚未运行,它将启动,并将一直运行直到所有客户端解除绑定。

这两个系统一起工作,以保持服务的运行。如果您已经调用了startService,并且所有客户端都解除了绑定,那么它仍然会运行,因为它已经显式启动,直到调用stopService为止。如果调用stopService,但客户端仍然绑定,则服务仍将运行。因此,您可能会发现,使用这两种方法(而不是仅使用一种方法)来保持服务的运行会更有用。

一般来说,如果您想要访问正在运行的Service,就需要绑定到它。这是这个的文档,但基本思想是,Service创建一个IBinder对象,其中包含一组方法和变量,这些方法和变量与正在运行的实例交互,当某些东西绑定到服务时,它将获得该Binder对象,并通过这些方法访问该服务。或者,如果您愿意,只需将一组公共方法放在Service上,并在Binder中添加一个对服务实例的引用,如文档示例中所示:

代码语言:javascript
复制
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更像是告诉服务运行并执行它的任务,就像不直接与之交互的独立组件一样。启动服务可以例如与一些应用程序级别的变量交互,比如全局varActivity之类的东西,但这是有限的,而且常常很麻烦。使用绑定服务的方式就是这样做的。

我已经浏览了一些东西(比如需要绑定到服务的样板),但这都在文档中--一旦您知道了它们的示例代码是一个很好的开始构建的地方!

票数 1
EN

Stack Overflow用户

发布于 2022-07-26 17:21:07

看看这篇中篇文章。

此外,绑定服务将解决您的问题,继续将数据传递到您的服务并从它获得更新。

https://medium.com/@huseyinozkoc/android-services-tutorial-with-example-fa329e6a5b4b

票数 2
EN

Stack Overflow用户

发布于 2022-07-26 18:22:24

我将在您的用例中解释它们的不同之处。我希望是有用的:对于位置跟踪应用程序,首先,您应该确定您的规则,您的业务逻辑是什么?

如果你只想跟踪他,而你的应用程序在前台,你不需要任何ForegroundService。您只需要运行一个BoundService,它绑定到(例如)您的活动,并在您的活动被破坏时停止。

另一方面,ForegroundService允许您跟踪位置,即使您的应用程序已经关闭,显示给用户一条消息:“嘿!我在跟踪您的位置,如果您不介意:)。”您必须显示此通知,因为在没有此通知的情况下,Android不会让您跟踪位置。

很快,我会写一篇文章,解释更多,并附在这里

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73127173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档