我的应用程序使用由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
答案 0 :(得分:22)
不应该从广播接收器绑定服务。 原因是广播接收器是轻量级组件,它必须finish its functionality with in not more than 10 seconds maximum。否则android可能强行杀死你的接收器。在某些最坏的情况下绑定(建立连接)服务可能需要10秒以上,这就是为什么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)
阅读http://developer.android.com/reference/android/content/BroadcastReceiver.html,Receiver Lifecycle部分
答案 5 :(得分:0)
根据bindService文档:
注意:无法从BroadcastReceiver调用此方法 零件。您可以用来与a进行通信的模式 BroadcastReceiver到服务是用来调用startService(Intent) 包含要与服务一起发送的命令的参数 完成执行该命令后调用其stopSelf(int)方法。
我做了什么: (不确定它是否适用于所有情况) 您可以在BroadcastReceiver中创建服务并启动该服务。在服务onCreate()方法中,您可以从另一个负责绑定的类调用方法。您可以将上下文从服务传递到该类并使用它如下所示:ctx.bindService(...)
答案 6 :(得分:0)
BroadcastReceiver无法绑定。 您可以通过以下URL获得一个好的解决方案:
答案 7 :(得分:0)
很简单。 选项1: 我创建了一个空的Activity(非UI,只是用于Bind服务的onCreate())和finish()。 在广播>使用Bundle启动活动(如果需要)。问题已解决。
选项2: 与上述选项相同,但使用Service而不是Activity。 获取活动广播>开始新的服务>绑定到要绑定的现有服务。