BroadcastReceiver绑定服务

时间:2013-09-21 10:44:11

标签: android

我的应用程序使用由BOOT_COMPLETE BroadcastReceiver启动的服务,在运行中我收到错误

我的代码:

public class projet extends BroadcastReceiver { 
 public void onReceive(Context context, Intent intent) { 

  intent = new Intent(context, ScreenshotService.class);
  intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  context.bindService(intent, aslServiceConn, Context.BIND_AUTO_CREATE);
}
}

错误:

java.lang.RuntimeException: Unable to start receiver com.example.projet: android.content.ReceiverCallNotAllowedException: BroadcastReceiver components are not allowed to bind to services

8 个答案:

答案 0 :(得分:22)

不应该从广播接收器绑定服务。 原因是广播接收器是轻量级组件,它必须finish its functionality with in not more than 10 seconds maximum。否则android可能强行杀死你的接收器。在某些最坏的情况下绑定(建立连接)服务可能需要10秒以上,这就是为什么android不允许它。

广播接收者规则:

  1. 广播接收器不会有任何UI(主要是),它只有背景逻辑。
  2. 广播接收器的最大时间限制为10秒,以完成其功能,否则会崩溃。
  3. 您不应该在接收器中进行长时间运行操作或异步操作。     示例:a。准备SD卡。      湾从互联网上传/下载文件。              C。创建Db文件。              d。绑定服务
  4. 不要在广播接收器中向用户显示对话框。 (这是异步操作)
  5. 您可以使用“吐司”或“通知”。
  6. 不要写任何重要的功能。
  7. 摘自developer android

答案 1 :(得分:10)

如果您知道Service正在投放,则可以使用Binder方法查询其BroadcastReceiver.peekService(Context, Intent)(请参阅peekService docs)。

但是,正如在其他答案中已经说过的那样,不允许在Service内绑定BroadcastReceiver

答案 2 :(得分:4)

最好的方法是首先使用以下内容从IntentService开始BroadcastReceiver.onReceive()

context.StartService(new Intent(context, YourIntentService.class));

然后在IntentService.onHandleIntent()

@Override
protected void onHandleIntent(Intent intent) {
    mContext = getApplicationContext();
    mContext.bindService(new Intent("com.ServiceToBind.BIND"), yourConnection, Context.BIND_AUTO_CREATE);
}

答案 3 :(得分:1)

问题

BroadcastReceiver不允许绑定到Service,因为此处的其他答案已表明。

解决方案

我使用的一个简单解决方案是将Intent收到的BroadcastReceiver转发给您最初想要绑定的服务,然后在该服务的onStartCommand()方法中实现一些代码来处理它

答案 4 :(得分:0)

答案 5 :(得分:0)

根据bindService文档:

  

注意:无法从BroadcastReceiver调用此方法   零件。您可以用来与a进行通信的模式   BroadcastReceiver到服务是用来调用startService(Intent)   包含要与服务一起发送的命令的参数   完成执行该命令后调用其stopSelf(int)方法。

我做了什么: (不确定它是否适用于所有情况) 您可以在BroadcastReceiver中创建服务并启动该服务。在服务onCreate()方法中,您可以从另一个负责绑定的类调用方法。您可以将上下文从服务传递到该类并使用它如下所示:ctx.bindService(...)

答案 6 :(得分:0)

BroadcastReceiver无法绑定。 您可以通过以下URL获得一个好的解决方案:

Android - Start service on boot

答案 7 :(得分:0)

很简单。 选项1: 我创建了一个空的Activity(非UI,只是用于Bind服务的onCreate())和finish()。 在广播>使用Bundle启动活动(如果需要)。问题已解决。

选项2: 与上述选项相同,但使用Service而不是Activity。 获取活动广播>开始新的服务>绑定到要绑定的现有服务。