BroadcastReceiver(有序广播篇)

BroadcastReceiver 所对应的广播分两类: 普通广播 有序广播
普通广播 通过 Context.sendBroadcast() 方法来发送。它是完全异步的。
所有的receivers接收器的执行顺序不确定。    因此,所有的receivers接收器接收broadcast的顺序不确定。
这种方式效率更高。但是 BroadcastReceiver 无法使用 setResult系列 getResult系列 abort系列API
有序广播 是通过 Context.sendOrderedBroadcast 来发送。所有的receiver依次执行。
BroadcastReceiver可以使用setResult系列函数结果传给下一个BroadcastReceiver,通过getResult系列函数来取得上个BroadcastReceiver返回的结果,并可以abort系列函数来让系统丢弃该广播让,使用该广播不再传送到别的 BroadcastReceiver
可以通过在 intent-filter 中设置 android:priority 属性来设置receiver的优先级。 优先级相同的receiver其执行顺序不确定。
如果 BroadcastReceiver 是代码中注册的话,且其 intent-filter 拥有 相同 android:priority 属性 的话,先注册的将先收到广播。
主要函数
Public Methods
final void abortBroadcast()
Sets the flag indicating that this receiver should abort the current broadcast; only works with broadcasts sent through Context.sendOrderedBroadcast.
final void clearAbortBroadcast()
Clears the flag indicating that this receiver should abort the current broadcast.
final boolean getAbortBroadcast()
Returns the flag indicating whether or not this receiver should abort the current broadcast.
final boolean getDebugUnregister()
Return the last value given to  setDebugUnregister(boolean).
final int getResultCode()
Retrieve the current result code, as set by the previous receiver.
final  String getResultData()
Retrieve the current result data, as set by the previous receiver.
final  Bundle getResultExtras(boolean makeMap)
Retrieve the current result extra data, as set by the previous receiver.
final  BroadcastReceiver.PendingResult goAsync()
This can be called by an application in  onReceive(Context, Intent) to allow it to keep the broadcast active after returning from that function.
final boolean isInitialStickyBroadcast()
Returns true if the receiver is currently processing the initial value of a sticky broadcast -- that is, the value that was last broadcast and is currently held in the sticky cache, so this is not directly the result of a broadcast right now.
final boolean isOrderedBroadcast()
Returns true if the receiver is currently processing an ordered broadcast.
abstract void onReceive( Context context,  Intent intent)
This method is called when the BroadcastReceiver is receiving an Intent broadcast.
IBinder peekService( Context myContext,  Intent service)
Provide a binder to an already-running service.
final void setDebugUnregister(boolean debug)
Control inclusion of debugging help for mismatched calls to {@ Context#registerReceiver(BroadcastReceiver, IntentFilter) Context.registerReceiver()}.
final void setOrderedHint(boolean isOrdered)
For internal use, sets the hint about whether this BroadcastReceiver is running in ordered mode.
final void setResult(int code,  String data,  Bundle extras)
Change all of the result data returned from this broadcasts; only works with broadcasts sent through Context.sendOrderedBroadcast.
final void setResultCode(int code)
Change the current result code of this broadcast; only works with broadcasts sent through Context.sendOrderedBroadcast.
final void setResultData( String data)
Change the current result data of this broadcast; only works with broadcasts sent through Context.sendOrderedBroadcast.
final void setResultExtras( Bundle extras)
Change the current result extras of this broadcast; only works with broadcasts sent through Context.sendOrderedBroadcast.
以下是一个关于 有序广播 的实例。
实例1:
MainActivity.java文件
package com.teleca.robin.BroadcastReceiverExample;

import com.teleca.R;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class  MainActivity  extends Activity {
TextView tv=null;
     @Override
     public void   onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main0);
        tv=(TextView)findViewById(R.id.TextView1);
        Button button = (Button) findViewById(R.id.Button1);
        
        OnClickListener listener = new OnClickListener() {
         public void onClick(View v) {
           sendBroadcast();
         }
        };
        button.setOnClickListener(listener);
    }
     protected void  onResume()
    {
     super.onResume();
     registerMyReceivers();
    }
     protected void  onStop()
    {
     unRegisterMyReceivers();
     super.onStop();
    }
     final static  String ACTION_HELLO="com.teleca.robin.action.HELLO";
    final static String KEY_ORDER_DETAIL="orderDetail";
     void  sendBroadcast()
    {
        Intent intent=new Intent(ACTION_HELLO);
        String receiverPermission=null;
        Handler scheduler=null;
        int initialCode=0;
        String initialData=null;
        Bundle initialExtras=new Bundle();
        sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler, 
         initialCode, initialData, initialExtras);
    }
    BroadcastReceiver receiverArray[]=new MyBroadcastReceiver[50];
     void  registerMyReceivers()
    {
     int k=receiverArray.length;

     int priority=IntentFilter.SYSTEM_LOW_PRIORITY;
     for (int i=0;i<k;i++)
     {
     receiverArray[i]=new MyBroadcastReceiver();
         IntentFilter filter=new IntentFilter(ACTION_HELLO);
         filter.setPriority(priority);
     registerReceiver(receiverArray[i], filter);
     if((i+1)%5==0)
     priority++;
     }
    
    }
     void   unRegisterMyReceivers ()
    {
     int k=receiverArray.length;
     for (int i=0;i<k;i++)
     {
     if(receiverArray[i]!=null)
     {
     unregisterReceiver(receiverArray[i]);
     receiverArray[i]=null;
     }
     }
    }
     final static  String tag="robin";
    BroadcastReceiver resultReceiver=new BroadcastReceiver() {
     @Override
     public void  onReceive(Context arg0, Intent intent) {
     // TODO Auto-generated method stub
     StringBuffer strBuffer=new StringBuffer();
     int count= getResultCode();
     strBuffer.append("there are "+count+" student\n");
     strBuffer.append("the older are :"+ getResultData() +"\n");
     strBuffer.append("the detail older are :"+ getResultExtras (true).getString(KEY_ORDER_DETAIL));
     tv.setText(strBuffer.toString());
     }

    };
}
MyBroadcastReceiver.java文件
package com.teleca.robin.BroadcastReceiverExample;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

