您的位置:首页 > 其它

BroadcastReceiver广播的使用

2016-07-14 10:51 429 查看
使用目的:通过广播接收者,可以进行组件之间进行通信、应用程序之间的通讯;

广播是用来传输数据的;

广播可以实现了不同的程序之间的数据传输与共享,因为只要是和发送广播的action相同的接受者都能接受这个广播。典型的应用就是android自带的短信,电话等等广播(这些都是系统广播);

系统也可能发送广播,安卓是基于事件触发的,任何状态的改变都会发出广播,比如收到短信、收到电话等;

接收系统广播,接收自定义广播;

广播以内部类的形式实现,写到Activity里面。

广播分为有序广播和无序广播;

广播的使用步骤: 注册广播、取消广播、发送广播、接收广播;

一、注册广播:

订阅广播,有两种方法形式:xml配置、代码配置。注册一个广播接收者。

Xml文件配置订阅,不需要取消广播的订阅。注册广播需要设置action,只有和注册广播的动作一致的接收者才能收到广播。

<receiver android:name="com.lantu.tuhuadmin.testreceiver.MyReceiver">
<intent-filter>
<action android:name="chenrushui" />
</intent-filter>
</receiver>


通过代码注册广播接收者:记住最重要的一行代码;通过代码注册一定要取消广播的订阅。

<pre name="code" class="java">        mReceiver = new MyReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("chenrushui"); //为intent设置动作
intentFilter.addDataScheme("cast");//这里不需要: 添加数据约束。
registerReceiver(mReceiver, intentFilter);



二、取消广播:

unregisterReceiver(mReceiver);不取消广播的订阅,可能导致内存泄露。

@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mReceiver);
}


三、发送广播:

sendBroadCast(new Intent());发送普通广播;所有的接收者可以同时受到广播;无法终断。

sendOrderBroadCast(new Intent());发送有序广播;有接收广播的优先顺序,而接收广播的优先顺序是由接收者自己指定的。接收广播的优先级的范围是-1000到1000.有序广播可以终断;但是有序广播可以明确的指定接收者,这样广播就不可以终断;

sendOrderedBroadcast(intent, null, new MyReceiver2(), new Handler(), 0, null, null);


这两个方法是上下文身上的方法;

通过广播传递参数,广播里面传递的是Intent,可以携带数据;

发送广播时,要给Intent带上action,标识Intent的唯一性;intent.setAction()只有动作一致才能收到广播。

在发送广播时,如果为Intent设置了data,那么对应的广播接收者一定要设置data才能接收到广播。intentFilter.addDataScheme("cast")

findViewById(R.id.btn_1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.putExtra("name", "陈如水");
intent.setAction("chenrushui");
intent.setData(Uri.parse("cast:11111"));
sendBroadcast(intent);
}
});


四、接收广播:

写一个类继承自BroadCastReceiver,在子类的onReceive()方法中处理相应的业务逻辑。在广播接收者收到广播时,调用onReceive()方法。

public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("chenrushui")) {
String dataString = intent.getDataString().split(":")[1];
Toast.makeText(context, "我已经接收到了广播 " + dataString, Toast.LENGTH_SHORT).show();
}
}
}

有序广播案例: 设置广播的优先级、中断广播的实现、abortBroadcast()、android:priority="-1000"

清单文件中代码:

<receiver android:name=".MyReceiver1">
<intent-filter android:priority="1000">
<action android:name="com.lantu.tuhu" />
<data android:scheme="tel" />
</intent-filter>
</receiver>
<receiver android:name=".MyReceiver2">
<intent-filter android:priority="-1000">
<action android:name="com.lantu.tuhu" />
<data android:scheme="tel" />
</intent-filter>
</receiver>
MyReceiver1中的代码:

public class MyReceiver1 extends BroadcastReceiver {
private static final String TAG = "MyReceiver";

@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("com.lantu.tuhu")) {
Log.i(TAG, "MyReceiver1" + "收到广播");
}
//直接调用这个方法中断广播,优先级低的广播接收者就都收不到广播了。
abortBroadcast();
}
}
MyReceiver2中的代码:

public class MyReceiver2 extends BroadcastReceiver {
private static final String TAG = "MyReceiver";
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("com.lantu.tuhu")) {
Log.i(TAG, "MyReceiver2收到广播");
}
}
}
接收的是否是系统广播,怎么判断?
只能通过action判断,并且代码中没有明确的广播发送者。

IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息