线上服务咨询
Android的四个主要组件BroadcastReceiver广播接收器
发表时间:2019-07-30 16:25:09
文章来源:沈阳软件开发
标签:网站建设 小程序开发 小程序制作 微信小程序开发 公众号开发 微信公众号开发 网页设计 网站优化 网站排名 网站设计 微信小程序设计 小程序定制 微信小程序定制
浏览次数:0
当系统收到短消息时,它将发送一个动作名为android.provier.Telephony.SMS_RECEIVED的广播Intent。 Intent存储接收的短消息内容,并且可以使用名称“pdus”从Intent获取短消息内容。
Pdus是一个对象类型数组,每个对象都是一个byte []字节数组,每个项目都是一条文本消息。
Object [] pduses=(Object [])intent.getExtras()。get('pdus');
for(Objectpdus: pduses){
byte[] pdusmessage=(byte[])pdus;
SmsMessage sms=SmsMessage.createFromPdu(pdusmessage);
Stringmobile=sms.getOriginatingAddress(); //发送手机号码
Stringcontent=sms.getMessageBody(); //短信内容
日期日期=new日期(sms.getTimestampMillis());
SimpleDateFormat format=newSimpleDateFormat('yyyy-MM-dd HH: mm: ss');
Stringtime=format.format(date); //获取发送时间
}
广播接收器(BroadcastReceiver)用于接收广播Intent。通过调用Context.sendBroadcast(),Context.sendOrdeedBroadcast(),context.sendStickyBroadcast()来发送广播Intent,通常广播Intent可以订阅此Intent。由多个广播接收器接收,此功能类似于JMS中的主题消息接收器。为了实现广播接收器,该方法如下:
第一步是继承BroadcastReceiver并覆盖onReceive()方法
public classSMSBroadcastReceiverextendsBroadcastReceiver {
@override
public voidonReceive(Context context,Intent intent){
}
}
onReceive的生命周期为10秒,因此内部操作不能超过10秒
第二步是订阅感兴趣的广播Intent。有两种订阅方式:
第一个:使用代码订阅
SMSBroadcastReceiver receiver=new SMSBroadcastReceiver();
IntentFilter filter=newIntentFilter();
filter.addAction( 'android.provider.Telephony.SMS_RECEIVED');
context.registerReceiver(接收器,过滤器);
第二:在AndroidManifest.xml文件中的节点中订阅
'.SMSBroadcastReceiver' >
'android.provider.Telephony.SMS_RECEIVED'/>
第三步是增加接收短信的能力
'android.permission.RECEIVE_SMS' >
广播分为两种不同的类型,“普通广播”和“有序广播”。普通广播是完全异步的,并且可以由所有接收者同时(逻辑上)接收。消息传递的效率相对较高,但缺点是接收器不能将处理结果传递给下一个接收器而不能终止广播。意图传播;但是,有序广播符合接收者声明的优先级(在intent-filter元素的android: priority属性中声明,数据优先级越高,值范围:-1000到1000也可以调用IntentFilter对象setPriority()已设置),接收器依次接收广播。例如,如果A的级别高于B并且B的级别高于C,则首先将广播发送到A,然后发送到B,最后发送到C.在A广播之后,可以将数据存储在广播。当广播被发送到B时,B可以从广播中获得存储在A中的数据。
Context.sendBroadcast()发送普通广播,所有订阅者都可以访问它并进行处理。
Context.sendOrderedBroadcast()发送有序广播。系统根据接收器声明的优先级逐个执行接收器。如果前一个接收者接收到广播,则前一个接收者有权终止广播(BroadcastReceiver.abortBroadcast())。终止后,后续收件人将无法再获得广播。对于有序广播,前一个接收者可以将处理结果存储在广播Intent中,然后将其传递给下一个接收者。
sendStickyBroadcast()表示如果发送广播则执行registerReceiver(BroadcastReceiver,IntentFilter)。这种方法仍然可以接受。换句话说,在ReceiverActivity中,Recevier是通过代码注册的,而不是在Manifest中注册的。 sendStickyBroadcast发布的最后一个Intent将被保留,并在下次Recevier激活时被接受。需要添加BROADCAST_STICKY权限,否则会抛出SecurityException
接收电池电量变化广播:
'android.intent.action.BATTERY_CHANGED'/>
接收启动汇海广播
'android.intent.action.BOOT_COMPLETED'/>
并制作许可声明
在Android中,程序(响应)的响应由两个系统服务Activity Manager和Window Manager监视。当BroadcastReceiver在10秒内未执行时,Android将认为该程序不存在。响应,因此您无法在BroadcastReceiver中执行一些耗时的操作,否则将弹出ANR(应用程序无响应)对话框。如果您需要完成一项相对耗时的工作,您应该通过向服务发送一个Intent来完成此操作,该Intent由Service完成,而不是使用子线程,因为BroadcastReceiver的生命周期很短(一个实例)在执行onReceive()之后的BroadcastReceiver。将被销毁),子线程可能在它结束之前不结束BroadcastReceiver。如果BroadcastReceiver完成且其主机进程仍在运行,则子线程将继续执行。但是,当系统需要内部时,主机进程现在很容易被杀死。因为它属于空进程(没有任何活动组件的进程)。
每次广播消息到达时,都会创建一个BroadcastReceiver实例来执行onReceive()方法。
例如:
[java]查看plaincopy
Packagecom.king.sms;
importjava.text.SimpleDateFormat;
importjava.util.Date;
importandroid.content.BroadcastReceiver;
Importandroid.content.Context;
importandroid.content.Intent;
importandroid.telephony.SmsMessage;
publicclassSMSBroadcastReceiverextendsBroadcastReceiver {
@override
publicvoidonReceive(Contextcontext,Intentintent){
对象[] pduses=(对象[])intent.getExtras()得到( '的PDU');
对于(Objectpdus: pduses){
字节[] pdusmessage=(字节[])的PDU;
SmsMessagesms=SmsMessage.createFromPdu(pdusmessage);
Stringmobile=sms.getOriginatingAddress(); //发送手机号码
Stringcontent=sms.getMessageBody(); //短信内容
Datedate=newDate(sms.getTimestampMillis());
SimpleDateFormatformat=newSimpleDateFormat('yyyy-MM-ddHH: mm: ss');Stringtime=format.format(date); //获取发送时间
}
}
}
//AndroidManifest.xml
[java]查看plaincopy
网站建设,小程序开发,小程序制作,微信小程序开发,公众号开发,微信公众号开发,网页设计,网站优化,网站排名,网站设计,微信小程序设计,小程序定制,微信小程序定制