Android BroadcastReceiver Example Tutorial

Filed Under: Android

Today we’ll discuss and implement Android BroadcastReceiver that is a very important component of Android Framework.

Android BroadcastReceiver

Android BroadcastReceiver is a dormant component of android that listens to system-wide broadcast events or intents.

When any of these events occur it brings the application into action by either creating a status bar notification or performing a task.

Unlike activities, android BroadcastReceiver doesn’t contain any user interface. Broadcast receiver is generally implemented to delegate the tasks to services depending on the type of intent data that’s received.

Following are some of the important system wide generated intents.

  1. android.intent.action.BATTERY_LOW : Indicates low battery condition on the device.
  2. android.intent.action.BOOT_COMPLETED : This is broadcast once, after the system has finished booting
  3. android.intent.action.CALL : To perform a call to someone specified by the data
  4. android.intent.action.DATE_CHANGED : The date has changed
  5. android.intent.action.REBOOT : Have the device reboot
  6. android.net.conn.CONNECTIVITY_CHANGE : The mobile network or wifi connection is changed(or reset)

Broadcast Receiver in Android

To set up a Broadcast Receiver in android application we need to do the following two things.

  1. Creating a BroadcastReceiver
  2. Registering a BroadcastReceiver

Creating a BroadcastReceiver

Let’s quickly implement a custom BroadcastReceiver as shown below.


public class MyReceiver extends BroadcastReceiver {
    public MyReceiver() {
    }
 
    @Override
    public void onReceive(Context context, Intent intent) {
      
        Toast.makeText(context, "Action: " + intent.getAction(), Toast.LENGTH_SHORT).show();
    }
}

BroadcastReceiver is an abstract class with the onReceiver() method being abstract.

The onReceiver() method is first called on the registered Broadcast Receivers when any event occurs.

The intent object is passed with all the additional data. A Context object is also available and is used to start an activity or service using context.startActivity(myIntent); or context.startService(myService); respectively.

Registering the BroadcastReceiver in android app

A BroadcastReceiver can be registered in two ways.

  1. By defining it in the AndroidManifest.xml file as shown below.
  2. 
    <receiver android:name=".ConnectionReceiver" >
                 <intent-filter>
                     <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                 </intent-filter>
    </receiver>
    

    Using intent filters we tell the system any intent that matches our subelements should get delivered to that specific broadcast receiver.

  3. By defining it programmatically
  4. Following snippet shows a sample example to register broadcast receiver programmatically.

    
    IntentFilter filter = new IntentFilter();
    intentFilter.addAction(getPackageName() + "android.net.conn.CONNECTIVITY_CHANGE");
     
    MyReceiver myReceiver = new MyReceiver();
    registerReceiver(myReceiver, filter);
    

To unregister a broadcast receiver in onStop() or onPause() of the activity the following snippet can be used.


@Override
protected void onPause() {
    unregisterReceiver(myReceiver);
    super.onPause();
}

Sending Broadcast intents from the Activity

The following snippet is used to send an intent to all the related BroadcastReceivers.


Intent intent = new Intent();
      intent.setAction("com.journaldev.CUSTOM_INTENT");
      sendBroadcast(intent);

Don’t forget to add the above action in the intent filter tag of the manifest or programmatically.

Let’s develop an application that listens to network change events and also to a custom intent and handles the data accordingly.

BroadcastReceiver in Android Project Structure

android broadcastreceiver example, BroadcastReceiver in Android

Android BroadcastReceiver Code

The activity_main.xml consists of a button at the centre that sends a broadcast intent.


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.journaldev.broadcastreceiver.MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/button"
        android:text="Send Broadcast"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true" />
</RelativeLayout>

The MainActivity.java is given below.


package com.journaldev.broadcastreceiver;

import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import butterknife.ButterKnife;
import butterknife.InjectView;
import butterknife.OnClick;

public class MainActivity extends AppCompatActivity {
    ConnectionReceiver receiver;
    IntentFilter intentFilter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ButterKnife.inject(this);

        receiver = new ConnectionReceiver();
        intentFilter = new IntentFilter("com.journaldev.broadcastreceiver.SOME_ACTION");

    }

    @Override
    protected void onResume() {
        super.onResume();
        registerReceiver(receiver, intentFilter);

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        unregisterReceiver(receiver);
    }

    @OnClick(R.id.button)
    void someMethod() {

        Intent intent = new Intent("com.journaldev.broadcastreceiver.SOME_ACTION");
        sendBroadcast(intent);
    }
}

