1

私はcwac-LocationPoller(ここから)を使用して、ユーザーの場所を常にポーリングし、場所に基づく通知を表示しています。BroadcastReceiverこれはすべて正常に機能していますが、アプリケーションがフォアグラウンドにある場合、通知を表示する代わりに、現在のユーザーの場所にGoogleマップをアニメーション化するために、別のものをアタッチしようとしています。しかし、どういうわけか私はそれを動かすことができません。

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使用するように変更しましたsendOrderedBroadcastsendBroadcast

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 に答える