web-dev-qa-db-ja.com

android)でブロードキャストレシーバーを動的に登録/登録解除します

レシーバークラスをブロードキャストに動的に登録および登録解除したい: "Android.net.wifi.STATE_CHANGE"これは、マニフェストでこれを行うと非常にうまく機能します。しかし、これはそれを静的にします。アクティビティクラスで動的に実行したいと思います。アクティビティクラスの対応するコマンドは何ですか?

これが私のコードです...そして、受信機(サービスを開始している)の登録と登録解除(複数回)が原因で問題が発生しています。

public class startScreen extends Activity {
    /** Called when the activity is first created. */

    private BroadcastReceiver receiver = new BroadcastReceiver() {    

        @Override
        public void onReceive(Context context, Intent intent) {
            Intent serviceIntent = new Intent();
            serviceIntent.setAction("com.example.MyService");
            context.startService(serviceIntent);    
        }    
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.initial);

        final IntentFilter filter = new IntentFilter();
        filter.addAction("Android.net.wifi.STATE_CHANGE");   

        Button button = (Button) findViewById(R.id.button1);
        final ToggleButton toggleButton = (ToggleButton) findViewById(R.id.toggleButton1);

        try {
                ...some code...
            if (bool == true) {
                toggleButton.setChecked(true);
                this.registerReceiver(receiver, filter);
            } else
                toggleButton.setChecked(false);
        } catch (Exception e) {
            Log.e("Error", "Database", e);
        } finally {
                ...
        }

        toggleButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                if ((toggleButton.isChecked())) {
                    getBaseContext().registerReceiver(receiver, filter);

                } else {
                    if (receiver != null) {
                        getBaseContext().unregisterReceiver(receiver);
                        receiver = null;
                    }

                }
            }
        });
    }    

    @Override
    protected void onResume() {
        super.onResume();
        if (bool == true) {
            if (receiver == null)
                this.registerReceiver(receiver, filter);
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (receiver != null) {
            this.unregisterReceiver(receiver);
            receiver = null;
        }
    }
}
8
Sid

LocalBroadcastManagerクラスは、プロセス内のローカルオブジェクトにインテントのブロードキャストを登録して送信するために使用されます。イベントがアプリケーションを離れないため、これはより高速で安全です。

次の例は、my-eventという顧客イベントに登録するアクティビティを示しています。

@Override
public void onResume() {
super.onResume();

   // Register mMessageReceiver to receive messages.
   LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
     new IntentFilter("my-event"));
}

// handler for received Intents for the "my-event" event 
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
   // Extract data included in the Intent
   String message = intent.getStringExtra("message");
   Log.d("receiver", "Got message: " + message);
 }
};

@Override
protected void onPause() {
   // Unregister since the activity is not visible
   LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
   super.onPause();
} 
// This method is assigned to button in the layout
// via the onClick property
public void onClick(View view) {
   sendMessage();
}

// Send an Intent with an action named "my-event". 
private void sendMessage() {
  Intent intent = new Intent("my-event");
  // add data
  intent.putExtra("message", "data");
  LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
} 
11
Jebasuthan

以下の方法を使用して、レシーバーを登録/登録解除します。

registerReceiver(BroadcastReceiver receiver, new IntentFilter("Android.net.wifi.STATE_CHANGE"));
unregisterReceiver(BroadcastReceiver receiver);

参考までに this をご覧ください

7
Permita

ブロードキャストファイルのonReceiveにダイナミックブロードキャストレシーバーを追加しないでください。アプリケーションの最初のアクティビティまたはメインアクティビティに追加します。アプリケーションが開いているときにのみ必要な場合。ただし、必要な場合は常に応答を受け取り、マニフェストファイルに追加するだけです

主な活動に動的放送受信機を登録する

MyReceiver reciver;

@Override
protected void onResume() {
    super.onResume();
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction("Android.net.wifi.WIFI_STATE_CHANGED");
    intentFilter.addAction("Android.net.wifi.STATE_CHANGE");
    reciver = new MyReceiver();
    registerReceiver(reciver, intentFilter);
}

アクティビティの停止または終了時にそのブロードキャストレシーバーの登録を解除します

@Override
protected void onStop() {
    super.onStop();
    unregisterReceiver(reciver);
}

少し手遅れかもしれませんが、問題は、onPauseメソッドでreceiver = nullを設定し、それを再度設定しないことにあります。また、それをonResumeメソッドに登録しようとしていますが、それがnullである場合に限り、これも意味がありません。

レシーバーのnull値を設定/テストするロジックを変更して、代わりにboolean変数を使用してレシーバーのステータスを追跡する必要があります(登録されているかどうか)。

0
Jorge Galvão