Android 广播接收器绑定服务
我的应用程序使用了一个由BOOT_COMPLETE BroadcastReceiver启动的服务,在运行中我遇到了一个错误 我的代码:Android 广播接收器绑定服务,android,Android,我的应用程序使用了一个由BOOT_COMPLETE BroadcastReceiver启动的服务,在运行中我遇到了一个错误 我的代码: public class projet extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { intent = new Intent(context, ScreenshotService.class); intent.addFlags
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
阅读“接收器生命周期”一节,不应从广播接收器绑定服务。 原因是广播接收机是重量较轻的部件,必须这样做。否则android可能会强行杀死你的接收器。在某些最坏的情况下,绑定(建立连接)服务可能需要10秒以上,这就是为什么android不允许这样做 广播接收机规则:
参考取自如果您知道
服务正在运行,您可以使用BroadcastReceiver.peek服务(上下文,意图)
方法(请参阅)获取其活页夹
但是,正如其他答案中所述,不允许从广播接收器
内绑定服务
根据bindService文档:
注意:此方法不能从BroadcastReceiver调用
组成部分。一种可用于从网络进行通信的模式
服务的BroadcastReceiver是使用
包含要与服务一起发送的命令的参数
执行完该命令后调用其stopSelf(int)方法
我所做的:
(不确定它是否在所有情况下都有效)
您可以在BroadcastReceiver中创建服务并启动该服务。在服务onCreate()方法中,可以从负责绑定的另一个类调用方法。您可以将上下文从服务传递到该类,并像这样使用它:ctx.bindService(…)最好的方法是首先使用以下命令从BroadcastReceiver.onReceive()启动IntentService
:
context.StartService(new Intent(context, YourIntentService.class));
然后在IntentService.onHandleIntent()中:
广播接收器无法绑定服务。
您可以在以下URL中获得一个好的解决方案:
问题
BroadcastReceiver
s不允许绑定到服务
,如此处的其他答案所示
解决方案
我使用的一个简单解决方案是将BroadcastReceiver
接收到的Intent
转发到您最初想要绑定到的服务,然后在该服务的onStartCommand()
方法中实现一些代码来处理它。非常简单。
选择1:
我创建了一个空活动(非UI,对于绑定服务只需onCreate())和finish()。
在广播>使用捆绑启动活动(如果需要)。问题解决了
选择2:
与上述选项相同,但使用服务而不是活动。
获取事件广播>启动新服务>绑定到要绑定的现有服务。很简单。我创建了一个空活动(非UI,对于绑定服务只需onCreate())和finish()。在广播>使用捆绑启动活动(如果需要)。问题已解决。请注意,peek服务
似乎在服务未运行或服务未被其他内容绑定时返回null
。@Sam这正是我写的。注意“如果你知道服务正在运行”这几个字。不,不是;您没有提到它在失败时返回null
,您也没有提到如果服务正在运行但尚未绑定到其他内容,它将失败。让您的生活变得轻松。:-)嘿,那个否决我回答的家伙。你能解释一下吗,你不喜欢这件事的什么地方?这是我能想到的最好的方法,事实上我正在我的应用程序中使用这段代码。所以,这段代码甚至经过测试并证明是有效的。我的错。是的,这是一项意向服务。谢谢@Eric在IntentService对服务做了任何必须做的事情之后,你是否需要担心解除绑定?回答得好!不过,您可以从广播接收器启动服务。很简单。我创建了一个空活动(非UI,对于绑定服务只需onCreate())和finish()。在广播>使用捆绑启动活动(如果需要)。问题解决了。
@Override
protected void onHandleIntent(Intent intent) {
mContext = getApplicationContext();
mContext.bindService(new Intent("com.ServiceToBind.BIND"), yourConnection, Context.BIND_AUTO_CREATE);
}