什么是广播
1:广播是Android四大组件之一,全称BroadCastReceiver。
2:广播分为发送方和接收方,就算没有接收方,发送方也会发送数据。
3:广播可以实现跨多个页面的数据通信。
4:广播可以实现跨进程间的数据通信
广播的分类及区别——有序广播和无序广播
有序广播:按照接收者的优先级,逐一传递,优先级最高的接收者先接受,如果不终止此广播,再往下传递
无序广播:不管有多少接收者,一旦发出了无序广播,所以监听此广播的接收者都能接收到
广播的注册方式及区别——静态注册和动态注册
静态注册:
1.先新建类继承BroadcastReceiver
2.然后实现OnReceive抽象方法
3.再AndroidManifest中注册BroadcastReceive
4.最后有Context环境中通过sendBroadcast发送广播
代码如下:
<receiver android:name="">
<intent-filter>
<action android:name="" />
</intent-filter>
</receiver>
动态注册:
1.新建一个类继承BroadcastReceiver
2.实现OnReceive抽象方法
3.在代码中实例化新建类的广播类
4.在代码中实例化IntentFilter
5.调用IntentFilter对象的addAction方法设置频道
6.在有context环境中调用registerReceiver注册广播
7.在有context环境中通过sendBroadcast发送广播
8.在有context环境中通过unregisterReceiver
区别:
1.动态注册广播不是常驻型广播,也就是说广播跟随activity的生命周期。注意: 在activity结束前,移除广播接收 器。静态注册是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。
静态注册无序广播
代码展示:
Activity:
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import com.example.myapplication.R;
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("Intercept_Stitch");
Bundle bundle=new Bundle();
bundle.putString("name","蟑国庆");
intent.putExtras(bundle);
//发送广播
sendBroadcast(intent);
break;
default:
break;
}
}
}
再建一个接收广播的类:
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
public 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);
}
}
AndroidManifest中:
<receiver android:name=".broadcast.MyReceiver">
<intent-filter>
<action android:name="Intercept_Stitch" />
</intent-filter>
</receiver>
静态注册有序广播
和上面差不多,
public void onClick(View view) {
switch (view.getId()) {
case R.id.broadcast_btn:
Intent intent=new Intent();
//定义广播事件类型
intent.setAction("Intercept_Stitch");
Bundle bundle=new Bundle();
bundle.putString("name","蟑国庆");
intent.putExtras(bundle);
//发送广播
sendOrderedBroadcast(intent,null);
break;
default:
break;
}
}
接收和上面一样
AndroidManifest:
<receiver android:name=".broadcast.MyReceiver">
<intent-filter android:priority="100">
<action android:name="Intercept_Stitch" />
</intent-filter>
</receiver>
动态注册无序广播
Activity:
myBoradCast = new MyBoradCast();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.example.mytest.MY_BROADCAST");
registerReceiver(myBoradCast,intentFilter);
动态注册有序广播
动态有序在动态无序上添加个属性
myBoradCast = new MyBoradCast();
IntentFilter intentFilter = new IntentFilter();
//优先级
intentFilter.setPriority(1);
intentFilter.addAction("com.example.mytest.MY_BROADCAST");
registerReceiver(myBoradCast,intentFilter);
适配器中发送广播示例
适配器中:
viewHolder.add_img.setOnClickListener(new View.OnClickListener() {
int x=1;
@Override
public void onClick(View view) {
Intent intent=new Intent();
intent.setAction("com.example.paopao.price");
intent.putExtra("price",f.prise);
context.sendBroadcast(intent);
x++;
viewHolder.perPice.setText(x+"");
}
});
在activity类里面创建一个内部类继承BroadcastReceiver
class MyRecrvie extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
double price=intent.getDoubleExtra("price",0);
sumprise+=price;
double value=new BigDecimal(sumprise).setScale(2, RoundingMode.HALF_UP).doubleValue();
sum_prise.setText(""+value);
}
注册广播
private void initReceive() {
myRecrvie=new MyRecrvie();
intentFilter=new IntentFilter();
intentFilter.addAction("com.example.paopao.price");
registerReceiver(myRecrvie,intentFilter);
}
Service中发送广播示例
新建一个类继承servince
import android.app.Service;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
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://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1529499172843&di=1bd010d32a1b039f9e1836fd4fc86b48&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;
}
}
注册广播,接收图片
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Bitmap;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;
import com.example.myapplication.R;
public class ImageBroadcastActivity extends AppCompatActivity {
private ImageView img_broadcast;
@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);
}
}
}
系统广播
常见的操作:
监听网络变化 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