问题:
为什么学习广播接受者
Android中内置了多个系统广播:只要涉及到手机的基本操作(如开机、网络状态变化、拍照等等),都会发出相应的广播。
BroadCastReceiver(广播接收器),属于Android四大组件之一,在Android开发中,BroadCastReceiver的应用场景非常多,一般用于组件间通信。
解决问题需要运用知识点:
广播生命周期,有序、无序广播,系统广播,自定义广播。
广播接受者有两种注册方法:动态注册,静态注册
定义:广播是应用于系统、应用、控件、线程间消息响应的组件。
使用广播思路分析:
创建广播接收者BroadCastReceiver类
注册广播接受者(静态或动态,常用动态注册)
调用sendBroadcast()方法发送广播
onReceiver(Context context,Intent intent)方法处理广播
重点:为什么要动态注册广播
1.在Android7.0之前我们只需要静态注册一下广播就可以实现实时监听网络状态的变化;
2.但是在Android7.0之后,如果我们需要实时监听监听网络状态变化,需要动态注册广播;
静态注册和动态注册的区别
动态注册:
1.广播会跟Activity的生命周期结束而结束;
2.自由的控制注册和取消,有很大的灵活性。
静态注册:
1.广播不会跟随Activity的生命周期的结束而结束,一直存在,即使应用程序关闭,也会被唤醒接收广播;
2.全局的广播。
使用广播思路分析:
1.创建广播接收者BroadCastReceiver类
2.onCreate方法中注册/onDestroy方法中解除注册(不需要在清单文件中注册)
3.调用sendBroadcast()方法发送广播
4.onReceiver(Context context,Intent intent)方法处理广播
动态注册:
static TextView tv1;
MyReceiver myReceiver;
public static Handler handler = new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if (msg.what == 200) {
String str = msg.obj.toString();
Log.i("--ss", "handleMessage: "+str);
tv1.setText(str);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv1 = findViewById(R.id.tv1);
myReceiver = new MyReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.bw.wpc");
registerReceiver(myReceiver,intentFilter);
}
public void senddata(View view) {
Intent intent1 = new Intent();
intent1.setAction("com.bw.wpc");
Bundle bundle = new Bundle();
bundle.putString("name","张学友");
intent1.putExtras(bundle);
sendBroadcast(intent1);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(myReceiver);
}
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("com.bw.wpc")){
Log.i("---show", "onReceive: ");
Bundle bundle = intent.getExtras();
Message message = Message.obtain();
message.what=200;
String name = bundle.getString("name");
message.obj = name;
MainActivity.handler.sendMessage(message);
}
}
静态注册:
public void broad(View view) {
Intent intent1 = new Intent();
intent1.setAction("com.bw.wpc");
Bundle bundle = new Bundle();
bundle.putString("name","牛马");
bundle.putInt("age",21);
bundle.putFloat("money",33.2f);
intent1.putExtras(bundle);
sendBroadcast(intent1);
}
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("com.bw.wpc")){
Bundle extras = intent.getExtras();
String name = extras.getString("name");
int age = extras.getInt("age");
float money = extras.getFloat("money");
Toast.makeText(context,"接受到了,静态广播"+name+age+money,Toast.LENGTH_SHORT).show();
}
}
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.bw.wpc"></action>
</intent-filter>
</receiver> //清单文件