广播接收器是一个用于接收广播通知信息,并做出对应处理的组件。比如我们常见的系统广播──通知时区改变、电池电量低、拍摄了一张照片或者用户改变了语言选项。在实际开发中我们可以拥通过集成自BroadcastReceiver基类来进行自定义广播,实现我们的业务需求的消息通讯。广播接收器没有用户界面。然而,它们可以启动一个activity来响应它们收到的信息,或者用NotificationManager来通知用户,以此来达到一种通讯。 1、广播的类别 * 有序广播(普通广播):对于多个接收者来说是完全异步的,通常每个接收者都无需等待即可以接收到广播,接收者相互之间不会有影响。对于这种广播,接收者无法终止广播,即无法阻止其他接收者的接收动作。这个也是我们使用较多的一种广播类型。 * 无序广播:它每次只发送到优先级较高的接收者那里,然后由优先级高的接受者再传播到优先级低的接收者那里,优先级高的接收者有能力终止这个广播 2、广播的使用流程 1. 继承BroadcastReceiver实现自定义广播类:这里有两种形式的广播创建:单独类文件、内部类形式。重写onReceive方法进行消息的处理。 2. 注册广播:俗称有静态注册和动态注册。静态注册指在manifest文件中注册的广播,这种注册的广播具有应用程序级别的效果。动态注册就是通过代码进行注册,比如我们在Activity中通过Context.registerReceiver进行注册,这种广播具有组件级别的效果,即当我们调用unregisterReceiver()方法或组件销毁广播就无法被接收处理了。 3. 发送广播:这里发送广播通过Context的sendBroadcast()方法或sendOrderedBroadcast()方法进行发送普通广播或有序广播。 动态注册广播; 新建一个匿名内部类,继承 BroadCastReceiver,实现OnReceiver方法。使用IntentFilter增加一个Action。使用Intent进行设置Action,调用sendBroadcast(intent)。 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Intent intent=new Intent(this,broadcastReeceiver.class); // startService(intent);INte // Intent intent=new Intent(); // intent.setAction("com.dsw.send"); // intent.putExtra("data", "data"); // sendBroadcast(intent); IntentFilter intentFilter=new IntentFilter(); intentFilter.addAction("zhangjiqun"); registerReceiver(new broadCast(),intentFilter ); Intent intent=new Intent(); intent.setAction("zhangjiqun"); sendBroadcast(intent); } class broadCast extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context,"67890",Toast.LENGTH_LONG).show(); } } }
静态注册广播;
新建一个BroadCast类:
public class BroadCast extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context,"12345",Toast.LENGTH_LONG).show(); } }
在manifests注册:
<receiver android:name=".broadCastReceiver.BroadCast"> <intent-filter> <action android:name="zhangjiqun"/> </intent-filter> </receiver>
使用Intent进行启动
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent intent = new Intent(); intent.setAction("zhangjiqun"); intent.putExtra("data", "data"); sendBroadcast(intent); // IntentFilter intentFilter=new IntentFilter(); // intentFilter.addAction("zhangjiqun"); // registerReceiver(new broadCast(),intentFilter ); // Intent intent=new Intent(); // intent.setAction("zhangjiqun"); // sendBroadcast(intent); } }
有序广播可以在intentFilter中设置<intent-filter android:priority=”500″> 优先级,进行接收先后的设置,有序广播 有权限中断广播的继续发送。
细心点可以发现,我们在注册BroadcastReceiver的时候,会指定这样一个属性:android:exported=”false”,这个属性就是指定我们的广播在本进程中进行使用。当我们的广播将这个属性设置为true的时候,则其他应用中就可以发送到广播让我们的这个应用接受到。
BroadcastReceiver的生命周期只有十秒左右,如果在 onReceive() 内做超过十秒内的事情,就会报错 。如果需要处理耗时的业务,我们可以开启Service进行处理,谨记一点:广播主要目的是监听获取通知,不要处理繁杂的业务。