レシーバークラスをブロードキャストに動的に登録および登録解除したい: "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;
}
}
}
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);
}
以下の方法を使用して、レシーバーを登録/登録解除します。
registerReceiver(BroadcastReceiver receiver, new IntentFilter("Android.net.wifi.STATE_CHANGE"));
unregisterReceiver(BroadcastReceiver receiver);
参考までに this をご覧ください
ブロードキャストファイルの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
変数を使用してレシーバーのステータスを追跡する必要があります(登録されているかどうか)。