0326-Broadcast广播--无序广播、有序广播

本文详细介绍了Android中的BroadcastReceiver,包括广播的注册方式、无序广播和有序广播的区别,并通过实例展示了静态和动态注册广播的步骤。强调了有序广播的优先级机制和动态注册在同级别时的优先级高于静态注册。同时提醒开发者在使用动态注册时,务必在onDestroy中注销广播接收器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、什么是广播?

在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件。

广播的注册方法:

静态注册和动态注册

广播的分类:

1.无序广播(普通广播)

所有监听该广播接受者都可以监听到该广播
同级别接收先后顺序是随机的(无序)
级别低的后收到广播
接收器不能截断广播的继续传播,也不能处理广播
同级别动态注册高于静态注册

2.有序广播

按照接收者的优先顺序来接收广播,优先级别在intent-filter中的priority中声明,-1000到1000之间,值越大优先级越高,可以终止广播的继续传播,接受者可以修改intent的内容。
同级别接收顺序是随机的
级别低的后收到
能截断广播的继续传播,高级别的广播接收器接收广播后能决定时候截断。
能处理广播
同级别动态注册高于静态注册

3.粘滞广播
不能处理结果给下一个接收者,无法终止广播。
一直存在
可以先发送广播,再注册接收器
需要在清单文件添加android.permission.BROADCAST_STICKY权限

二、静态注册发送无序广播实例:

首先布置发送方代码。创建一个Activity,修改其xml、java代码:

    <Button
        android:id="@+id/send_btn"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="send"
        />

main.java:
在按钮的点击事件中写发送广播

public class Main1Activity extends AppCompatActivity {

    private Button button;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main1);
        button=findViewById(R.id.send_btn);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //发送广播
                Intent intent=new Intent("com.test.project.broadcasta");
                sendBroadcast(intent);
            }
        });
    }
}

接收方代码:
1.创建一个新的工程
2.新建一个类,继承BroadcastReceiver
3.实现onReceive方法
4.在AndroidManifest.xml里面注册

代码如下:

public class Reciveinfo  extends BroadcastReceiver{


    @Override
    public void onReceive(Context context, Intent intent) {
           Toast.makeText(context, "1111111111", Toast.LENGTH_SHORT).show();

    }
}

AndroidManifest注册代码:

        <receiver android:name=".Reciveinfo">
            <intent-filter>
                <action android:name="com.test.project.broadcasta"/>
            </intent-filter>
        </receiver>

三、静态注册发送有序广播实例:

1.需要将AndroidManifest里的代码做以下修改:
添加priority属性,设置广播的优先级别

  <receiver android:name=".Reciveinfo">
            <intent-filter android:priority="1000">
                <action android:name="com.test.project.broadcasta"/>
            </intent-filter>
        </receiver>

2.将发送端main.java代码改为:
发送方法改为sendOrderedBroadcast

public class Main1Activity extends AppCompatActivity {

    private Button button;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main1);
        button=findViewById(R.id.send_btn);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //发送广播
                Intent intent=new Intent("com.test.project.broadcasta");
                sendOrderedBroadcast(intent,null);
            }
        });
    }
}

其余代码同上

四.动态注册发送无序广播实例:

首先布置发送方代码:
首先布置发送方代码。创建一个Activity,修改其xml、java代码:

    <Button
        android:id="@+id/send_btn"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="send"
        />

main.java:
在按钮的点击事件中写发送广播:

public class Main1Activity extends AppCompatActivity {

    private Button button;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main1);
        button=findViewById(R.id.send_btn);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //发送广播
                Intent intent=new Intent("com.test.project.broadcasta");
                sendOrderedBroadcast(intent,null);
            }
        });
    }
}

接收方代码:
1.创建两个新的工程
2.各新建一个 类,继承BroadcastReceiver
3.实现onReceive方法
4.在各自的MainActivity中,实现动态注册
创建一个IntentFilter对象。
使用IntentFilter对象的setAction方法添加一个监听对象
使用registerReceiver(Broadcastreceiver,intentFilter)实现这个广播接收
在onDestroy里面使用unregisterReceiver结束当前广播(unregisterReceiver)

代码如下:

public class Main1Activity extends AppCompatActivity {
  private Reciveinfo reciveinfo;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main1);
        //重写自己的类
        reciveinfo=new Reciveinfo();
        IntentFilter intentFilter=new IntentFilter();
        intentFilter.addAction("com.test.project.broadcasta");
        registerReceiver(reciveinfo,intentFilter);
    }

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

五.动态注册发送有序广播实例:

只需要在接收方main.java 代码中做以下修改即可,其余同上:
在各自的接收方main.java 中添加添加priority属性,设置广播的优先级别即可

public class Main1Activity extends AppCompatActivity {
  private Reciveinfo reciveinfo;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main1);
        reciveinfo=new Reciveinfo();
        IntentFilter intentFilter=new IntentFilter();
        intentFilter.setPriority(-1000);
        intentFilter.addAction("com.test.project.broadcasta");
        registerReceiver(reciveinfo,intentFilter);

    }

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

}
注意:一定要重写onDestroy方法,页面销毁时同时也把注册销毁
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值