web-dev-qa-db-ja.com

なぜPendingIntentがIntentのカスタムExtrasセットアップを返送しないのですか?

この質問は、私が探していた質問に何らかの形で関連しています startActivityForResultでエクストラを取り戻します しかし今、私は別の課題に直面しています。

ProximityAlertsを受信するようにサブスクライブし、いくつかのエクストラを含めるようにインテントを明示的に構築しました。しかし、私がサービスを受けたとき、エキストラはありません。

ここでの答えの後は作業コードです:

Intent intent = new Intent(this, PlacesProximityHandlerService.class);
intent.setAction("PlacesProximityHandlerService");
intent.putExtra("lat", objPlace.getLat());
intent.putExtra("lon", objPlace.getLon());
intent.putExtra("error_m", objPlace.getError()+ALERT_RANGE_IN_METERS);
PendingIntent sender=PendingIntent.getService(this, 0, intent, 0);
LocationUtils.addProximity(this, objPlace.getLat(), objPlace.getLon(),objPlace.getError()+ALERT_RANGE_IN_METERS, -1, sender);

ドキュメントには、param PendingIntent to be sent for each location updateと記載されています

34
Pentium10

不特定の理由により、setAction( "foo")などのアクションを設定した場合にのみ、エキストラが配信されます。 CommonsWareが参照する内容は、FLAG_ONE_SHOTを設定していない場合、PendingIntentインスタンスを取得する場合にのみ適用されます。これは、PendingIntent.get ...ファクトリメソッドのrequestCode引数で修正できます。ドキュメントには現在使用されていないと記載されていますが、PendingIntentsを区別する際に実際に考慮されます。

あなたの場合、ダミーのアクション文字列以外は何も設定する必要はありません。 LocationManagerServiceは、近接アラート用にサブスクライブしたPendingIntentを再利用し、電話がアラーム範囲に入った場合またはアラーム範囲から出た場合にのみフラグを追加します。

42
ognian

未処理のPendingIntentsが複数ある場合は、基になるIntentsがそれらの余分なものよりも異なることを確認する必要があります。それ以外の場合、Androidは、最初のPendingIntent用に作成した最初のIntentを再利用し続け、最初のIntentのエクストラを常に使用します。

たとえば、setAction()を介して一意のアクションを追加できます。これは(コンポーネントを指定しているため)Intentルーティングを変更しませんが、Intentsは異なります。

23
CommonsWare

私はこの問題を抱えていて、私が見つけた解決策は非常に単純でしたが、なぜそれが機能したのか説明できません。

当初、私の保留中の意図は次のようになりました。

     notificationIntent = new Intent(ctx, FragmentTabsPager.class);
     notificationIntent.setData(Uri.parse("content://com.sbs.mobile.workorder.WorkOrder/notes/"));
     notificationIntent.putExtra("NOTIFICATION", true);   
     notificationIntent.putExtra(WorkOrder.WorkOrderColumns.WORKORDERID, submessage);

このようなインテントを作成すると、通知がクリックされたときにエクストラは渡されず、受信アクティビティではエクストラマップは空になります。私はnotificationIntentを初期化する行に次の変更を加えました:

     notificationIntent = new Intent().setClass(ctx, FragmentTabsPager.class);

これで、受信アクティビティにエクストラが入力されます。繰り返しますが、これが機能する理由を説明することはできませんが、問題は解決しました。

7

答えはどれも私にはうまくいきませんでした。アクションを特定の文字列に設定することは初めて機能しますが、後で異なるエクストラで同じ通知を使用すると、機能しません。 setActionメソッドの文字列をランダムに生成された文字列に置き換えましたが、問題なく機能します。

_intent.setAction(new Random().nextInt(50) + "_action");
_
  • 通知を頻繁に使用する可能性があると思われる場合(別のファイルをダウンロードする場合など)、より大きな数をnextInt()に渡します。
2
Vahid Amiri

重要なのは、エクストラと固有のアクションをインテントに設定することですbefore呼び出し

PendingIntent sender=PendingIntent.getService(this, 0, intent, 0);

エクストラとアクションをインテントに設定した場合after上記を呼び出すと、機能しません。これはnot動作します:

Intent intent;  
PendingIntent sender=PendingIntent.getService(this, 0,   
   intent=new Intent(this, PlacesProximityHandlerService.class), 0);  

intent.setAction("PlacesProximityHandlerService");  
intent.putExtra("lat", objPlace.getLat());  
1
inor