Sunday, June 26, 2016

registerReceiver (BroadcastReceiver, IntentFilter) Android Example

This example is about using registerReceiver and unregisterReceiver methods to use BroadcastReceiver programmatically. When BroadcastReceiver is registered in this way it's not declared in the AndroidManifest.xml file.

This application project has one Activity file and it register BroadcastReceiver to obtain battery level change information. Broadcast action ACTION_BATTERY_CHANGED is used by Android system to broadcast battery level changing information. Therefore that is used in this project.

Below source code is about implementation of the class BatteryChangedReceiver that extends from BroadcastReceiver. It receive battery change information and extra data on that intent are got by using the class BatteryManager. BatteryManager class has definitions of extra data that are sent with aforementioned broadcast action. Once onReceive(Context, Intent) method receives that data they are shown as Toast.

BatteryChangedReceiver Implementation

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.os.BatteryManager; 
import android.widget.Toast; 
 
public class BatteryChangedReceiver extends BroadcastReceiver { 
   public BatteryChangedReceiver() {
   } 
 
   @Override
   public void onReceive(Context context, Intent intent) { 
      if (intent.getAction().equals(Intent.ACTION_BATTERY_CHANGED)) { 
         int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 
         int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
         Toast.makeText(context, "Level = "+level+", 
                        Scale = "+scale, Toast.LENGTH_LONG).show();
      }
   }
}

Above BroadcastReceiver is registered in the class MainActivity. That source code is this.

MainActivity Implementation

public class MainActivity extends AppCompatActivity { 
 
   private BatteryChangedReceiver batteryChangedReceiver; 
   private IntentFilter intentFilter; 
 
   @Override
   protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main); 
 
      batteryChangedReceiver = new BatteryChangedReceiver(); 
      intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
   } 
 
   @Override
   protected void onResume() { 
      super.onResume();
      registerReceiver(batteryChangedReceiver, intentFilter);
   } 
 
   @Override
   protected void onPause() {
      unregisterReceiver(batteryChangedReceiver);
      super.onPause();
   }
}

An instance of the BatteryChangedReceiver is created to be used as first argument to registerReceiver() method. This method needs IntentFilter object for second argument to register BroadcastReceiver provided with first argument for a specific Intent. So both objects for first and second arguments are created in onCreate() method.
 
   batteryChangedReceiver = new BatteryChangedReceiver(); 
   intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);

The method registerReceiver() is called in onResume() to register BroadcastReceiver. 
 
protected void onResume() { 
   super.onResume();
   registerReceiver(batteryChangedReceiver, intentFilter);
} 

As the BroadcastReceiver is registered in the onResume() it must be unregistered onPause(). Otherwise error will be occurred for leaking BroadcastReceiver. A BroadcastReceiver must be unregistered as many as it is registered.
 
@Override 
protected void onPause() {
   unregisterReceiver(batteryChangedReceiver); 
   super.onPause();
}

If onStop() is used to register BroadcastReceiver it must be unregistered in onStop().

Reference
  • https://developer.android.com/reference/android/content/Context.html#registerReceiver(android.content.BroadcastReceiver,%20android.content.IntentFilter)
  • https://developer.android.com/reference/android/content/Context.html#unregisterReceiver(android.content.BroadcastReceiver)
  • https://developer.android.com/reference/android/content/Intent.html#ACTION_BATTERY_CHANGED
  • https://developer.android.com/reference/android/os/BatteryManager.html

2 comments:

  1. Nice explain.
    Can you share the code to receive data from multiple devices?

    ReplyDelete
    Replies
    1. What exactly do you want to learn, is it sending & receiving data from one device to another device ?

      Delete