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
<nobr style="line-height:21px">final void</nobr> <nobr style="line-height:21px"><span style="line-height:21px; margin-right:2px"><a rel="nofollow" href="http://developer.android.com/reference/android/content/BroadcastReceiver.html#abortBroadcast()" style="color:rgb(0,102,153); line-height:21px; text-decoration:none">abortBroadcast</a></span>()</nobr>
Sets the flag indicating that this receiver should abort the current broadcast; only works with broadcasts sent through Context.sendOrderedBroadcast.
<nobr style="line-height:21px">final void</nobr> <nobr style="line-height:21px"><span style="line-height:21px; margin-right:2px"><a rel="nofollow" href="http://developer.android.com/reference/android/content/BroadcastReceiver.html#clearAbortBroadcast()" style="color:rgb(0,102,153); line-height:21px; text-decoration:none">clearAbortBroadcast</a></span>()</nobr>
Clears the flag indicating that this receiver should abort the current broadcast.
<nobr style="line-height:21px">final boolean</nobr> <nobr style="line-height:21px"><span style="line-height:21px; margin-right:2px"><a rel="nofollow" href="http://developer.android.com/reference/android/content/BroadcastReceiver.html#getAbortBroadcast()" style="color:rgb(0,102,153); line-height:21px; text-decoration:none">getAbortBroadcast</a></span>()</nobr>
Returns the flag indicating whether or not this receiver should abort the current broadcast.
<nobr style="line-height:21px">final boolean</nobr> <nobr style="line-height:21px"><span style="line-height:21px; margin-right:2px"><a rel="nofollow" href="http://developer.android.com/reference/android/content/BroadcastReceiver.html#getDebugUnregister()" style="color:rgb(0,102,153); line-height:21px; text-decoration:none">getDebugUnregister</a></span>()</nobr>
Return the last value given to setDebugUnregister(boolean).
<nobr style="line-height:21px">final int</nobr> <nobr style="line-height:21px"><span style="line-height:21px; margin-right:2px"><a rel="nofollow" href="http://developer.android.com/reference/android/content/BroadcastReceiver.html#getResultCode()" style="color:rgb(0,102,153); line-height:21px; text-decoration:none">getResultCode</a></span>()</nobr>
Retrieve the current result code, as set by the previous receiver.
<nobr style="line-height:21px">final<a rel="nofollow" href="http://developer.android.com/reference/java/lang/String.html" style="color:rgb(0,102,153); line-height:21px; text-decoration:none">String</a></nobr> <nobr style="line-height:21px"><span style="line-height:21px; margin-right:2px"><a rel="nofollow" href="http://developer.android.com/reference/android/content/BroadcastReceiver.html#getResultData()" style="color:rgb(0,102,153); line-height:21px; text-decoration:none">getResultData</a></span>()</nobr>
Retrieve the current result data, as set by the previous receiver.
<nobr style="line-height:21px">final<a rel="nofollow" href="http://developer.android.com/reference/android/os/Bundle.html" style="color:rgb(0,102,153); line-height:21px; text-decoration:none">Bundle</a></nobr> <nobr style="line-height:21px"><span style="line-height:21px; margin-right:2px"><a rel="nofollow" href="http://developer.android.com/reference/android/content/BroadcastReceiver.html#getResultExtras(boolean)" style="color:rgb(0,102,153); line-height:21px; text-decoration:none">getResultExtras</a></span>(boolean makeMap)</nobr>
Retrieve the current result extra data, as set by the previous receiver.
<nobr style="line-height:21px">final<a rel="nofollow" href="http://developer.android.com/reference/android/content/BroadcastReceiver.PendingResult.html" style="color:rgb(0,102,153); line-height:21px; text-decoration:none">BroadcastReceiver.PendingResult</a></nobr> <nobr style="line-height:21px"><span style="line-height:21px; margin-right:2px"><a rel="nofollow" href="http://developer.android.com/reference/android/content/BroadcastReceiver.html#goAsync()" style="color:rgb(0,102,153); line-height:21px; text-decoration:none">goAsync</a></span>()</nobr>
This can be called by an application in onReceive(Context, Intent)to allow it to keep the broadcast active after returning from that function.
<nobr style="line-height:21px">final boolean</nobr> <nobr style="line-height:21px"><span style="line-height:21px; margin-right:2px"><a rel="nofollow" href="http://developer.android.com/reference/android/content/BroadcastReceiver.html#isInitialStickyBroadcast()" style="color:rgb(0,102,153); line-height:21px; text-decoration:none">isInitialStickyBroadcast</a></span>()</nobr>
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.
<nobr style="line-height:21px">final boolean</nobr> <nobr style="line-height:21px"><span style="line-height:21px; margin-right:2px"><a rel="nofollow" href="http://developer.android.com/reference/android/content/BroadcastReceiver.html#isOrderedBroadcast()" style="color:rgb(0,102,153); line-height:21px; text-decoration:none">isOrderedBroadcast</a></span>()</nobr>
Returns true if the receiver is currently processing an ordered broadcast.
<nobr style="line-height:21px">abstract void</nobr> <nobr style="line-height:21px"><span style="line-height:21px; margin-right:2px"><a rel="nofollow" href="http://developer.android.com/reference/android/content/BroadcastReceiver.html#onReceive(android.content.Context,%20android.content.Intent)" style="color:rgb(0,102,153); line-height:21px; text-decoration:none">onReceive</a></span>(<a rel="nofollow" href="http://developer.android.com/reference/android/content/Context.html" style="color:rgb(0,102,153); line-height:21px; text-decoration:none">Context</a>context,<a rel="nofollow" href="http://developer.android.com/reference/android/content/Intent.html" style="color:rgb(0,102,153); line-height:21px; text-decoration:none">Intent</a>intent)</nobr>
This method is called when the BroadcastReceiver is receiving an Intent broadcast.
<nobr style="line-height:21px"><a rel="nofollow" href="http://developer.android.com/reference/android/os/IBinder.html" style="color:rgb(0,102,153); line-height:21px; text-decoration:none">IBinder</a></nobr> <nobr style="line-height:21px"><span style="line-height:21px; margin-right:2px"><a rel="nofollow" href="http://developer.android.com/reference/android/content/BroadcastReceiver.html#peekService(android.content.Context,%20android.content.Intent)" style="color:rgb(0,102,153); line-height:21px; text-decoration:none">peekService</a></span>(<a rel="nofollow" href="http://developer.android.com/reference/android/content/Context.html" style="color:rgb(0,102,153); line-height:21px; text-decoration:none">Context</a>myContext,<a rel="nofollow" href="http://developer.android.com/reference/android/content/Intent.html" style="color:rgb(0,102,153); line-height:21px; text-decoration:none">Intent</a>service)</nobr>
Provide a binder to an already-running service.
<nobr style="line-height:21px">final void</nobr> <nobr style="line-height:21px"><span style="line-height:21px; margin-right:2px"><a rel="nofollow" href="http://developer.android.com/reference/android/content/BroadcastReceiver.html#setDebugUnregister(boolean)" style="color:rgb(0,102,153); line-height:21px; text-decoration:none">setDebugUnregister</a></span>(boolean debug)</nobr>
Control inclusion of debugging help for mismatched calls to {@ Context#registerReceiver(BroadcastReceiver, IntentFilter) Context.registerReceiver()}.
<nobr style="line-height:21px">final void</nobr> <nobr style="line-height:21px"><span style="line-height:21px; margin-right:2px"><a rel="nofollow" href="http://developer.android.com/reference/android/content/BroadcastReceiver.html#setOrderedHint(boolean)" style="color:rgb(0,102,153); line-height:21px; text-decoration:none">setOrderedHint</a></span>(boolean isOrdered)</nobr>
For internal use, sets the hint about whether this BroadcastReceiver is running in ordered mode.
<nobr style="line-height:21px">final void</nobr> <nobr style="line-height:21px"><span style="line-height:21px; margin-right:2px"><a rel="nofollow" href="http://developer.android.com/reference/android/content/BroadcastReceiver.html#setResult(int,%20java.lang.String,%20android.os.Bundle)" style="color:rgb(0,102,153); line-height:21px; text-decoration:none">setResult</a></span>(int code,<a rel="nofollow" href="http://developer.android.com/reference/java/lang/String.html" style="color:rgb(0,102,153); line-height:21px; text-decoration:none">String</a>data,<a rel="nofollow" href="http://developer.android.com/reference/android/os/Bundle.html" style="color:rgb(0,102,153); line-height:21px; text-decoration:none">Bundle</a>extras)</nobr>
Change all of the result data returned from this broadcasts; only works with broadcasts sent through Context.sendOrderedBroadcast.
<nobr style="line-height:21px">final void</nobr> <nobr style="line-height:21px"><span style="line-height:21px; margin-right:2px"><a rel="nofollow" href="http://developer.android.com/reference/android/content/BroadcastReceiver.html#setResultCode(int)" style="color:rgb(0,102,153); line-height:21px; text-decoration:none">setResultCode</a></span>(int code)</nobr>
Change the current result code of this broadcast; only works with broadcasts sent through Context.sendOrderedBroadcast.
<nobr style="line-height:21px">final void</nobr> <nobr style="line-height:21px"><span style="line-height:21px; margin-right:2px"><a rel="nofollow" href="http://developer.android.com/reference/android/content/BroadcastReceiver.html#setResultData(java.lang.String)" style="color:rgb(0,102,153); line-height:21px; text-decoration:none">setResultData</a></span>(<a rel="nofollow" href="http://developer.android.com/reference/java/lang/String.html" style="color:rgb(0,102,153); line-height:21px; text-decoration:none">String</a>data)</nobr>
Change the current result data of this broadcast; only works with broadcasts sent through Context.sendOrderedBroadcast.
<nobr style="line-height:21px">final void</nobr> <nobr style="line-height:21px"><span style="line-height:21px; margin-right:2px"><a rel="nofollow" href="http://developer.android.com/reference/android/content/BroadcastReceiver.html#setResultExtras(android.os.Bundle)" style="color:rgb(0,102,153); line-height:21px; text-decoration:none">setResultExtras</a></span>(<a rel="nofollow" href="http://developer.android.com/reference/android/os/Bundle.html" style="color:rgb(0,102,153); line-height:21px; text-decoration:none">Bundle</a>extras)</nobr>
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 extendsActivity {
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 MyBroadcastReceiverextends 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(有序广播篇))