Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 广播接收器绑定服务_Android - Fatal编程技术网

Android 广播接收器绑定服务

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

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

阅读“接收器生命周期”一节,不应从广播接收器绑定服务。 原因是广播接收机是重量较轻的部件,必须这样做。否则android可能会强行杀死你的接收器。在某些最坏的情况下,绑定(建立连接)服务可能需要10秒以上,这就是为什么android不允许这样做

广播接收机规则:

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

  • 参考取自如果您知道
    服务正在运行,您可以使用
    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);
    }