class  MyBroadcastReceiver extends BroadcastReceiver {
static int SN=0;
int id=SN++;
final static String tag="robin";
@Override
public void  onReceive(Context arg0, Intent intent) {
// TODO Auto-generated method stub
if(intent.getAction().equals(MainActivity.ACTION_HELLO))
{
int count= getResultCode() +1;
setResultCode (count);
Log.i(tag,"this is student"+id);
String str= getResultData ();
if(str==null)
str=""+id;
else
str=str+" "+id;
setResultData (str);
Bundle b= getResultExtras(true) ;
str=b.getString(MainActivity.KEY_ORDER_DETAIL);
if(str==null)
str=""+id;
else
str=str+"->"+id;
b.putString(MainActivity.KEY_ORDER_DETAIL, str);
Log.i(tag,"str:"+str);
setResultExtras(b);
}
}

}
main0.xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/root"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:background="#FF0000FF"
    android:minHeight="50dip"
    android:text="@string/BroadcastReceiverExample"
     android:id="@+id/TextView1"
    />
<Button android:text="@string/pressme" 
android:id="@+id/Button1" 
android:layout_width="wrap_content" android:layout_height="wrap_content"
></Button>
</LinearLayout>
AndroidManifest.xml中
<activity android:name="com.teleca.robin.BroadcastReceiverExample.MainActivity"
  android:label="@string/app_name"
          >
             <intent-filter>
                <action android:name="com.teleca.robin.Hello" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

你可能感兴趣的:(BroadcastReceiver(有序广播篇))