Android Broadcast Receive

Broadcast Receive

  广播接收(Broadcast Receive)为android的四大组件之一。主要用于监听广播消息,并做出响应。与应用程序中监听事件相比而言,该监听事件为全局监听。

  Broadcast Receive分为两个部分,一个用于发送广播,一个用于接收广播。而发送广播的方式有两种,一种为发送普通广播,一种为发送有序广播。

广播使用步骤:

1.      在intent中写入发送的action。

2.      发送者通过sendBroadcast(intent)和sendOrderedBroadcast(intent, receiverPermission)两种方式进行发送。

3.      接受者继承BroadcastReceiver,并在onReceive方法中接收广播。

广播发送形式:

普通广播:

1.      该发送方式为异步发送,接受者几乎同一时刻接收。

2.      若无找到该广播接收者,应用不会发生异常。

3.      可通过intent进行信息传递。

4.      接收者未启动状态下,可接收广播,并在后台中启动该应用。

Intent intent = new Intent();
intent.setAction("com.mzzhang.broadcastsend.Normal");
intent.putExtra("message", "this is a normal broadcast");
sendBroadcast(intent);

通过定义Intent意图,并添加Action,最后通过intent进行信息传递。

而广播接收者继承broadcastReceiver会在onReceive中接收到广播发送的信息。

有序广播:

1.  通过接收者在AndroidManifest.xml中设置接收优先级Priority或在代码中动态设置setPriority。优先级范围-1000到1000,数值越大,优先级越高。

2.  可在发送广播中将广播进行中断,而后面的接收者将无法接收到广播通知。

3.  也可在优先级高的广播中添加信息,并传递给下个接收者。

4.  接收者在未启动广播情况下,会自动接收广播,并在后台启动该应用。

Intent intent = new Intent();
intent.setAction("com.mzzhang.broadcastsend.ordered");
intent.putExtra("message", "this is a ordered broadcast");
sendOrderedBroadcast(intent, null);

该启动方式与普通广播方式一致。区别在于sendOrderedBroadcast。

广播接收:

1.  广播接收继承BroadcaseReceive,并在onReceive中接收该广播。

2.  onReceive为主线程,若在onReceive中响应时间过长会照常ANR。

3.  若需要长时间操作可通过广播发送一个命令启动Servie。

4.  监听方式可分为动态监听和静态接听方式。

静态监听注册方式:

<receiver android:name="com.mzzhang.broadcastsend.ReceiveNormal">
<intent-filter android:priority="50">
       <action android:name="com.mzzhang.broadcastsend.Normal"/>
       <action android:name="com.mzzhang.broadcastsend.ordered"/>
</intent-filter>
</receiver>

其中android:priority为优先级时使用

动态监听注册方式:

   IntentFilter filter=new IntentFilter("com.mzzhang.broadcastsend.ordered");
   filter.setPriority(100);
   ReceiveTwo receiver = new ReceiveTwo();
   registerReceiver(receiver, filter);

在onReceive接收,并添加信息。

  Bundle extras = new Bundle();
  extras.putString("message", message.toString());
  setResultExtras(extras);

在下个优先级中接收,并获取上个结果信息。

Bundle bundle = getResultExtras(true);
结束往下传递:abortBroadcast();

 

posted @ 2018-06-21 09:54  星辰之力  阅读(277)  评论(0编辑  收藏  举报