1.广播分为标准广播和有序广播。
标准广播:异步执行,同时接收,效率高,无法被截断。
有序广播:同步执行,同一时刻只会有一个广播接收器能接收到该广播,有先后顺序,可被截断。
2.广播注册的方式分为动态注册和静态注册。
动态注册在代码中注册。
特点:自由控制注册与注销,灵活性强,但是必须在程序启动后才能接收到广播。
静态注册在AndroidManifest.xml中注册。
特点:固定化,可以让程序在未启动的情况下收到广播。
2.1 动态注册的步骤:
①定义广播类继承BroadcastReceiver,重写onReceive()方法。
②创建IntentFilter实例,添加action。
③创建广播类实例,使用registerReceiver()方法进行注册,将广播类实例和IntentFilter实例传进去。
④在onDestroy()中取消注册,调用unregisterReceiver()方法,传入广播类实例。
⑤有必要的声明权限。
//动态注册代码示例:
public class MainActivity extends Activity{
private IntentFilter intentFilter;
private NetworkChangeReceiver networkChangeReceiver;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.com.CONNECTIVITY_CHANGE");
netorkChangeReceiver = new NetworkChangeReceiver();
registerReceiver(netorkChangeReceiver,intentFilter);
}
@Override
protected void onDestroy()
{
super.onDestroy();
unregisterReceiver(networkChangeReceiver);
}
class NetworkChangeReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context,Intent intent)
{
ConnectivityManager connectionManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetorkInfo networkInfo = connectionManager.getActiveNetorkInfo();
if(networkInfo != null && netorkInfo.isAcailable())
{
Toast.makeText(context,"network is available",Toast.LENGT_SHORT).show();
}else{
Toast.makeText(context,"network is unavailable",Toast.LENGT_SHORT).show();
}
}
}
}
<uses-permission android:name = "android.permission.ACCESS_NETWORK_STATE"/>
2.2,静态注册的步骤:
①,新建广播接收类继承BroadcastReceiver用来接收注册的广播。
②,在AndroidManifest.xml中注册
③,声明权限
//代码示例:
public class BootCompleteReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context,Intent intent)
{
Toast.makeText(context,"Boot Complete",Toast.LENGTH_LONG).show();
//截断广播 只有有序广播才能被截断
abortBroadcast();
}
}
<manifest
...
...
<uses-permission android:name = "android.permission.RECEIVE_BOOT_COMPLETED"/>
...
...
<receiver android:name = ".BootCompleteReceiver">
<intent-filter android:priority = "100">//设置广播优先级
<action android:name = "android.intent.action.BOOT_COMPLETED"/>
<intent-filter>
</receiver>
//发送广播
Intent intent = new Intent("com.example,broadcasttest.MY_BROADCAST");
//发送标准广播
sendBroadcast(intent);
//发送有序广播
sendOrderedBroadcast(intent,null);
3.本地广播
本地广播机制发送的广播只能够在应用程序内部进行传递,并且广播接收器也只能接收来自本应用程序发出的广播,可以解决安全问题。
//代码示例:类似动态注册
public class MainActivity extends Activity{
private IntentFilter intentFilter;
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 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();
unregisterReceiver(localReceiver);
}
class LocalReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context,Intent intent)
{
Toast.makeText(context,"received local broadcast",Toast.LENGT_SHORT).show();
}
}
}
}