服务中的广播接收器未能接收到Android广播。

5

我有一个应用程序,其中用户在Activity中更新某些变量,然后Activity使用BroadcastReceiver将新变量传递给IntentService。但是,IntentService中的BroadcastReceiver似乎没有接收到广播。以下是服务中创建BroadcastReceiver的代码:

protected class UpdateReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent){
        Log.d("receiver", "Got message: ");
        //state=3;
        //Toast.makeText(context, "got it", Toast.LENGTH_SHORT).show();
    }
};

这里是在onHandle()函数中注册接收器的代码:

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("updates");
UpdateReceiver lol = new UpdateReceiver();
DetectService.this.registerReceiver(lol, intentFilter);

最后,这是从活动中发送广播的代码。

Intent broadcastIntent = new Intent();
broadcastIntent.setAction("updates");
HomePageActivity.this.sendBroadcast(broadcastIntent);
Log.d("sender", "send msg");

当我把接收器放在广播部分相同的活动中时,它可以正常工作,但是当我把它放入IntentService时却不能正常工作。请帮帮我!
另外,我在这个项目中尝试使用LocalBroadcastManager,因为所有的广播都是本地的,但是eclipse似乎无法导入兼容类。我已经使用Android SDK管理器安装了它。我在这里做错了什么吗?

你在清单文件中声明了接收器吗? - dldnh
当我将接收器放在与广播部分相同的活动中并在清单中注册时,接收器确实能够接收到消息,但这也导致了程序崩溃。这里的说明似乎意味着你可以在清单文件中或程序中注册接收器,但不能同时进行。http://developer.android.com/reference/android/content/Context.html#registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter) - Tan Jing Yuan
2个回答

4
这个Activity使用BroadcastReceiver将新变量传递给IntentService。这没有意义。使用startService()向IntentService发送命令。而且,IntentService不应该有BroadcastReceiver,因为IntentService一旦完成onHandleIntent()就会被销毁,因此永远不会接收广播。我尝试在这个项目中使用LocalBroadcastManager,因为广播都是本地的,但是eclipse似乎无法导入兼容类。这里有一个使用LocalBroadcastManager的示例项目,其中包含Eclipse项目文件。我创建项目时没有遇到任何特别的Eclipse问题。

好的,IntentService已经注册了一个传感器监听器,因此服务似乎永远不会停止。 - Tan Jing Yuan
@TanJingYuan:不,你只是在泄漏监听器,这也非常非常糟糕。IntentService 不适合与监听器一起使用。 - CommonsWare

2
protected class UpdateReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent){
        Log.d("receiver", "Got message: ");
        //state=3;
        //Toast.makeText(context, "got it", Toast.LENGTH_SHORT).show();
    }
};

在onCreate()方法中或相关的位置。
mReceiver = new UpdateReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("<your receivers intent goes here>");
this.registerReceiver(mReceiver, filter);

现在,您应该能够发送广播并使其被接收。
Intent intent = new Intent("<your receivers intent goes here>");
// Add what you want to add to the intent right here.
<context-handle>.sendBroadcast(intent);

1
尝试过了,不起作用。也许我应该将其实现为服务而不是 IntentService。 - Tan Jing Yuan
@TanJingYuan 这应该可以工作,我经常使用它。你在清单文件中定义了什么?确保你的接收器设置了android:enabled="true"。你能发布你的清单文件吗? - jjNford
你说得没错,它应该能工作,但基于下面的另一个答案,似乎问题不在接收器上,而是因为我将我的服务实现为IntentService而不是Service。 - Tan Jing Yuan
@TanJingYuan 你尝试在清单文件中声明接收器了吗?这样系统也可以实例化它。 - jjNford

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接