Android --- 广播

广播是什么?

一种相互通信,传递信息的机制,组件内、进程间(App之间)

如何使用广播?

组成部分

发送者-发送广播

与启动其他四大组件一样,广播发送也是使用intent发送。

  • 设置action:表示这个广播可以被哪些接收器接收到
  • 通过 putExtra,传递额外的bundle信息
 Intent intent = new Intent();
 intent.setAction(SEND_STATIC_ACTION);
 intent.putExtra("data","静态广播");
 sendBroadcast(intent);

接收者-广播接收

创建广播接收器

继承 BroadcastReceiver 类

或直接new该类的对象实例,然后重写方法 onReceive,在该方法中处理接收到的广播消息。

注册广播接收器

注册广播接收器有两种办法,静态注册和动态注册,可以分为两种广播

  • 静态广播:常驻内存中,是在Manifest文件中注册的,可在App未启动时就监听广播
  • 动态广播:App启动后注册,是在代码中注册以及解除注册的广播,解除注册后,广播也随时结束。

同时注册时,动态优于静态

静态广播

创建广播接收器类

// 静态广播接收器
public class StaticBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle bundle = intent.getExtras();
        Log.d("BroadcastReceiver","静态广播接收器接受了一个 - "+bundle.getString("data"));
    }
}

在 Manifest文件中注册广播接收器

   <receiver android:name=".broadcastreceiver.receiver.StaticBroadcastReceiver"
     android:exported="true">
       <intent-filter>
          <action android:name="send_static_action"></action>
       </intent-filter>
   </receiver>

 动态广播
创建广播接收器

直接new该类的对象实例,然后重写方法 onReceive

// 创建广播接收器
    private BroadcastReceiver dynamicBroadcastReceiver= new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Bundle bundle = intent.getExtras();
            Log.d("BroadcastReceiver","动态广播接收器接受了一个 - "+bundle.getString("data"));

        }
    };
注册广播接收者器类

一般在Activity的onCreate方法中注册

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_broadcast_study);

        // 动态注册广播接收器
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(SEND_DYNAMIC_ACTION);
        registerReceiver(dynamicBroadcastReceiver,intentFilter);
    }
解除注册
   @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(dynamicBroadcastReceiver);
    }

无序广播、有序广播

按照广播接收顺序划分

  • 无序广播-普通广播:所有接收器接收的广播没有先后顺序,几乎同时收到消息
  • 有序广播:发送的广播会按照接收器的优先级顺序被接受,同一时刻只会有一个接收器收到广播,且收到广播之后可以对广播进行截断和修改

有序广播

发送

使用语句  sendOrderedBroadcast

广播接收器 

注册时,设置优先级,优先级越大越先收到广播

// 动态注册广播接收器
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(SEND_DYNAMIC_ACTION);
        intentFilter.setPriority(100);
        registerReceiver(dynamicBroadcastReceiver, intentFilter);

        // 注册有序广播
        // 有序广播设置优先级,优先级越大越先收到
        IntentFilter intentFilter1 = new IntentFilter();
        intentFilter1.addAction(SEND_DYNAMIC_ACTION);
        intentFilter1.setPriority(101);
        registerReceiver(broadcastReceiver2, intentFilter1);
截断广播 

abortBroadcast();  优先级高的广播接收器截断广播之后,下游的广播就不再会收到。 

修改广播 

上游的广播 使用 setResultExtras 传递一个新的 Bundle 或者使用 setResultData 传递一个字符串下游使用 getResultExtras 接收 Bundle,使用 getResultData 接收字符串

全局广播、本地广播

按照广播的传播范围划分

  • 本地广播:app内部
  • 全局广播:整个手机内部

全局广播

普通广播就是全局广播。

一个发送全局广播,在另一个app中接收到的例子:

App1

1.发送广播

Intent intent = new Intent();
intent.setAction(SEND_GLOBAL_ACTION);
intent.putExtra("data_global", "发送了一条全局广播");
sendBroadcast(intent);

App2

1.创建广播接收器,处理接收数据

 // 接收来自 Androidsutdio App的广播
    // 创建广播接收器
    private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, intent.getExtras().getString("data_global"), Toast.LENGTH_LONG).show();
            Log.d("接受全局广播", intent.getExtras().getString("data_global"));
        }
    };

2.注册广播接收器

action与发送广播的action相同

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 注册广播接收器
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("send_global_action");
        registerReceiver(broadcastReceiver, intentFilter);
    }

3.解除广播接收器

  @Override
    protected void onDestroy() {
        super.onDestroy();
        // 解除广播接收器
        unregisterReceiver(broadcastReceiver);
    }

此时是由App2弹出的这条弹窗。

app2的logcat:

本地广播

只能使用动态注册,因为本地广播只能监听这个app内部的广播,在注册发送广播时,需要使用到LocalBroadcastManager 类。

注册
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_broadcast_study);

        // 注册本地广播 - 只能动态注册
        LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
        IntentFilter local_intentFilter = new IntentFilter();
        intentFilter1.addAction(SEND_LOCAL_ACTION);
        localBroadcastManager.registerReceiver(new LocalBroadcastReceiver(),local_intentFilter);
    }
发送 
 Intent intent = new Intent();
 intent.setAction(SEND_LOCAL_ACTION);
 intent.putExtra("data", "本地广播");
 localBroadcastManager.sendBroadcast(intent);
 解除注册
 Intent intent = new Intent();
 intent.setAction(SEND_LOCAL_ACTION);
 intent.putExtra("data", "本地广播");
 localBroadcastManager.sendBroadcast(intent);

广播的作用?

传递信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值