Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android中可靠地切换服务?_Android_Android Service - Fatal编程技术网

如何在Android中可靠地切换服务?

如何在Android中可靠地切换服务?,android,android-service,Android,Android Service,编辑:我特别关心在服务被终止的情况下更新我的切换 我有一个活动,我想显示用户启动或停止服务的切换。活动应显示服务当前是否正在运行,因此活动需要知道服务是否正在运行 这里讨论了这个问题: 有两个总体战略: 1) 使用活动管理器获取正在运行的服务的列表:ActivityManager.getRecentTasks()。缺点:is getRecentTasks已被弃用且速度较慢 2) 使用服务类中的静态字段切换状态。缺点:当服务被终止时,不会调用服务的onDestroy()方法。因此,在这种情况下无法

编辑:我特别关心在服务被终止的情况下更新我的切换

我有一个活动,我想显示用户启动或停止服务的切换。活动应显示服务当前是否正在运行,因此活动需要知道服务是否正在运行

这里讨论了这个问题:

有两个总体战略: 1) 使用活动管理器获取正在运行的服务的列表:ActivityManager.getRecentTasks()。缺点:is getRecentTasks已被弃用且速度较慢

2) 使用服务类中的静态字段切换状态。缺点:当服务被终止时,不会调用服务的onDestroy()方法。因此,在这种情况下无法更新静态变量,活动可能会认为服务正在运行,而实际情况并非如此


有没有更可靠的方法来解决这个问题?我可以每隔N秒将静态变量重新设置为时间戳,如果活动发现静态变量太旧,我就知道服务已被终止。我不知道它是否适用于您的情况,但我有一个服务,我在它上创建了一个静态启动方法
MyService.startifeeded(context)
。此方法根据某些内部数据库状态确定服务是否应运行。如果它应该运行,它将使用上下文启动
MyService
,否则它将调用
stopService
终止它(这将调用
onDestroy()
以允许服务“清理”)

接下来调用
onStartCommand()
,在此读取非静态字段变量
isRunning
,以确定是否应调用服务代码(在本例中为读取WiFi信号)

我想这个方案的一个变体可能会被用来获得您所寻求的功能。对我来说,关键是使静态的
MyService.startifeeded(context)
方法幂等,从这个意义上说,如果它应该运行,它将保持运行(而不是重新启动),如果它不应该运行,它将被破坏或者什么也不会发生


也许这在你的情况下没有什么意义,只是想抛开一些想法

以下方法可能在某种程度上适合您:

  • 广播驱动的消息传递将服务生命周期告知活动
  • 最近,我从googlesamples()中看到了JobScheduler示例
  • 这里的方法是将活动的messenger传递给服务,以便服务可以发送一条消息,并将其自身在message.obj中传递给活动,从而将活动实例设置为成员。 此时,您可以直接在活动上调用逻辑绑定方法来控制服务生命周期

    简言之: 连接到服务: (第70-72行)

    从服务发送握手消息: (第66行)

    将活动设置为成员: 主要活动,第106-107行


    但是,它们都不能解决服务终止时的问题。

    我特别关注服务终止案例。我将对问题进行编辑,使其更清楚。