【问题标题】:Broadcast Receiver in Service not receiving Intent服务中的广播接收器未接收到意图
【发布时间】:2016-06-20 19:18:07
【问题描述】:

我知道有很多与此主题相关的问题,但似乎对我没有任何帮助。

我有一个服务,它接收来自多个活动的广播,我正在对收到的每个广播使用不同的操作来区分它们。

这是我的代码

MyService.java // 这是服务类

private BroadcastReceiver SleepTimeReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG,"SleepTimeReceiver onReceive is called");
        if (intent.getAction().equals("sleepTimeFinished")) {
            Log.d(TAG,"intents are matching");
        }
    }
};

@Override
public void onCreate() {
    Log.d(TAG,"onCreate is called");
    .
    .
    registerReceiver(SleepTimeReceiver,new IntentFilter("sleepTimeFinished"));
}

@Override
public void onDestroy() {
    Log.d(TAG, "on destroy is called");
    unregisterReceiver(SleepTimeReceiver);
}

MyActivity.java // 这是活动类

@Override
protected void onCreate(Bundle savedInstanceState) {
    Log.d(TAG,"About to send broadcast");
    Intent sleepTimeFinishedIntent = new Intent(this, MyService.class);
    sleepTimeFinishedIntent.setAction("sleepTimeFinished");
    sendBroadcast(sleepTimeFinishedIntent);
    Log.d(TAG,"broadcast has been sent");
}

我也尝试在清单文件中添加接收器,但无济于事。在 logcat 中,我可以看到所有方法的日志,除了接收者的 onReceive 方法。有人可以帮我解决这个问题。这个简单的问题已经困扰了我好几个小时了。

【问题讨论】:

  • 您需要BroadcastReceiver 做什么?为什么不使用startService 与您的Service“交谈”?
  • 我实际上是在使用该服务来播放音乐。此活动让服务知道何时根据用户选择停止播放音乐。
  • 所以你根本不需要它:要么从你的活动中bindService(推荐),要么通过startService 呼叫与你的服务交谈(不推荐)
  • 您好,感谢您抽出宝贵时间。我在服务类中创建了一个方法,我在其中放置了停止音乐的代码,并在必要时调用该方法。
  • 我现在能够解决这个问题,但仍然无法弄清楚为什么没有收到广播意图。

标签: java android android-intent android-broadcastreceiver


【解决方案1】:

您是否启动了服务?我没有看到从 onCreate 开始,你在那里发送广播 - 也许接收器尚未注册?

【讨论】:

  • 是的,我已经使用不同的活动开始了服务。这不是问题。
  • 您的广播没有获得 Intent,因为您在 new Intent(this, MyService.class); 中将 MyService 指定为它的组件。尝试使用空的构造函数,然后 Intent 转到您的接收器。
  • 我尝试了您建议的方法,但仍然没有收到意图。
【解决方案2】:

在我看来,您应该使用LocalBroadcastManager,因为您只处理从您自己的应用程序中发送的广播。

所以在MyService.javaonCreate() 内注册您的BroadcastReceiver,如下所示:

LocalBroadcastManager.getInstance(this).registerReceiver(sleepTimeReceiver, new IntentFilter("sleepTimeFinished"));

然后从onCreate()MyActivity.java 发送您的广播,如下所示:

Intent sleepTimeFinishedIntent = new Intent("sleepTimeFinished");
LocalBroadcastManager.getInstance(this).sendBroadcast(sleepTimeFinishedIntent);

onDestroy() 的 MyService.java 中取消注册您的本地广播接收器,如下所示:

LocalBroadcastManager.getInstance(this).unregisterReceiver(sleepTimeReceiver);

您可能已经注意到,为了保持一致性,我还将广播接收器的名称更改为以小写字母开头。 所以它是sleepTimeReceiver 而不是SleepTimeReceiver

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多