0

BroadcastReceiver を使用せずに Service と Activity の間でデータを渡す方法を知りたいです。

これは私が作ることができないものです:

  1. ブロードキャストを介して定期的にインテントを送信するサービスがあります。
  2. ブロードキャストレシーバーを待たずに、必要なときにアクティビティからこのインテントのエクストラを取得したいと考えています。

私はこのコードを使用しようとしました:

  \\Service
  String BROADCAST_ACTION = "ACTION";
  Intent sendToUI = new Intent(BROADCAST_ACTION);
  sendToUI.putExtra("key", "value");
  sendBroadcast(sendToUI);


  \\Activity
  IntentFilter iF = new IntentFilter(MyService.BROADCAST_ACTION);
  Intent intent = c.registerReceiver(null, iF);
  Bundle extras = intent.getExtras();
  if(extras != null){
      String string = intent.getStringExtra("key");
 }

しかし、私は常にnullpointerexception理由を受け取ります(バンドルエクストラではなく、 LINEで受け取ります)。intentnullnullpointerexceptionIntent intent

4

2 に答える 2

4

このようにこれを行うには、定期的に送信するブロードキャストを「ぶらぶら」して、アクティビティが必要なときに取得できるようにする必要があります。

サービスでは、次のように、このブロードキャストを「スティッキー」として送信する必要があります。

// Service
String BROADCAST_ACTION = "ACTION";
Intent sendToUI = new Intent(BROADCAST_ACTION);
sendToUI.putExtra("key", "value");
sendStickyBroadcast(sendToUI);

この API を使用するには、BROADCAST_STICKY 権限を持っている必要があります。その権限を保持していない場合、SecurityException がスローされます。

編集:アクティビティがそれを読み取るためのコードを追加します:

// Activity
IntentFilter iF = new IntentFilter(MyService.BROADCAST_ACTION);
Intent intent = c.registerReceiver(null, iF);
if (intent != null && intent.hasExtra("key")) {
    String string = intent.getStringExtra("key");
    // Now do something with it...
}

また、「MyService.BROADCAST_ACTION」に使用している文字列を変更して、完全修飾パッケージ名を含めることをお勧めします。これは、「ACTION」だけを使用すると、スティッキーを送信している他のアプリケーションが存在する可能性があるためです。そのアクションでブロードキャストすると、意図したもの (つまり、サービスによって送信されたもの) を確実に取得できなくなります。(サービス クラスで) 次のようなものを使用します。

String BROADCAST_ACTION = "com.mycompany.myapplication.ACTION";
于 2012-07-10T11:07:04.223 に答える
0

これで試してみてください

extras.getStringExtra("key");

使いましたか

    @Override
    public void onReceive(Context context, Intent intent) {
    }
于 2012-07-10T10:59:07.657 に答える