1.什么是广播?
1.广播是Android四大组件之一,全称BroadCastReceiver。
2.广播分为发送方和接收方,就算没有接收方,发送方也会发送数据。
3.广播可以实现跨多个页面的数据通信。
4.广播可以实现跨进程间的数据通信
2.广播的分类及区别—–有序广播和无序广播
有序广播:
按照接收者的优先级,逐一传递,优先级最高的接收者先接受,如果不终止此广播,再往下传递
无序广播:
不管有多少接收者,一旦发出了无序广播,所以监听此广播的接收者都能接收到
3.广播的注册方式及区别—–静态注册和动态注册
静态注册:
1.先新建类继承BroadcastReceiver
2.然后实现OnReceive抽象方法
3.再AndroidManifest中注册BroadcastReceive
4.最后有Context环境中通过sendBroadcast发送广播
动态注册:
1.新建一个类继承BroadcastReceiver
2.实现OnReceive抽象方法
3.在代码中实例化新建类的广播类
4.在代码中实例化IntentFilter
5.调用IntentFilter对象的addAction方法设置频道
6.在有context环境中调用registerReceiver注册广播
7.在有context环境中通过sendBroadcast发送广播
8.在有context环境中通过unregisterReceiver
区别:
动态注册的广播会受Activity的生命周期的影响, 当Activity销毁的时候,广播就失效了。而静态注册的广播,即使Activity销毁了,仍然可以收到广播,即使杀死进程也依然可以运行。但是我们一般用到的是动态注册,动态注册相比来说更加的方便也能更有选择性的去使用,不需要像静态注册那么固定
4.静态注册无序广播
public class BroadcastActivity extends AppCompatActivity implements View.OnClickListener {
private Button broadcast_btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_broadcast);
broadcast_btn = findViewById(R.id.broadcast_btn);
broadcast_btn.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.broadcast_btn:
Intent intent=new Intent();
intent.setAction("com.fly.fm106.9");
Bundle bundle=new Bundle();
bundle.putString("name","张三");
intent.putExtras(bundle);
//发送广播
sendBroadcast(intent);
break;
default:
break;
}
}
}
再写一个内部类用来接收广播发出的消息
class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
String name=intent.getStringExtra("name");
Bundle bundle=getResultExtras(true);
Log.e("MyReceiver", "接收者"+name);
}
}
最后在这个方法后面用快捷键提示在manifest中注册
5.静态注册有序广播
其他的与静态无序广播大体相同,唯一不同的地方是在Manifest中注册时多加了一个优先级
<receiver android:name=".broadcast.MyReceiver">
<intent-filter android:priority="100">
<action android:name="Intercept_Stitch" />
</intent-filter>
</receiver>
6.动态注册无序广播
myReceiver=new MyReceiver();
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("com.fly.shoppingcar.price");
registerReceiver(myReceiver,intentFilter);
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(myReceiver);
}
在运行的app被销毁时还行解绑,这也就完成了动态无序广播
7.动态注册有序广播
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_shopping_car);
addBroadCast = new FirstBroadCast();
IntentFilter addfilter = new IntentFilter();
addfilter.addAction(MY_BROADCAST_ACTION);
addfilter.setPriority(100);
registerReceiver(addBroadCast, addfilter);
lessenBroadCast = new TwiceBroadCast();
IntentFilter lessenfilter= new IntentFilter();
lessenfilter.addAction(MY_BROADCAST_ACTION);
lessenfilter.setPriority(5);
registerReceiver(lessenBroadCast, lessenfilter);
}
通过
addfilter.setPriority(100);
lessenfilter.setPriority(5);
来设置优先级;
8.适配器中发送广播示例
//动态注册广播
private void initReceiver() {
myReceiver=new MyReceiver();
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("com.fly.shoppingcar.price");
registerReceiver(myReceiver,intentFilter);
}
class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
int price=intent.getIntExtra("price",0);
sum_prise.setText((sumprise+price)+"");
}
}
viewHolder.addIV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent();
intent.setAction("com.fly.shoppingcar.price");
intent.putExtra("price",f.getPrise());
context.sendBroadcast(intent);
}
});
viewHolder.lessenIV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent();
intent.setAction("com.fly.shoppingcar.price");
intent.putExtra("price",-f.getPrise());
context.sendBroadcast(intent);
}
});
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(myReceiver);
}
我这里是在适配器中用到缓存原理添加数据,然后再ViewHolder中来进行广播的传值,再在Activity中创建一个内部类继承BroadcastReceiver来接收,最后写onDestroy方法中完成解绑工作。
9.Service中发送广播示例
public class ImageBroadcast extends Service{
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
new Thread(new Runnable() {
@Override
public void run() {
try {
URL url=new URL("https://360.cn/timg?image&imgtype=jpg&src=http%3A%2F%2Fimg4.imgtn.bdimg.com%2Fit%2Fu%3D1950000289%2C454533439%26fm%3D214%26gp%3D0.jpg");
HttpURLConnection connection= (HttpURLConnection) url.openConnection();
InputStream inputStream=connection.getInputStream();
Bitmap bitmap= BitmapFactory.decodeStream(inputStream);
Log.e("3213112342", "run: "+bitmap);
Intent intent=new Intent();
intent.setAction("com.example.myapplication.img");
intent.putExtra("bitmap",bitmap);
sendBroadcast(intent);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
return super.onStartCommand(intent, flags, startId);
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
先注册好广播,并且用到解析图片的方法得到图片,再在Activity中来接收
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_image_broadcast);
MyReceiver1 myReceiver1=new MyReceiver1();
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("com.example.myapplication.img");
registerReceiver(myReceiver1,intentFilter);
img_broadcast=findViewById(R.id.img_broadcast);
Intent intent = new Intent(ImageBroadcastActivity.this, ImageBroadcast.class);
startService(intent);//启动service
}
class MyReceiver1 extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Bitmap bitmap=intent.getParcelableExtra("bitmap");
img_broadcast.setImageBitmap(bitmap);
}
}
通过上述的步骤,就能完成Service中发送广播了
10.系统广播
系统广播,顾名思义,就是系统自带的广播,你只能用,不能改;
下面介绍一些常用的系统广播:
监听网络变化 android.net.conn.CONNECTIVITY_CHANGE
关闭或打开飞行模式 Intent.ACTION_AIRPLANE_MODE_CHANGED
系统启动完成后(仅广播一次) Intent.ACTION_BOOT_COMPLETED
重启设备 Intent.ACTION_REBOOT
屏幕被关闭 Intent.ACTION_SCREEN_OFF
屏幕被打开 Intent.ACTION_SCREEN_ON