In the above code we’ve registered another custom action programmatically.

The ConnectionReceiver is defined in the AndroidManifest.xml file as below.


<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.journaldev.broadcastreceiver">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name=".ConnectionReceiver">
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
        </receiver>

    </application>
</manifest>

The ConnectionReceiver.java class is defined below.


public class ConnectionReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

        Log.d("API123",""+intent.getAction());

        if(intent.getAction().equals("com.journaldev.broadcastreceiver.SOME_ACTION"))
            Toast.makeText(context, "SOME_ACTION is received", Toast.LENGTH_LONG).show();

        else {
            ConnectivityManager cm =
                    (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

            NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
            boolean isConnected = activeNetwork != null &&
                    activeNetwork.isConnectedOrConnecting();
            if (isConnected) {
                try {
                    Toast.makeText(context, "Network is connected", Toast.LENGTH_LONG).show();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else {
                Toast.makeText(context, "Network is changed or reconnected", Toast.LENGTH_LONG).show();
            }
        }
    }

}

In the above code we check the intent action that triggers the onReceive() method and based on that display the toast.

Note: To make the broadcast receiver unavailable to external applications, add the attribute android:exported=false in the manifest. When we send a broadcast, it is possible for the external applications too to receive them. This can be prevented by specifying this limitation.

The output app in action is given below.
android broadcast receiver app

This brings an end android BroadcastReceiver tutorial. You can download the final BroadcastReceivers project from the link below.

Comments

  1. rajkumar prajapati says:

    this project is very helpful to us

  2. worku says:

    thank you for all your work!

  3. Ryan Darren Morales says:

    Seems the whole tutorial wont work on Android Oreo versions.

    1. Anupam says:

      Hi Ryan,
      You are correct. Android Oreo has changed the way background services and broadcast receiver work. Tutorials on the same would be out soon. I’ll reply the link of it in this thread so that you don’t miss it.

      1. Narendra Karmakar says:

        Please share the codes for android Oreo version

      2. fang says:

        I am expecting it. Greatly appreciate!

  4. Ashwath Rao B says:

    Please change the onReceiver() method to onReceive() method above as it is not correct.

  5. Ivan Kravchuk says:

    Cool article man!

  6. prashanth yejje says:

    receiver is not firing when i change the networkconnection(Internet) state.

    I’m using this ==== > android:name=”android.net.conn.CONNECTIVITY_CHANGE”

    but this is not working when targetSdkVersion=”26″

    could you please help me to solve this.

  7. Pramod HN says:

    how to programaticaly register to the other application broadcast receiver.
    for example App1 programaticaly register to the broadcastreceiver present in App2

  8. Youssef says:

    Can someone please give me a good and detailed explanation of when to use broadcast in Android? Why not use normal intents instead? I have seen someone use normal intents to go from one app to another.. So when do we actually need broadcast intents and receivers instead of just normal intents?

    1. Anupam says:

      To sum up, BroadcastReceivers in used to “receive” events. Intents are one among those event types.

  9. xyz says:

    How any app or component detect that particular broadcast receiver is performing.
    And how to get broadcasted data .

  10. xyz says:

    If i want to get data from services to activity with using broadcast receiver then what to do ? Please reply very earlier !

  11. Rishabh Sharma says:

    Thanks for the above code.
    Sir, can you please tell me how to run a service after some equal time intervals.

    Thank you

    1. Mehran Roodsaz says:

      I use ScheduledExecutorService

      e.g

      public class TestService extends IntentService {

      public LoadSchedulesService() {
      super(“LoadSchedulesService”);
      }

      @Override
      protected void onHandleIntent(Intent intent) {

      ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
      scheduler.scheduleAtFixedRate(new Runnable() {
      public void run() {
      Log.d(this.getClass().getCanonicalName(), “test”);

      }
      }, 0, 3, TimeUnit.SECONDS);
      }
      }

Leave a Reply

Your email address will not be published. Required fields are marked *

close
Generic selectors
Exact matches only
Search in title
Search in content
Search in posts
Search in pages