广播(Broadcast)的简单用法

发送一条广播

发送广播的方法和启动Activity的方法是非常类似的。首先新建一个Intent对象,然后使用sendBroadcast()sendOrderedBroadcast()或者sendStickyBroadcast()发送广播:

  • sendBroadcast():发送一条普通广播。这种广播接收不分先后,而且不能截断,不能被修改。
  • sendOrderedBroadcast():发送一条有序广播。这种广播按照一定的顺序被接收,接收顺序可以通过在<intent-filter>标签下设定android:priority来改变。可以使用abortBroadcast()方法终止广播的传播。
  • sendStickyBroadcast():发送一条粘滞广播。这种广播在没有被接收的时候会一直存在。所以即使在广播发送后注册的接收器也能接受到这种广播。这种广播使用的使用要添加相应的权限。由于这种广播带来了很多安全性的问题,所以在API 21 以后已经被废弃了。

接收广播

  • 首先创建一个类继承BroadcastReceiver,并重写其中的onReceive()方法;
  • 注册Receiver。可以使用静态注册或者动态注册:
    • 静态注册:在Manifest文件中的<application>标签下添加<receiver>标签。在<receiver>标签下可以添加多个<intent-filter>来指定接收广播的类型;
    • 动态注册:如果想要让BroadcastReceiver只在一段时间内有效,可以调用registerReceiver()unRegisterReceiver()方法动态注册。

一个简单的例子

程序是这样子的:通过点击三个不同的按钮,可以发送三种不同的广播:

布局文件如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.broadcastreceiverdemo.MainActivity" >

    <Button
        android:id="@+id/button_1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="发送普通广播" />

    <Button
        android:id="@+id/button_2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="发送有序广播" />

    <Button
        android:id="@+id/button_3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="发送粘滞广播" />

</LinearLayout>

在主程序中发送广播:

public class MainActivity extends Activity implements OnClickListener{

    Button button1;
    Button button2;
    Button button3;

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

        button1 = (Button) findViewById(R.id.button_1);
        button2 = (Button) findViewById(R.id.button_2);
        button3 = (Button) findViewById(R.id.button_3);
        button1.setOnClickListener(this);
        button2.setOnClickListener(this);
        button3.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch(v.getId()){
        case R.id.button_1:
            Intent intent1 = new Intent();
            intent1.setAction("BC_One");
            intent1.putExtra(Intent.EXTRA_TEXT, "这是一条普通广播");
            //如果明确知道广播的唯一接收者,也可以使用显式的intent
            //intent.setClass(MainActivity.this, MyReceiver1.class);
            sendBroadcast(intent1);
            break;
        case R.id.button_2:
            Intent intent2 = new Intent();
            intent2.setAction("BC_Two");
            intent2.putExtra(Intent.EXTRA_TEXT, "这是一条有序广播");
            sendOrderedBroadcast(intent2, null);
            break;
        case R.id.button_3:
            Intent intent3 = new Intent();
            intent3.setAction("BC_Three");
            intent3.putExtra(Intent.EXTRA_TEXT, "这是一条粘滞广播");
            sendStickyBroadcast(intent3);

            //动态注册第三个广播接收器,注意这个接收器注册在广播发送之后
            IntentFilter filter = new IntentFilter();
            filter.addAction("BC_One");
            filter.addAction("BC_Two");
            filter.addAction("BC_Three");
            MyReceiver3 receiver = new MyReceiver3();
            registerReceiver(receiver, filter);
            break;
        default:
            break;  
        }
    }

}

三个广播接收器:

public class MyReceiver1 extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String s = intent.getStringExtra(Intent.EXTRA_TEXT);
        Log.d("MyReceiver1", "收到一条广播:" + s);
        Bundle bundle = getResultExtras(true);
        String extraString = bundle.getString(Intent.EXTRA_TEXT);
        if(extraString != null){
            Log.d("MyReceiver1", "收到一条广播:" + extraString);
        }
    }

}
public class MyReceiver2 extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String s = intent.getStringExtra(Intent.EXTRA_TEXT);
        Log.d("MyReceiver2", "收到一条广播:" + s);
        Bundle bundle = new Bundle();
        bundle.putString(Intent.EXTRA_TEXT, "这是第2条广播");
        setResultExtras(bundle);
    }

}
public class MyReceiver3 extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String s = intent.getStringExtra(Intent.EXTRA_TEXT);
        Log.d("MyReceiver3", "收到一条广播:" + s);
        Bundle bundle = getResultExtras(true);
        String extraString = bundle.getString(Intent.EXTRA_TEXT);
        if(extraString != null){
            Log.d("MyReceiver3", "收到一条广播:" + extraString);
        }
    }

}

