这是用于GPS的。我有一个带有嵌入式接收器类的父类,还有一个LocationTrackingService
用于处理GPS内容的单独的类。我需要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>
,并且为null,但是我不知道为什么。
感谢您提供的任何帮助。
广播的工作方式是该动作充当接收者的触发。换句话说,在任何给定时间,整个电话都会发送大量广播,接收者的目标是在广播经过时以相应的动作捕获广播。它将使所有其他广播继续播放而不会中断。一旦找到所需的内容,它将接收它并执行onReceive()
功能。
尽管操作可以是您喜欢的任何字符串键,但建议您在程序包名称中添加。这使广播具有特定性,并可以在手机正在发送的广播范围内更轻松地管理广播。这很重要,因为可以在应用程序之间发送广播。这样可以避免出现以下情况
应用程序A发出了我们不感兴趣的动作为“ SOME_ACTION”的系统广播。应用程序B也将发出我们将要接收的动作为“ SOME_ACTION”的本地广播。我们将设置接收器1来查找和接收来自应用程序B的动作“ SOME_ACTION”。但是,由于动作冲突,当应用程序A发送广播“ SOME_ACTION”时,我们会不适当地在接收器1中接收它并执行onReceive ()功能,就像我们刚从应用程序B接收到本地广播一样。
按照建议的约定,通过执行以下操作可以避免上述情况
与其将您的操作设置为“ SOME_ACTION”,不如将其设置为“ com.app_b.package.SOME_ACTION”。这样,当广播操作“ com.app_a.package.SOME_ACTION”通过时,就不会为我们的操作感到困惑,并且将被允许通过。
使用包名称可能还有其他原因,但这并不是最好的选择,但据我所知,这是约定背后的原因。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句