BroadcastReceiver(有序广播篇)
来源:互联网 发布:北京pk10软件手机软件 编辑:程序博客网 时间:2024/04/29 17:44
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属性的话,先注册的将先收到广播。
主要函数
Sets the flag indicating that this receiver should abort the current broadcast; only works with broadcasts sent through
Context.sendOrderedBroadcast
.Clears the flag indicating that this receiver should abort the current broadcast.
Returns the flag indicating whether or not this receiver should abort the current broadcast.
Return the last value given to
setDebugUnregister(boolean)
.Retrieve the current result code, as set by the previous receiver.
Retrieve the current result data, as set by the previous receiver.
Retrieve the current result extra data, as set by the previous receiver.
This can be called by an application in
onReceive(Context, Intent)
to allow it to keep the broadcast active after returning from that function.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.
Returns true if the receiver is currently processing an ordered broadcast.
This method is called when the BroadcastReceiver is receiving an Intent broadcast.
Provide a binder to an already-running service.
Control inclusion of debugging help for mismatched calls to {@ Context#registerReceiver(BroadcastReceiver, IntentFilter) Context.registerReceiver()}.
For internal use, sets the hint about whether this BroadcastReceiver is running in ordered mode.
Change all of the result data returned from this broadcasts; only works with broadcasts sent through
Context.sendOrderedBroadcast
.Change the current result code of this broadcast; only works with broadcasts sent through
Context.sendOrderedBroadcast
.Change the current result data of this broadcast; only works with broadcasts sent through
Context.sendOrderedBroadcast
.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(有序广播篇)
- BroadcastReceiver(有序广播篇)
- BroadcastReceiver学习(02)之有序广播
- BroadcastReceiver学习(02)之有序广播
- BroadcastReceiver 有序广播
- BroadcastReceiver 之有序广播
- BroadcastReceiver-有序广播
- BroadcastReceiver(有序广播)
- android-BroadcastReceiver有序广播
- 四大组件之BroadCastReceiver(无序广播和有序广播)
- android-BroadcastReceiver 发送有序广播
- android-BroadcastReceiver 发送有序广播
- android-BroadcastReceiver 发送有序广播
- android-BroadcastReceiver 发送有序广播
- android-BroadcastReceiver 发送有序广播
- Android BroadcastReceiver实例Demo(有序广播的发送)
- Android 四大组件之BroadcastReceiver(发送有序无序广播)
- 初学Android,BroadcastReceiver之有序广播(七十一)
- android中获取地图路径
- 文件指针/句柄(FILE*)、文件描述符(fd)以及 文件路径(filepath)的相互转换
- winform 控件随窗体的变化而变化
- 字符集与编码的关系
- linux解压命令大全
- BroadcastReceiver(有序广播篇)
- 阿里云主机centos 添加硬盘
- Linux基础之Vi文本编辑器
- 字符集编码发展简史
- JButton常用的一些方法
- SQL Server @@ServerName 为空NULL
- 设计模式之单例模式
- 玩转android sqlLite---(附android DB的图行工具)
- 深入浅出单实例Singleton设计模式(Android)