Broadcast Receiver class and registerReceiver method

前端 未结 3 843
春和景丽
春和景丽 2020-11-30 05:53

Hi i am trying to understand Broadcast Receiver , i went through many sample codes , but still have some doubts. I wanted to know when we have to extend the Broadcast Receiv

相关标签:
3条回答
  • 2020-11-30 06:28

    In both cases BroadcastReceiver will be extended. In your second example you create so called anonymous class. New class has no specific name, that is why it's called so. Anyway this new class extends BroadcastReceiver and overrides onReceive() method.

    Now back to your question. There are two kinds of receivers - statically and dynamically defined ones.

    If you declare your receiver in AndroidManifest file, then it is statically defined. In this case you need to refer to a class implementing BroadcastReceiver by name. As you can see, you cannot use an anonymous class, because the last has no name. You have to explicitly implement a receiver. It's worth to mention, that in this case you do not use registerReceiver() method. Android does it for you automatically.

    If you declare receivers dynamically (for instance in activity's onResume() method), then you can use anonymous class for that. To register a receiver you call registerReceiver() method. You can also use a named class too. Both options are valid in this case.

    Hope this explains the difference.

    0 讨论(0)
  • 2020-11-30 06:46

    In both case you are creating object.But in first case there is not any reference for the receiver object so it can not be unregistered later but second one has so it can be unregistered after registering object using below methods:

    registerReceiver(intentReceiver );
    unregisterReceiver(intentReceiver );
    
    0 讨论(0)
  • 2020-11-30 06:51

    Android has intent action for broadcast receiver. BroadCast receiver will be trigger when it listen any action which registered within it.

    Now we will take one example : That we need to listen the action of "whenever any bluetooth device connect to our device". For that android has it fix action android.bluetooth.BluetoothDevice.ACTION_ACL_CONNECTED

    So you can get it via manifest & registration also

    BY Manifest Registration:

    Put this in your manifest

    <receiver android:name="MyBTReceiver">
        <intent-filter>
                    <action android:name="android.bluetooth.BluetoothDevice.ACTION_ACL_CONNECTED" />
          </intent-filter>
    </receiver>
    

    Create MyBTReceiver.class

    public class MyBTReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
    
            if(intent.getAction().equals("android.bluetooth.BluetoothDevice.ACTION_ACL_CONNECTED")){
                Log.d(TAG,"Bluetooth connect");
            }
        }
    }
    

    That was the simplest broadcast Receiver.

    Now, if you are only interested in receiving a broadcast while you are running, it is better to use registerReceiver(). You can also register it within your existing class file. you also need to unregister it onDestroy(). here, you dont need any broadcast registration in manifest except activity registration

    For example

    public class MainActivity extends Activity {
    
        IntentFilter filter1;
    
        @Override
        public void onCreate() {
            filter1 = new IntentFilter("android.bluetooth.BluetoothDevice.ACTION_ACL_CONNECTED");
            registerReceiver(myReceiver, filter1);
        }
    
        //The BroadcastReceiver that listens for bluetooth broadcasts
        private final BroadcastReceiver myReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                if(intent.getAction().equalsIgnoreCase("android.bluetooth.BluetoothDevice.ACTION_ACL_CONNECTED")) {
                    Log.d(TAG,"Bluetooth connect");
                }
            }
        };
    
        @Override
        public void onDestroy() {
            unregisterReceiver(myReceiver);
        }
    }
    
    0 讨论(0)
提交回复
热议问题