1,接收广播
android中存在两种广播,异步和同步广播,后者按接收器优先级顺序接收,可被截断。自定义接收器继承BroadcastReceiver类重写onReceive方法即可。
广播接收器有两种注册方式,一种在AdroidManifest.xml中注册(静态注册),另一种在java代码中注册(动态注册),动态注册如下所示:
public class Activity1 extends AppCompatActivity { private IntentFilter intentFilter; private NetworkChangeReceiver networkChangeReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_1); intentFilter = new IntentFilter( "android.net.conn.CONNECTIVITY_CHANGE" ); networkChangeReceiver = new NetworkChangeReceiver(); //注册广播接收器 registerReceiver(networkChangeReceiver, intentFilter); } @Override protected void onDestroy() { super .onDestroy(); //注销接收器 unregisterReceiver(networkChangeReceiver); } class NetworkChangeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //处理接收到广播的逻辑 Toast.makeText(context, "network changes" , Toast.LENGTH_SHORT).show(); } } } |
第二种是在androidManifest.xml中静态注册
exported:是否允许接受本程序以外的广播
enabled:是否启用
< receiver android:name = "._广播.BootCompleteReceiver" android:enabled = "true" android:exported = "true" > <!--接收范围--> < intent-filter > < action android:name = "com.example.broadcast.MY_BROADCAST" ></ action > </ intent-filter > </ receiver > |
2,发送广播
如何发送广播呢?很简单,创建一个intent("可被接收的广播名")
然后调用Context的sendBroadcast(intent)或sendOrderedBroadcast(intent)方法来发送异步和同步广播。
Intent intent = new Intent( "com.example.broadcast.MY_BROADCAST" ); sendBroadcast(intent); |
<!--接收范围--> < intent-filter android:priority = "100" > < action android:name = "com.example.broadcast.MY_BROADCAST" ></ action > </ intent-filter > |
如果发送有序广播,可设定intent-fliter的priority属性
以保证广播按priority先后级传播,如果需要截断广播,只需调用abortBroadcast()方法即可。
3,本地广播管理
为了安全问题,一些广播只能在本地应用中传播,可以通过api中的LocalBroadcastManager发送广播即可。
//发送本地广播 LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(Activity1. this ); localBroadcastManager.sendBroadcast(intent); //注册本地广播接收器 LocalReceiver localReceiver = new LocalReceiver(); localBroadcastManager.registerReceiver(localReceiver, new IntentFilter()); |