Wednesday, January 15, 2014

Ordered broadcast receiver assignment: android tutorial

Program description:

This is an assignment program on using ordered broadcast receiver. This assignment has 2 applications. 


Assignment description: 
First application is having one activity, and 2 broadcast receivers (static).
Both the receivers have an intent filter with action "com.techpalle.action.ORDERED".
But Receiver1 has android:priority="1", and Receiver2 has android:priority="3".
In this first application first activity has a button to send ordered broadcast with action "com.techpalle.action.ORDERED". 

As you already know there are 3 types of broadcast receivers are there in android.

Note: More the priority number, higher the priority. Higher priority receivers will be executed first.

Second application has one activity, and 1 broadcast receiver (static).
This receiver has intent filter with same action "com.techpalle.action.ORDERED".
This Receiver3 has android:priority="2".

Assumption: It is assumed that the second application should be already in the phone or emulator. So make sure that you first run the second application and then first application.

Now once user runs the first application, and clicks the button on the first activity it will send an ordered broadcast. Now there are 3 receivers are matching with the intent action in their intent-filter. So all the 3 broadcast receiver's onReceive()  method will be executed.

But since we are using ordered broadcast, first highest priority receiver will be executed. 

So Receiver2 of application1 will get executed first. (priority 3)
In the Receiver2, we are generating a random number between 0 to 100, and passing this as data to next receiver. (by using setResultCode() method).

Receiver3 of second application has next priority (priority 2), so that receiver will be called.
In the Receiver3 we will receive the data send by Receiver2 of first application. (by using getResultCode() method).

In the Receiver3 we will check if the data is even or odd. If it is even then we are stopping that broadcast in Receiver3 itself by using abortBroadCast() method. If not Receiver1 of first application will continue.

First Application's First Activity:

package com.techpalle.b15_rcvr_asg2;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {
 Button b;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  b = (Button) findViewById(R.id.button1);
  b.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
    Intent in = new Intent();
    in.setAction("com.techpalle.action.ORDERED");
    sendOrderedBroadcast(in, null);    
   }
  });
 }

}

First Application's Broadcast Receiver 1:

package com.techpalle.b15_rcvr_asg2;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class Recvr1 extends BroadcastReceiver {

 @Override
 public void onReceive(Context context, Intent intent) {
     int data = getResultCode();
     Toast.makeText(context, "receiver 1..data.."+data, 0).show();
 }
}

First Application's Broadcast Receiver 2:
package com.techpalle.b15_rcvr_asg2;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class Recvr2 extends BroadcastReceiver {

 @Override
 public void onReceive(Context context, Intent intent) {
  Toast.makeText(context, "receiver 2..", 0).show();
     int ran = (int) (Math.random()*100);
     setResultCode(ran);
 }
}

xml file for first activity 
File name : activity_main.xml
 <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=".MainActivity" >  
   <TextView  
     android:id="@+id/textView1"  
     android:layout_width="wrap_content"  
     android:layout_height="wrap_content"  
     android:text="@string/hello_world" />  
   <Button  
     android:id="@+id/button1"  
     android:layout_width="wrap_content"  
     android:layout_height="wrap_content"  
     android:layout_alignLeft="@+id/textView1"  
     android:layout_below="@+id/textView1"  
     android:text="Send Broadcast" />  
 </RelativeLayout>  

First application's Manifest file (to check the priorities of the receivers)
File name : AndroidManifest.xml

 <?xml version="1.0" encoding="utf-8"?>  
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
   package="com.techpalle.b15_rcvr_asg2"  
   android:versionCode="1"  
   android:versionName="1.0" >  
   <uses-sdk  
     android:minSdkVersion="8"  
     android:targetSdkVersion="17" />  
   <application  
     android:allowBackup="true"  
     android:icon="@drawable/ic_launcher"  
     android:label="@string/app_name"  
     android:theme="@style/AppTheme" >  
     <activity  
       android:name="com.techpalle.b15_rcvr_asg2.MainActivity"  
       android:label="@string/app_name" >  
       <intent-filter>  
         <action android:name="android.intent.action.MAIN" />  
         <category android:name="android.intent.category.LAUNCHER" />  
       </intent-filter>  
     </activity>  
     <receiver android:name="Recvr1">  
       <intent-filter android:priority="1">  
         <action android:name="com.techpalle.action.ORDERED"/>  
       </intent-filter>  
     </receiver>  
     <receiver android:name="Recvr2">  
       <intent-filter android:priority="3">  
          <action android:name="com.techpalle.action.ORDERED"/>  
       </intent-filter>  
     </receiver>  
   </application>  
 </manifest>  

Second Application's First Activity:

package com.techpalle.b15_rcvr_asg2_app2;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

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

Second Application's Broadcast Receiver 3:

package com.techpalle.b15_rcvr_asg2_app2;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class Recvr3 extends BroadcastReceiver {

 @Override
 public void onReceive(Context context, Intent intent) {
     int data = getResultCode();
     if(data % 2 != 0){
      abortBroadcast();
     }
     Toast.makeText(context, "receiver 3..data.."+data, 0).show();
 }

}

Second application's Manifest file (to see the priority)
File name : AndroidManifest.xml

 <?xml version="1.0" encoding="utf-8"?>  
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
   package="com.techpalle.b15_rcvr_asg2_app2"  
   android:versionCode="1"  
   android:versionName="1.0" >  
   <uses-sdk  
     android:minSdkVersion="8"  
     android:targetSdkVersion="17" />  
   <application  
     android:allowBackup="true"  
     android:icon="@drawable/ic_launcher"  
     android:label="@string/app_name"  
     android:theme="@style/AppTheme" >  
     <activity  
       android:name="com.techpalle.b15_rcvr_asg2_app2.MainActivity"  
       android:label="@string/app_name" >  
       <intent-filter>  
         <action android:name="android.intent.action.MAIN" />  
         <category android:name="android.intent.category.LAUNCHER" />  
       </intent-filter>  
     </activity>  
     <receiver android:name="Recvr3">  
       <intent-filter android:priority="2">  
         <action android:name="com.techpalle.action.ORDERED"/>  
       </intent-filter>  
     </receiver>  
   </application>  
 </manifest>  

Download complete code : Click to download

Android interview questions on Ordered broadcast receivers:
Difference between Normal broadcast, ordered broadcast, and sticky broadcast?

Tags: android, ordered, broadcast receivers, priority

No comments:

Post a Comment