android基础--广播接收者-BroadcastReceiver

本文介绍了Android中的BroadcastReceiver如何接收广播Intent,包括普通广播和有序广播的使用方式,以及如何订阅和取消订阅。同时,通过短信窃听器和电话拦截的例子,展示了BroadcastReceiver在实际应用中的功能,如拦截特定短信和外拨电话的处理。注意,onReceive()方法必须在10秒内执行完毕,否则可能导致ANR错误。
摘要由CSDN通过智能技术生成
 

广播接收者BroadcastReceiver用于接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast(),Context.sendOrderedBroadcast()来实现的。

       一个广播可以被多个订阅了此广播的接收者接收。要实现一个广播接收者方法如下:

第一步:继承BroadcastReceiver,并重写onReceive()方法。

public class IncomingSMSReceiver extends BroadcastReceiver{

       public void onReceive(Context context,Intent intent){}

}

第二布:订阅感兴趣的广播Intent,方法有二

       1.使用代码进行订阅

              IntentFilter filter = new IntentFilter(“android.provider.Telephony.SMS_RECEIVED”);

              IncomingSMSReceiver receiver = new IncomingSMSReceiver();

              registerReceiver(receiver,filter);

       2.在Manifest.xml文件中的<application>节点里进行订阅

              <receiver android:name=".IncomingSMSReceiver">

                  <intent-filter>

                  <action android:name="android.provider.Telephony.SMS_RECEIVED"/>

                   </intent-filter>

</receiver>

广播类型:

       普通广播:异步,(逻辑上)同一时刻被所有接收者接收,相对传递效率高;

                       然而接收者不能将处理结果传递给下一个接收者,并且无法终止广播的传递

       有序广播:按照接收者声明的优先级别依次接收。

优先级别取值范围-1000---1000,在<intent-filter>的android:priority属性中声明,也可以调用IntentFilter对象的setPriority()进行设置。数值大则级别高。例如 A取300 ,B取200,C取100,则优先级A>B>C,广播先传给A,再给B,再给C;

有序广播可以终止广播的传播,例如A接到后终止了广播,则B和C就无法收到广播;

有序广播的接收者可以将数据传递给下一个接收者,如:A得到广播后,可以往他的结果对象中存入数据,当广播传给B时,B可以从A的结果对象中得到A存入的数据。

Context.sendBroadcast()发送普通广播

Context.sendOrderedBroadcast()发送有序广播

BroadcastReceiver.abortBroadcast()优先级高的终止广播,后面的接收者就再也无法获得广播

setResultExtras(Bundle)存放结果对象,然后传递给下一个接收者

下一个接收者通过:Bundle bundle = getResultExtras(true)可以获取上一个接收者存入在结果对象中的数据。

       系统接收到短信,发出的广播属于有序广播,如果想阻止用户收到短信可以通过设置优先级,让自定义的接收者先获取到广播,然后终止广播,这样用户就接不到了。

 

发送有序广播

 Intent broadcastIntent = new Intent(Intent.ACTION_NEW_OUTGOING_CALL);

 broadcastIntent.putExtra(Intent.EXTRA_PHONE_NUMBER, “13671200900”);

第一个参数为广播对象

 第二个参数为接收该广播的权限

 第三个参数为必须接收该广播的接收者,如果该广播不是一定要被某个接收者接收,该参数可以设置为null

 第四个参数为Hanndle,如果为null,接收者将在Context所在的主线程被调用

 第五个参数为用于标识结果数据的结果码

 第六个参数为结果数据

 第七个参数为附加到广播的额外数据

 sendOrderedBroadcast(broadcastIntent, "android.permission.PROCESS_OUTGOING_CALLS", new OutgoingCallReceiver(), null, Activity.RESULT_OK, number, n

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值