1

我正在使用 cwac-Location Poller(从这里)不断轮询用户位置并显示基于位置的通知。这一切工作正常,但现在我正在尝试附加另一个BroadcastReceiver,以便如果我的应用程序在前台,而不是显示通知,将谷歌地图动画到当前用户位置。但由于某种原因,我无法让它工作。

onCreate()MapActivity我有以下代码来启动轮询器的方法:

@Override
public void onCreate(Bundle savedInstanceState) {
   .....

    alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

    Intent i = new Intent(this, LocationPoller.class);

    Bundle bundle = new Bundle();
    LocationPollerParameter parameter = new LocationPollerParameter(bundle);
    parameter.setIntentToBroadcastOnCompletion(new Intent(this, LocationReceiver.class));
    parameter.setProviders(new String[] {LocationManager.GPS_PROVIDER, LocationManager.NETWORK_PROVIDER});
    parameter.setTimeout(60000);
    i.putExtras(bundle);

    pendingIntent = PendingIntent.getBroadcast(this, 0, i, 0);

    alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
                SystemClock.elapsedRealtime(), PERIOD, pendingIntent);                                 
}

onResume()方法中,我正在使用registerReceiver()方法注册另一个接收器:

@Override
protected void onResume() {
    super.onResume();
    IntentFilter intentFilter = new IntentFilter(com.commonsware.cwac.locpoll.LocationPollerParameter.INTENT_TO_BROADCAST_ON_COMPLETION_KEY);
    intentFilter.setPriority(1);
    registerReceiver(locationReceiver, intentFilter);
}

locationReceiver 如下所示:

private BroadcastReceiver locationReceiver = new BroadcastReceiver() {      
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, "mapActivity called");
        abortBroadcast();
    }
};

为了将有序广播发送到多个接收器,我已经修改LocationPollerService为使用sendOrderedBroadcast而不是sendBroadcast

public void onLocationChanged(Location location) {
      handler.removeCallbacks(onTimeout);
      Intent toBroadcast = createIntentToBroadcastOnCompletion();

      toBroadcast.putExtra(LocationPollerResult.LOCATION_KEY, location);        
      sendOrderedBroadcast(toBroadcast, null);
      quit();
}

现在的问题是我的动态注册接收器永远不会被调用,但 AndroidManifest.xml 中提到的接收器会:

    <receiver android:name=".receiver.LocationReceiver" />
    <receiver android:name="com.commonsware.cwac.locpoll.LocationPoller" />
    <service android:name="com.commonsware.cwac.locpoll.LocationPollerService" />
4

1 回答 1

2

您的问题在于IntentFilter您在 Java 中创建的内容与您的createIntentToBroadcastOnCompletion()实现之间存在脱节,而您的问题中并未包含该内容。您IntentFilter期待带有特定操作字符串的广播 -Intent您正在创建的createIntentToBroadcastOnCompletion()显然不包含此操作字符串。

顺便说一句,关于“为了向多个接收者发送广播”,sendBroadcast()完全能够向多个接收者发送广播。

于 2012-04-10T14:34:13.750 回答