BroadcastReceiver 之有序广播

Broadcast 被分为如下两种:

  1. Normal Broadcast (普通广播) : Normal Broadcast 是完全异步的,可以在同一时刻(逻辑上)被所有的接收者收到,消息传递的效率比较高. 但是缺点是不能将处理结果传递给下一个接收者,并且无法终止 Broadcast Intent 的传播.
  2. Ordered Broadcast (有序广播) Ordered Broadcast 的接收者将按预先声明的优先级依次接受 Broadcast . 如A的级别高于B,B的级别高于 C ,那么 Broadcast 先传给A ,再传给 B, 最后传递给 C .优先级别声明在 (intent-filter…/)标签中 android:priority=”Xxx” Xxx的数值越大优先级越高,取值范围是 -1000~~~1000,优先级别也可以调用 IntentFilter对象的setPriority( )进行设置.Ordered Broadcast 接收者可以终止 Broadcast Intent 的传播. Broadcast Intent 的传播.一旦终止,后面的接收者无法接收到 Broadcast . 另外 rdered Broadcast的接收者,可以将数据传递给下一个接收者, 如 A 得到 Broadcast 后,可以往它的结果对象中存入数据,当 Broadcast 传给 B时,B 可以从A 的结果对象中,得到 A 存入的数据.

Context 提供如下两个方法 用于发送广播.

  1. sendBroadcast ( ): 发送 Normal Broadcast
  2. sendOrderedBroadcast ( ): 发送 Ordered Broadcast

对于 Ordered Broadcast来说,系统会根据接收者声明的优先级别按顺序逐个执行接收者,优先接受到的 Broadcast 的接收者,可以终止 Broadcast,调用 BroadcastReceiver的 abortBroadcast()方法即可终止 Broadcast.如果 Broadcast被前面的接收者终止,后面的接收者再也无法
获取到Broadcast.


对于 Ordered Broadcast来说 优先接受到的 Broadcast 的接收者,可以通过setResultExtras(Bundle) 方法将处理结果存入 Broadcast中,然后传递给下一个接收者,下一个接收者通过代码 Bundle budle = getResultExtras(true) 可以获取上一个接收者存入的数据.


package com.test.broadcastreceiverdemo.orderbroadcast;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

import com.test.broadcastreceiverdemo.R;

/**
 * 有序广播 OrderBroadcast
 */
public class SortedBroadcastActivity extends AppCompatActivity {

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

            send = (Button) findViewById(R.id.order_button);


            send.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    //创建 intent 对象
                    Intent intent = new Intent();
                    //设置Intent 的action 属性
                    intent.setAction("com.test.broadcastreceive.ORDERED_BROADCAST");

                    //设置数据
                    intent.putExtra("msg", "简单消息");

                    //发送广播
                    sendOrderedBroadcast(intent,null);
                }
            });
        }

}

第一个 Receiver 广播接收者

package com.test.broadcastreceiverdemo.orderbroadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;

public class MyOrderedReceiver extends BroadcastReceiver {
    public MyOrderedReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        Toast.makeText(context, "接收到的Intent 的action 为: " + intent.getAction() +
                "\n 消息内容为: " + intent.getStringExtra("msg"), Toast.LENGTH_SHORT).show();

        //创建一个 Bundle对象 并存入数据
        Bundle bundle = new Bundle();

        bundle.putString("first", "第一个BroadcastReceiver 存入数据 1");

        //将 bundle 放入结果中
        setResultExtras(bundle);

        //取消 Broadcast 的继续广播
     //   abortBroadcast();
    }
}

第二个 Receiver 广播接收者

package com.test.broadcastreceiverdemo.orderbroadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;

public class MyOrderedReceiver2 extends BroadcastReceiver {
    public MyOrderedReceiver2() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.

        Bundle bundle = getResultExtras(true);

        //解析上一个 BroadcastReceiver 所存入的key 为 first的消息
        String first = bundle.getString("first");

        Toast.makeText(context, "第一个Broadcast存入的消息 为: 2" + first, Toast.LENGTH_SHORT).show();

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值