Android基础-广播

155 阅读3分钟

「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

简介

Android应用与Android系统和其他应用之间可以相互收发广播消息,类似发布-订阅设计模式。

使用场景

  • 同一App内部的同一组件内的消息通信(线程间)
  • 同一App内部的不同组件直接
  • 同一App多个进程之间
  • 不同App的组件直接
  • Android系统在特定的情况下与App之间

流程

  • 广播接受者BroadcastReceiver通过Binder机制想AMS(Activit Manager Service)进行注册
  • 广播发送至通过binder机制向AMS发送广播
  • AMS查找复合条件的BroadcastReceiver,将广播内容发送到BroadcastReceiver的消息循环队列中
  • 消息循环队列拿到广播后,回调BroadcastReceiver中的onReceiver方法

广播注册

静态注册

<receiver android:enabled=["true" | "false"]
          android:exported=["true" | "false"]
          android:icon="drawable resource"
          android:label="string resource"
          android:name="string"
          android:permission="string"
          android:process="string" >
          . . .
          <intent-filter>
              <action  android:name="string" />
          </intent-filter>
</receiver>

exported:是否接收其他App发出的广播,默认值由intent-filter决定

name:BroadcastReceiver类名

permission:设置权限,具有相应权限的广播发送方才能被接收

process:receiver所在线程

动态注册

registerReceiver(BroadcastReceiver receiver, 
                 IntentFilter filter)
registerReceiver(BroadcastReceiver receiver, 
                 IntentFilter filter, 
                 String broadcastPermission, 
                 Handler scheduler)

Activity中

//动态注册广播
mBroadcastReceiver = new MyBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(BROADCAST_ACTION);
registerReceiver(mBroadcastReceiver, intentFilter);

public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        //...
    }
}

//销毁,反注册
unregisterReceiver(mBroadcastReceiver);

广播接收

广播接收器是运行在UI线程中的,因此,onReceive方法中不能执行太耗时的操作,否则将引起ANR。

广播的发生及广播类型

广播发送的载体其实是Intent,广播的定义过程,实际是相应的广播Intent的定义过程,然后通过广播将这个Intent发送出去。

广播类型

  • 普通广播
  • 系统广播
  • 有序广播
  • 应用内广播

普通广播

开发者自定义Intent,以context.sendBroadcast形式

Intent muIntent = new Intent();
muIntent.setAction("KING_BROAD");
muIntent.putExtra("msg", "normal");
sendBroadcast(muIntent);

系统广播

Android系统内置广播

有序广播

有序是针对广播接收者来说,指发送出去的广播被BroadcastReceiver按照先后顺序接收,有序广播的定义过程与普通广播无异,发送方式变为:

sendOrderedBroadcast

有序广播特点如下:

1.BroadcastReceiver接收有序广播是,按照先后顺序接收,顺序遵循:priority属性的值(-1000到1000),相同的priority,动态注册>静态注册

2.先接收到广播的receiver可以进行拦截,使用abortBroadcast()方法;也可以通过setResultExtras方法将处理结果存入到对象中,后续接收者使用getResultExtras获取

应用内广播

是一种局部广播,广播的发送者、接受者都是同一App。

/**注册应用内广播接收器*/
mBroadcastReceiver = new MyBroadcastReceiver();//自定义receiver
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(BROADCAST_ACTION_LOCAL);

localBroadcastManager = LocalBroadcastManager.getInstance(this);
localBroadcastManager.registerReceiver(mBroadcastReceiver, intentFilter);

//取消注册应用内广播接收器
localBroadcastManager.unregisterReceiver(mBroadcastReceiver4);

只能通过动态注册获取

补充

onReceiver(context, intent)中的context具体类型

1.静态注册:context为ReceiverRestrictedContext

2.全局动态注册:Activity Context

3.LocalBroadcastReceiver:Application context

\