setResultExtras()可以用来更改广播中的内容;getResultExtras()可以用来得到广播中的内容。这两个方法都只对有序广播有用。

前两个广播在Manifest文件中注册,第三个广播使用动态注册的方法,在广播发送以后被注册。

        <receiver android:name="com.example.broadcastreceiverdemo.MyReceiver1" >
            <intent-filter>
                <action android:name="BC_One" />
            </intent-filter>
            <intent-filter android:priority="-100" >
                <action android:name="BC_Two" />
            </intent-filter>
            <intent-filter>
                <action android:name="BC_Three" />
            </intent-filter>
        </receiver>
        <receiver android:name="com.example.broadcastreceiverdemo.MyReceiver2" >
            <intent-filter>
                <action android:name="BC_One" />
            </intent-filter>
            <intent-filter android:priority="100" >
                <action android:name="BC_Two" />
            </intent-filter>
            <intent-filter>
                <action android:name="BC_Three" />
            </intent-filter>
        </receiver>

android:priority属性可以指定广播接收的顺序,但只对有序广播有用。

最后要在Manifest文件中添加需要的权限:

    <uses-permission android:name="android.permission.BROADCAST_STICKY" />

运行结果如下:

  • 点击发送普通广播时:
    普通广播
    发现静态注册的两个接收器都接收到了广播,且这两条广播没有先后顺序。报错的原因是在接收器中修改了广播的内容。

  • 点击发送有序广播时:
    有序广播
    发现两个静态注册的接收器都接收到了广播,且第二个接收器先于第一个接收器接收到了广播。且第一个接收器接收到了第二个接收器修改过的广播内容。说明有序广播发送顺序有先后,且内容可以被修改。

  • 点击发送粘滞广播
    粘滞广播
    可以发现三个接收器都接收到了广播,且顺序没有先后。出现错误还是因为试图在接收器中修改广播的内容。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验目的: 了解AndroidBroadcast广播的使用方法和实现原理,掌握Broadcast广播发送和接收机制。 实验环境: Android Studio 4.1.2 实验步骤: 1.创建一个新的Android项目,取名为BroadcastDemo。 2.在AndroidManifest.xml文件中添加两个Activity,并在MainActivity的布局文件中添加一个Button按钮。 3.创建一个自定义广播接收器类MyReceiver,用于接收自定义广播。 ```java public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String data = intent.getStringExtra("data"); Toast.makeText(context, "接收到广播,数据为:" + data, Toast.LENGTH_SHORT).show(); } } ``` 4.在MainActivity中注册广播接收器。 ```java public class MainActivity extends AppCompatActivity { private MyReceiver receiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); receiver = new MyReceiver(); IntentFilter filter = new IntentFilter("com.example.broadcastdemo.MY_BROADCAST"); registerReceiver(receiver, filter); Button button = findViewById(R.id.btn_send_broadcast); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent("com.example.broadcastdemo.MY_BROADCAST"); intent.putExtra("data", "Hello, Broadcast!"); sendBroadcast(intent); } }); } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(receiver); } } ``` 5.在Button的点击事件中发送广播。 6.运行程序,在MainActivity中点击Button按钮,发送自定义广播。 7.在MyReceiver中接收并处理广播。 实验结果: 运行程序后,点击Button按钮发送自定义广播,MyReceiver接收并处理广播,并弹出Toast提示信息。 实验总结: Broadcast广播Android中常用的一种通信方式,通过发送和接收广播可以实现不同组件之间的通信。在实际开发中,需要根据具体的需求选择不同的广播类型和注册方式,合理使用广播可以提高应用程序的性能和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值