(Broadcast)
1.广播Broadcast是一种广泛运用在应用程序之间用于消息传递的机制
多数的广播是由系统发起的,如地域变换,电量不足,来电来信等。
自己的程序也是可以发出一个广播的
2BroadcastReceiver类是所有的广播接收器对的基类
3消息抵达时,BroadcastReceiver调用onReceive()方法
4在该方法结束后,BroadcastReceiver实例失效
5Android系统提供了两种方法发送广播
(1)Context.sendBroadcast()发送的广播,满足条件的BroadcastReceive都会执行onReceive()方法来处理响应。
(2)Context.sendOrderedBroadcast()发送有序的广播,会根据.BroadcastReceiver注册时IntentFilter的优先级顺序来执行onReceive()方法。
优先级在<intent-filter>的android:priority中声明,也可以在代码中通过IntentFilter.setPriority中声明,也可以在代码中通过IntentFilter.setPriority()方法设置,数越大的优先级就越高。
6 Broadcast Receiver的概念
Broadcast Receiver是一段独立的Java程序代码,需要在Android项目中注册后才可以使用(类似于Activity)
注册方法:
(1)静态注册:(8.0以后可能不大合适)
在AndroidManifest.xml中注册,在内设置过滤器,静态注册的应用程序会一直进行监听(无论是否处于活动态)
(2)动态注册:
在Java中通过Context.registerReceiver()方法来注册
在动态实现注册的类必须是 BroadcastReceiver子类。
分三步:
(1)定义一个广播
(2)定义广播接收器
(3)注册广播接收器
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<Button
android:id="@+id/sendBroadcast"
android:text="发送广播"
android:layout_height="wrap_content"
android:layout_width="wrap_content"></Button>
<Button
android:id="@+id/registerReceiver"
android:text="注册接收器"
android:layout_height="wrap_content"
android:layout_width="wrap_content"></Button>
<Button
android:id="@+id/unregisterReceiver"
android:text="取消注册广播"
android:layout_height="wrap_content"
android:layout_width="wrap_content"></Button>
</LinearLayout>
package com.example.broat_cast_demo;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button sendBroadcast=findViewById(R.id.sendBroadcast);
sendBroadcast.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("sendMsg");
intent.putExtra("msg", "我是广播");
sendBroadcast(intent);
}
});
//动态注册
myReceiver[] receiver={null};
Button registerReceiver=findViewById(R.id.registerReceiver);
registerReceiver.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
receiver[0]=new myReceiver();
IntentFilter filter=new IntentFilter();
filter.addAction("sendMsg");
registerReceiver(receiver[0],filter);
}
});
//动态取消注册
Button unregisterReceiver=findViewById(R.id.unregisterReceiver );
unregisterReceiver.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
unregisterReceiver(receiver[0]);
}
});
}
}
package com.example.broat_cast_demo;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class myReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("Test","已经收到广播信息"+intent.getStringExtra("msg"));
}
}
可以看到点击发送广播以后不会进行发送。
需要先点击注册广播,再进行发送广播才可以正常的进行
又点击取消注册后,再点击发送广播也是不可以正常使用的,所以说只有完成注册之后才可以正常的使用广播。