23

我的应用程序使用由 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
4

8 回答 8

30

不应从广播接收器绑定服务。原因是广播接收器是轻量级组件,它必须在最多不超过 10 秒的时间内完成其功能。否则 android 可能会强行杀死您的接收器。在某些最坏的情况下,绑定(建立连接)服务可能需要超过 10 秒,这就是 android 不允许它的原因。

广播接收器规则:

  1. 广播接收器(大部分)没有任何 UI,它只有后台逻辑。
  2. 广播接收器将有 10 秒的最大时间限制来完成其功能,否则它将崩溃。
  3. 您不应该在接收器中执行长时间运行的操作或异步操作。示例:a。准备 SD 卡。湾。从互联网上传/下载文件。C。创建数据库文件。d。绑定到服务
  4. 不要在广播接收器中向用户显示对话框。(这是异步操作)
  5. 您可以使用“toast”或“Notifications”。
  6. 不要编写任何繁重的功能。

参考来自开发者 android

于 2013-12-03T11:08:30.663 回答
15

如果您知道它Service正在运行,您可以Binder使用BroadcastReceiver.peekService(Context, Intent)方法获取它(参见peekService文档)。

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

于 2014-07-30T11:16:24.807 回答
6

最好的方法是首先IntentServiceBroadcastReceiver.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);
}
于 2015-04-14T06:20:49.410 回答
2

问题

BroadcastReceiverService正如此处的其他答案所表明的那样,不允许将 s 绑定到 a 。

解决方案

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

于 2016-03-01T07:02:17.413 回答
0

阅读http://developer.android.com/reference/android/content/BroadcastReceiver.html,接收器生命周期部分

于 2013-09-21T10:50:40.737 回答
0

根据 bindService 文档:

注意:不能从 BroadcastReceiver 组件调用此方法。您可以用来从 BroadcastReceiver 与 Service 通信的一种模式是使用包含要发送的命令的参数调用 startService(Intent),并在执行完该命令后调用其 stopSelf(int) 方法。

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

于 2014-11-26T02:34:03.633 回答
0

BroadcastReceiver 无法绑定服务。您可以在以下 URL 中获得一个很好的解决方案:

Android - 在启动时启动服务

于 2015-06-11T07:55:56.727 回答
0

很简单。选项 1:我创建了一个空 Activity(非 UI,仅用于 Bind 服务的 onCreate())和 finish()。在 Broadcast > Start Activity with Bundle 中(如果需要)。问题解决了。

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

于 2017-10-20T18:41:58.830 回答