您的位置:首页 > 移动开发 > Android开发

[Android四大组件] Broadcast Receiver 广播

2017-03-21 17:39 881 查看

Broadcast Receiver

什么是Broadcast Receiver

官方解释: Android apps can send or receive broadcast messages from the Android system and other Android apps, similar to the publish-subscribe design pattern. These broadcasts are sent when an event of interest occurs. For example, the Android system sends broadcasts when various system events occur, such as when the system boots up or the device starts charging. Apps can also send custom broadcasts, for example, to notify other apps of something that they might be interested in (for example, some new data has been downloaded).

通俗易懂: 也就是一个基站, 可以发送广播也可以接收广播.

广播的分类:

标准广播: 一种完全异步的广播, 无法被截断.

有序广播: 同步执行的广播, 广播分先后顺序, 可以被截断.

广播的基本使用

广播的注册:

代码中注册(动态注册):

public class MainActivity extends Activity{
private IntentFilter mIntentFilter;

private DemoBroadcastRecevier mReceiver;

@Overrider
protected void onCreate(Bundel savedInstance){
super.onCreate();
setContentView(R.layout.activity_main);
intentFilter = new IntentFilter();
intentFilter.addAction("...");      // 定义监听操作
mReceiver = new DemoBroadcastReceiver();
registerReceiver(mReceiver, intentFilter);
}

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

class DemoBroadcastReceiver extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent){
Toast.makeText(context,"I am thatnight",Toast.LENGTH_SHOT).show();
}
}

}


我们在上面分别创建了两个, 一个是IntentFilter , 这个是一个Intent的过滤器, 用来过滤隐式的Intent, 接收的广播就是addAction里面的值了, 然后是一个继承了BroadCastReceiver的内部类, 并实现了onReceive方法,

AndroidManifest.xml注册(静态注册):

<receiver android:name=".DemoBroadcastReceiver">
<intent-filter>
<action android:name="..."></action>
</intent-filter>
</receiver>


静态注册很简单, 比动态注册还少写了个IntentFilter。

发送和接收广播

我们把之前的action都设为自定义的 “com.rcd.demoscomponents.WHO_ARE_YOU”

发送广播代码如下:

Intent sendIntent = new Intent("com.rcd.demoscomponents.WHO_ARE_YOU") ;
sendBroadcast(sendIntent);


上面的代码十分简单,效果图如下 :



发送有序广播:

上面所发的是一条标准的广播, 那么有序广播该怎么发送呢? 其实也很简单, 操作如下:

新建一个项目, 并写一个跟上面DemoBroadcastReceiver一样的类, 总之全都一样吧, 然后同时运行这两个app,

当点击上面的那个按钮时, 两个app都弹出了Toast, 这说明:广播是可以跨进程的.

这里你可能会问, 明明是如何发送有序广播的,怎么跑题了呢?

其实并没有, 不信你看.

Intent sendIntent=new Intent("com.rcd.democomponents.WHO_ARE_YOU");
sendOrderedBroadcast(sendIntent, null);


关键的地方就在于sendOrderedBroadcast()这个方法, 就收两个参数. 第一个是Intent, 第二个是一个跟权限有关的字符串, 这里传入null就行了.

再重新运行一遍的时候, 点击按钮, 你仍然会发现 两个app都接收到了广播, 这又是问什么呢?

都说了是有序广播, 这个有序该怎么设置呢, 回到AndroidManifest.xml文件中, 在的标签中, 添加android:priority=”100” , 这保证了这个app会先于其他app先收到广播.

<receiver android:name="com.rcd.democomponents.DemoBroadcastReceiver">
<intent-filter android:priority="100">
<action android:name="com.rcd.demoscomponents.WHO_ARE_YOU"/>
</intent-filter>
</receiver>


好啦, 接下来就是截断广播

@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "I am thatnight", Toast.LENGTH_SHORT).show();
abortBroadcast();
}


很明显, 就一行代码, 说明了广播将在这里被截断, 不会传播到下一个广播接收器了.

使用本地广播,

上面所说的发送和接收都是全局广播, 也就是发送的广播可以被其他任何应用程序所接收到, 这导致了一个安全性的问题.

所以我们接下来讲的是本地广播.

注意: 本地广播只能通过动态注册, 不能使用静态注册

代码如下:

public class MainActivity extends Activity{
private IntentFilter mIntentFilter;

private DemoBroadcastRecevier mReceiver;

private LocalBroadcastManager mLocalBroadcastManager;

@Overrider
protected void onCreate(Bundel savedInstance){
super.onCreate();
setContentView(R.layout.activity_main);

mIntentFilter=new IntentFilter();
intentFilter.addAction("com.rcd.demoscomponents.WHO_ARE_YOU");
mLocalBroadcastManager=LocalBroadcastManager.getInstance(this);
mReceiver = new DemoBroadcastReceiver();
mLocalBroadcastManager.registerReceiver(mReceiver,intentFilter);
}

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

class DemoBroadcastReceiver extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent){
Toast.makeText(context,"I am thatnight",Toast.LENGTH_SHOT).show();
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: