Broadcast是Android四大组件中的组件之一,其发布-订阅的模式有利于四大组件间的通信,当我们需要在组件间通信或者进程间通信的时候,应考虑Broadcast。
静态注册在应用程序关闭的时候也能接收广播,系统软件管理器会在安装应用程序的时候注册接收器,然后接收器作为应用程序的单独入口点,当系统发送广播的时候,会遍历所有接受的接收器,遇到没有启动应用程序的接收器,系统会先启动应用程序,再发送广播让接收器接收。
代码事例如下:
静态注册在注册清单中进行注册,其中android:exported为true表示可以跨进程接收,为false则是只接收
动态注册要看上下文对象来决定订阅对象,如果是Application为上下文对象,那么在应用程序启动没有被关闭进程之前都能接收到广播;假如Activity为上下文对象那么广播只能在Activity处于注册区间内接收到,比如一般我们需要确保注册和反注册的时候生命周期要对应 onCreate()对应 onDestory(),onResume()对应onStop()。
注册和反注册代码例子如下:
注册
BroadcastReceiver br = new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
this.registerReceiver(br, filter);
反注册
this.unregisterReceiver(br)
顺序广播:每个顺序广播都有序号,按照序号逐个发送广播,优先的广播会把结果传递到下一个广播,以便在某些情况下可以对广播进行中止操作,通过设置android:priority 来定义顺序
正常广播:正常广播,也称无序广播,不可以中止广播,也不会把结果传递到下一个广播
顺序广播:
Intent intent = new Intent();
intent.setAction("com.example.broadcast.MY_NOTIFICATION");
intent.putExtra("data","Notice me senpai!");
String receiverPermission=“android.permission.SEND_SMS";
sendOrderedBroadcast(intent);
Intent为意图对象;String
正常广播:
Intent intent = new Intent();
intent.setAction("com.example.broadcast.MY_NOTIFICATION");
intent.putExtra("data","Notice me senpai!");
sendBroadcast(intent);
在进行跨应用消息传递到场景中, BroadcastReceiver发送和注册的时候,Android提供了API对发送者和实施者进行了一定的限制。
sendBroadcast(Intent, String)
sendOrderedBroadcast(Intent, String, BroadcastReceiver, Handler, int, String, Bundle)
例子如下:
sendBroadcast(new Intent(“com.example.NOTIFY”), Manifest.permission.SEND_SMS);
当我们发送应用使用以上的API进行发送广播的时候,接收应用在注册清单中必须具备对应的Manifest.permission.SEND_SMS权限才能接收到发送应用发送过来到广播
registerReceiver(BroadcastReceiver, IntentFilter, String, Handler)
接收方应用:
注册分为清单文件注册和上下文注册两种方式;
清单注册例子如下:
上下文注册如下:
IntentFilter filter = new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED);
registerReceiver(receiver, filter, Manifest.permission.SEND_SMS, null );
为了能够发送信息到这些接收器,发送方的注册清单必须添加如下权限:
当我们仅仅运用Broadcast在应用内传递消息时,为了安全考虑使用权限限制会增加我们的代码量而显得没有必要,基于此Google 在support 包中引入了LocalBroadcastManager API 来发送广播,以支持应用内传递消息,而不需要做安全壁垒。
LocalBroadcastManager有如下优点:
LocalBroadcastManager创建对象:
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance( this ) ;
LocalBroadcastManager注册广播接收器:
LocalBroadcastManager.registerReceiver( broadcastReceiver , intentFilter );
LocalBroadcastManager反注册广播接收器:
LocalBroadcastManager.unregisterReceiver( broadcastReceiver );
LocalBroadcastManager发送广播:
LocalBroadcastManager.sendBroadcast( intent ) ;
在Android7.0以上的系统中。Google公司对广播7进行来一定的修改和优化,需要注意一些东西。
注意添加:android:scheme
获取U盘的路径为:
intent.getData().getPath()
Intent.ACTION_HEADSET_PLUG:android.intent.action.HEADSET_PLUG
获取状态
intent.getIntExtra("state", 0)
当state为零时,耳机未插入;当state为1时,耳机为已插入;
Intent.ACTION_SCREEN_ON:开屏
Intent.ACTION_SCREEN_OFF:锁屏