//获取程序中的button按钮
button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//创建Intent对象
Intent intent = new Intent();
intent.setAction(“com.example.broadcast.MyBroadcast”);
intent.putExtra(“msg”, “简单的消息”);
//发送有序广播
sendOrderedBroadcast(intent,null);
}
});
第一个接收者
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
System.out.println(“MyReceiver called”);
Toast.makeText(context,
“接收到的Intent的Action为”+intent.getAction()
+"\n消息内容是:"+intent.getStringExtra(“msg”),
Toast.LENGTH_SHORT).show();
//创建Bundle对象并存入数据
Bundle bundle = new Bundle();
bundle.putString(“first”,“第一个BroadcastReceiver存入的消息”);
//将Bundle放入结果中
setResultExtras(bundle);
}
}
第二个接收者
public class MyBroadcastReceiver2 extends MyBroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent){
System.out.println(“MyReceiver called”);
Bundle bundle = getResultExtras(true);
//解析前一个BroadcastReceiver所存入得到key为first的消息
String first = bundle.getString(“first”);
Toast.makeText(context,“第一个BroadcastReceiver存入的消息:”
+first,Toast.LENGTH_LONG).show();
}
}
效果如下:
Android系统当中自带的Broadcast Action
如果应用需要在系统特定时刻执行某些操作,就可以通过监听系统广播来实现。Android的大量系统事件都会对外发送标准广播。下面是Android常见的广播Action常量
-
ACTION_TIME_CHANGED:系统事件被改变
-
ACTION_DATE_CHANGED:系统日期被改变
-
ACTION_TIMEZONE_CHANGED:系统时区被改变
-
ACTION_BOOT_COMPLETED:系统启动完成
-
ACTION_PACKAGE_ADDED:系统添加包
-
ACTION_PACKAGE_CHANGED:系统的包改变
-
ACTION_PACKAGE_REMOVED:系统的包被删除
-
ACTION_PACKAGE_RESTARTED:系统的包被重启
-
ACTION_PACKAGE_DATA_CLEARED:系统的包数据被清空
-
ACTION_BATTERY_CHANGED:电池电量改变
-
ACTION_BATTERY_LOW:电池电量低
-
ACTION_POWER_CONNECTED:系统连接电源
-
ACTION_POWER_DISCONNECTED:系统与电源断开
-
ACTION_SHUTDOWN:系统被关闭
通过使用BroadcastReceiver来监听特殊的广播,即可让应用随系统执行特定的操作。
使用广播接收器的一般步骤
1.实现一个广播接收器,继承自BroadcastReceiver类,重写onReceive()方法
注意不要在onReceive() 方法中添加过多的逻辑或者进行任何的耗时操作,因为在广播接收器中是不允许开启线程的, 如果BroadcastReceiver的onReceiver()方法不能在10秒内执行完成,Android会认为该程序无响应,会弹出ANR(Application No Response)对话框。
如果确实需要根据Broadcast来完成一项比较耗时的操作,则可以考虑通过Intent启动一个Service来完成该操作。
2.注册广播接收器
广播接收器的注册方法有两种:静态注册和动态注册
静态注册
在清单配置文件中声明,即使进程被杀死,该广播仍然运行。
可惜的是在清单文件进行静态注册这种方式在Android8.0,API26以后已经不能使用了。
动态注册
在代码中注册,受activity生命周期的影响。
在这里稍微说一下,在Context这个类当中提供了如下两个函数:
- registerReceiver(receiver,filter);
这个函数的作用就是将一个BroadcastReceiver注册到应用程序当中,这个函数接收两个参数,第一个参数是需要注册的BroadcastReceiver对象,第二个是一个IntentFilter。第一个参数是非常容易理解的,第二个参数的作用是定义了哪些Intent才能触发这个注册的BroadcastReceiver对象。
- unregisterReceiver(receiver);
这个方法就非常简单了,用于解除BroadcastReceiver的绑定状态。一旦解除完成,响应的BroadcastReceiver就不会再接收系统所广播的Intent了。
public class MainActivity extends AppCompatActivity {
private MyBroadcastReceiver receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//动态注册
IntentFilter filter = new IntentFilter();
//广播接收器想要监听什么广播, 就在这里add相应的action
filter.addAction(“android.intent.action.BOOT_COMPLETED”);
receiver = new MyBroadcastReceiver();
//注册
registerReceiver(receiver,filter);
}
@Override
//当Activity不可见或者销毁时,解除注册
protected void onStop(){
super.onStop();
unregisterReceiver(receiver);
}
}
实例介绍(动态注册——监听网络变化)
MainActivity.java
public class MainActivity extends AppCompatActivity {
private NetWorkChangeReceiver receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
IntentFilter filter = new IntentFilter();
filter.addAction(“android.net.conn.CONNECTIVITY_CHANGE”);
receiver = new NetWorkChangeReceiver();
registerReceiver(receiver,filter);
}
@Override
protected void onStop(){
super.onStop();
unregisterReceiver(receiver);
}
}
NetWorkChangeReceiver.java
public class NetWorkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent){
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
if (networkInfo!=null&&networkInfo.isAvailable()){
Toast.makeTe
xt(context,“网络可用”, Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(context,“网络不可用”,Toast.LENGTH_SHORT).show();
}
}
}
最后在AndroidManifest.xml清单文件中添加权限
xt.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
if (networkInfo!=null&&networkInfo.isAvailable()){
Toast.makeTe[外链图片转存中…(img-qOg5c8pK-1642524812258)]
xt(context,“网络可用”, Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(context,“网络不可用”,Toast.LENGTH_SHORT).show();
}
}
}
最后在AndroidManifest.xml清单文件中添加权限