一、类型
-
标准广播
完全异步执行的广播,所有广播接收器几乎都会同时接收到这条广播消息(只要含有相同的广播名)
-
有序广播
同步执行的广播,广播接收器有先后顺序(可将广播截断)
二、接收系统广播(需要获取相应的系统权限)
-
如何创建一个广播接收器?
新建一个类,让他继承自BroadcastReceiver,并且重写父类的onReceive()方法
-
动态注册(在代码中注册—推荐)
MainActivity.java
package com.example.lenovo.broadcasttest; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.Toast; public class MainActivity extends AppCompatActivity { private IntentFilter intentFilter; private NetworkChangeReceiver networkChangeReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); intentFilter=new IntentFilter(); //广播接收器想要监听什么广播,就在这里添加相应的action intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); networkChangeReceiver=new NetworkChangeReceiver(); //调用registerReceiver()进行注册,让NetworkChangeReceiver收到android.net.conn.CONNECTIVITY_CHANGE的广播 registerReceiver(networkChangeReceiver,intentFilter); } @Override protected void onDestroy(){ super.onDestroy(); unregisterReceiver(networkChangeReceiver); } //广播接收器 class NetworkChangeReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent){ //通过getSystemService()得到ConnectivityManager的实例,这是一个系统类,专门用于管理网络连接 ConnectivityManager connectionManager=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo=connectionManager.getActiveNetworkInfo();//获得网络信息 if(networkInfo!=null&&networkInfo.isAvailable()){ Toast.makeText(context,"network is available",Toast.LENGTH_SHORT).show(); }else { Toast.makeText(context,"network is unavailable",Toast.LENGTH_SHORT).show(); } } } }
在AndroidManifest.xml中注册权限(不注册会导致崩溃)
<!-- 申请查看网络状态的权限 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
效果图:
3. 静态注册(在AndroidManifest.xml注册—不推荐)
-
优点:
在程序未启动的情况下就能接收广播
-
问题原因:
Android8.0在AndroidManifest.xml文件中静态注册广播接收失效是由于官方对耗电量的优化,避免APP滥用广播的一种处理方式。除了少部分的广播仍支持静态注册(如开机广播),其余的都会出现失效的情况。 -
解决方案:可以参考我的另一篇博客:
三、自定义广播
- 本地广播
MainActivity.java
package com.example.lenovo.broadcasttest;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private IntentFilter intentFilter;
//主要就是:使用LocalBroadcastManager来对广播进行管理
private LocalReceiver localReceiver;
private LocalBroadcastManager localBroadcastManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
localBroadcastManager = LocalBroadcastManager.getInstance(this); // 获取实例
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
localBroadcastManager.sendBroadcast(intent); // 发送本地广播
}
});
intentFilter = new IntentFilter();
intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
localReceiver = new LocalReceiver();//实例化接受类
localBroadcastManager.registerReceiver(localReceiver, intentFilter); // 注册本地广播监听器(将要发送的广播名给自己)---神似动态注册
}
@Override
protected void onDestroy() {
super.onDestroy();
localBroadcastManager.unregisterReceiver(localReceiver);
}
class LocalReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "我广播我自己", Toast.LENGTH_SHORT).show();
}
}
}
- 效果图
- 优势
- 明确知道广播只能传给自己,不会离开我们的程序,因此不必担心机密数据泄露
- 其他的程序也无法广播到我们程序的内部,因此不需要担心有安全漏洞的隐患
- 本地广播比系统全局广播更为高效