无法使嵌入式BroadcastReceiver工作

时间:2014-10-06 21:14:32

标签: android broadcastreceiver

这适用于GPS。我有一个带有嵌入式接收器类的父类,以及一个处理GPS内容的单独LocationTrackingService类。我需要Broadcast行进里程来更新UI,但是从未收到广播。这是项目中唯一的BroadcastReceiver。我想我可以设置一个计时器让我的ServiceConnection每隔几秒检查一次并抓住新的里程数,但那个编码不好。

Manifest中没有任何内容,因为我正在动态注册和取消注册。

public class Parent
{
  GPSReceiver gpsreceiver;

  public class EmbeddedReceiver extends BroadcastReceiver
  {
    @Override
    public void onReceive(Context arg0, Intent intent)
    {
      Bundle extras = intent.getExtras();
      if (extras != null) {
        distance = extras.getDouble(LocationTrackingService.UPDATE_MILEAGE_MESSAGE);
      }
    }
  }

  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    gpsReceiver = new EmbeddedReceiver();
  }

  private void gpsStart()
  {
    if (gpsReceiver != null) {
      intentFilter = new IntentFilter();
      intentFilter.addAction("don't know what goes here");
      LocalBroadcastManager.getInstance(this).registerReceiver(gpsReceiver, intentFilter);
    }
  }

  private void gpsStop()
  {
    if (gpsReceiver != null) {
      LocalBroadcastManager.getInstance(this).unregisterReceiver(gpsReceiver);
    }
  }
}

public class LocationTrackingService extends Service
{
  private LocalBroadcastManager broadcaster;

  @Override
  public int onStartCommand(Intent intent, int flags, int startId)
  {
    super.onStartCommand(intent, flags, startId);

    broadcaster = LocalBroadcastManager.getInstance(this);
    return START_STICKY;
  }

  .... code

  private void sendResult(String message)
  {
    Intent i = new Intent("ParentActivity");
    i.setAction("ParentActivity");
    if (message != null) {
      i.putExtra(message, mileageRunningTotal);
    }

    broadcaster.sendBroadcast(i);
  }
}

当我按照代码进入LocalBroadcastManager时,在第215行,它mActions.get(intent.getAction()得到一个ArrayList<ReceiverRecord>,并且它为空,但我不知道为什么。

感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:0)

我无法看到广播公司对象的声明。

 broadcaster.sendBroadcast(i);

是本地广播管理器实例吗?

如果没有,它就不会工作。

答案 1 :(得分:0)

广播以这样一种方式工作,即该动作充当接收者的触发器。换句话说,在任何给定时间,整个手机都会发送大量的广播,接收器的目标是在广播过程中通过相应的动作捕捉广播。它将让所有其他广播继续通过而不会中断。一旦找到它正在寻找的那个,它就会收到它并执行onReceive()功能。

虽然操作可以是您关心的任何字符串键,但建议您添加包名称。这使您的广播具有特异性,并允许您在手机发送的大量广播中更​​轻松地管理您的广播。这很重要,因为可以在应用程序之间发送广播。这样可以避免以下情况

  

应用程序A发出一个系统广播,其中包含我们不感兴趣的动作“SOME_ACTION”。应用程序B也将发送一个本地广播,其中包含我们很难接收的动作“SOME_ACTION”。我们将设置Receiver 1以从应用程序B中查找并接收操作“SOME_ACTION”。但是,由于操作冲突,当应用程序A发出“SOME_ACTION”广播时,我们将在Receiver 1中不恰当地接收它并执行我们的onReceive ()功能,好像我们刚收到应用程序B的本地广播。

遵循建议的约定,您可以通过执行以下操作来避免上述情况

  

不是将您的操作设置为“SOME_ACTION”,而是将其设置为“com.app_b.package.SOME_ACTION”。这样,当广播动作“com.app_a.package.SOME_ACTION”经过时,它不会被我们的行为混淆,并且将被允许通过。

使用包名可能还有其他原因,这可能不是最好的,但据我所知,这是该约定背后的原因。