这适用于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>
,并且它为空,但我不知道为什么。
感谢您提供的任何帮助。
答案 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”经过时,它不会被我们的行为混淆,并且将被允许通过。
使用包名可能还有其他原因,这可能不是最好的,但据我所知,这是该约定背后的原因。