实验五、广播实验

本文详细介绍了Android中广播的基本概念和使用,包括静态广播、动态广播以及有序广播的实现步骤。通过实例展示了如何在主活动中发送广播,以及在不同广播接收器中接收和处理广播消息。实验结果展示了各种广播类型的工作流程,强调了在Android 8.0及以上版本中静态广播的限制,提倡使用动态注册。实验分析部分探讨了有序广播在动态注册中的设置和优先级概念。
摘要由CSDN通过智能技术生成

实验五、广播实验

【实验名称】实验五、广播实验
【实验目的】
1、了解使用Intent进行组件通信的原理;
2、了解Intent过滤器的原理和匹配机制;
3、掌握发送和接收广播的方法
【实验内容】
任务1、普通广播;
任务2、系统广播;
任务3、有序广播;

【实验要求】
1、练习使用静态方法和动态方法注册广播接收器
2、练习发送广播消息的方法;

(请完成如下部分)
【实验设计】

1、静态广播:
(1)主页面:
创建 按钮,以 `ComponentName`跳转至`MyReceiver.java`,并使用intent传值并显示值
public class MainActivity extends AppCompatActivity {
private  Button butn2;
 @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        butn2 = findViewById(R.id.butn2);
        butn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setComponent(new ComponentName("com.example.application02_intent","com.example.application02_intent.MyReceiver"));
                intent.putExtra("msg","发送一条广播");
                sendBroadcast(intent);
            }
        });

    }
(2) 广播类:
用于设置 文本框的值
public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String s = intent.getAction();
        String msg = intent.getExtras().getString("msg");
        Log.i(s,msg);

        MainActivity.t3 .setText(msg);
    }
}

(3)activity_main.xml
配置页面:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    xmlns:android="http://schemas.android.com/apk/res/android"


    >

    <EditText
        android:id="@+id/text11"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
      />

    <EditText
        android:id="@+id/text22"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />

    <Button
        android:id="@+id/butn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="go"
        >
    </Button>

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

    <TextView
        android:id="@+id/t3"
        android:layout_width="262dp"
        android:layout_height="45dp"
        android:text="nihao"
        android:gravity="center">
    </TextView>
    <Button
        android:id="@+id/butn3"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:onClick="OrderReceiver"
        android:text="发送有序广播"
        >
    </Button>
</LinearLayout>

(4) 静态广播
静态注册 广播,设置其name 为MyReceiver

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

    </intent-filter>
</receiver>
2、动态广播:
(1)主页面
使用:  IntentFilter filter = new IntentFilter();
                filter.addAction("receiver");
		来动态注册 广播
public class dynamicBroad1 extends AppCompatActivity {
    private  Button start;
    private  Button register = null;
    private  Button cancel;

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


       start= findViewById(R.id.butt1);
       register= findViewById(R.id.butt2);
       cancel= findViewById(R.id.butt3);

        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();

//                由于不在xml写了,故用java 设置receive
                intent.setAction("receiver");//  隐式启动intent,设置 组件:receive的Android:name
                intent.putExtra("msg","开始发送消息");
                sendBroadcast(intent);
            }
        });
         myReceive[] myReceive = {null};
        register.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                实例化 对象: myReceive
                myReceive[0] = new myReceive();
//                注册 receive, 添加过滤器
                IntentFilter filter = new IntentFilter();
                filter.addAction("receiver");
                // 调用方法:registerReceiver 以注册广播器
               registerReceiver(myReceive[0],filter);
            }
        });

        cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                注销 receive
                if(myReceive[0]!=null){
                    unregisterReceiver(myReceive[0]);
                }else{
                    Log.i("","myReceive为空");
                }
            }
        });
    }
}

(2)广播类

public class myReceive extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        Bundle bundle = intent.getExtras();//获得Bundle
        String msg = bundle.getString("msg"); // 获得键值对

        Log.i("action",msg);
    }
}

3、 有序广播

(1)主页面:动态的方式注册广播,并设置每个广播的优先级(数越大优先级越高 [取值范围:-1000~10000 ] )
public class MainActivity extends AppCompatActivity {
 public void OrderReceiver(View view){
        Intent intent = new Intent();
        IntentFilter filter1 = new IntentFilter();
        filter1.addAction("wodeReceiver");
        filter1.setPriority(1000);
        this.registerReceiver(new FirstReceiver(), filter1);

        IntentFilter filter2 = new IntentFilter();
        filter2.addAction("wodeReceiver");
        filter2.setPriority(2000);
        this.registerReceiver(new SecondReceiver(), filter2);
        IntentFilter filter3 = new IntentFilter();
        filter3.addAction("wodeReceiver");
        filter3.setPriority(1000);
        this.registerReceiver(new ThirdReceiver(), filter3);

        intent.setAction("wodeReceiver");
        sendOrderedBroadcast(intent,null);
    }
}

(2)广播一

public class FirstReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("FirstReceiver","FirstReceiver收到广播");
    }
}

(3)广播二

public class SecondReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("SecondReceiver","SecondReceiver收到广播");
    }
}

(4)广播三

public class ThirdReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("ThirdReceiver","ThirdReceiver收到广播");
    }
}

【实验结果】
1、静态广播:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2、 动态广播:
在这里插入图片描述

(1)直接点击开始发送消息:

在这里插入图片描述

(2)点击注册广播,再点击开始发送消息:

在这里插入图片描述

3、有序广播:

在这里插入图片描述

在这里插入图片描述

【实验分析或心得】
从Android版本8.0开始,由于Google对清单文件中静态注册广播接收者做了限制,只能通过动态注册的方式,实现有序广播。
故有序广播需要以动态的方式设置:
在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值