通过BroadcastReceiver启动Service或IntentService有什么意义?

时间:2016-07-08 12:20:41

标签: android service broadcastreceiver intentservice

我见过一些Google代码实现,其中Services或IntentServices是通过BroadcastReceiver启动的。我无法理解这是否存在技术原因? 停止启动服务的唯一代码是检查ContentProvider是否为null。

if(provider == null) {
   // the provider is not initialised, yet...
   return;
}

P.S。我怀疑的一件事是,当服务开始比广播接收更昂贵时,性能,但我不确定这是为什么我想听听一些专家对此的意见:) 只是想了解何时这样做以及何时不这样做。

2 个答案:

答案 0 :(得分:2)

你可以让android系统通过IntentFilters触发BroadcastReceiver onReceive

例如,如果您对用户更改其设备的蓝牙设置感兴趣,您可以

<receiver android:name=".BTSettingsChangedReceiver">
    <intent-filter>
        <action android:name="android.bluetooth.adapter.action.STATE_CHANGED" />
    </intent-filter>
</receiver>

并且系统会在发生时自动调用BroadcastReceiver。

这不是您可以/应该对Service或IntentService *执行的操作。因此,您可以使用BroadcastReceiver通过接收者context.startService()中的onReceive手动启动它。

  

*警告:为确保您的应用安全,请始终在启动服务时使用明确的意图,并且不要为您的服务声明意图过滤器。使用隐式意图启动服务存在安全隐患,因为您无法确定哪些服务会响应意图,并且用户无法查看哪些服务启动。

答案 1 :(得分:1)

BroadcastReceivers是您应用中的听众。让他们听取事件,触发后,他们会告诉其他组件继续。

通常你将BroadcastReceivers与服务结合起来,所以第一个可以被不同的事件多次触发,后者知道什么时候做什么(例如基于事件多次广播启动服务,但是因为服务已经处理了什么,它只是忽略了进一步的调用,直到它完成)。它也可以堆积意图,但这就是想法,它们有不同的目的。