实验五、广播实验
【实验名称】实验五、广播实验
【实验目的】
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对清单文件中静态注册广播接收者做了限制,只能通过动态注册的方式,实现有序广播。
故有序广播需要以动态的方式设置: