BroadcastReceiver广播接收器

BroadcastReceiver 广播接收器

广播接收器,主要是用于app注册一些指定事件的广播接收器,系统在这些事件被触发的时候,会通知到注册的广播接收器,然后广播接收器在onReceive函数中对接收到的通知进行处理;
广播接收器的两种注册方式:
静态注册:
<receiver android:name=".SMSBroadcastReceiver" >
  <intent-filter>
    <action android:name="android.provider.Telephony.SMS_RECEIVED" />
  </intent-filter>
</receiver >

动态注册:
IntentFilter intentFilter=new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
registerReceiver(mSmsBroadcastReceiver ,intentFilter);

//解注册
unregisterReceiver(receiver);

BroadcastReceiver的生命周期
创建 BroadcastReceiver对象 -> onReceive -> 对象调用结束;

Broadcast的onReceive一般调用最长时间为10秒(也有可能更短),如果超过10秒,就很有可能被系统给结束掉;所以一些耗时的任务,我们需要发给Service来进行处理;
(当初写的一个简单的短信自动回复的app,在onReceive里面创建了一个线程,并且将处理回复的任务交给这个线程处理,后来发现经常没有回复短信,到后来才知道BroadcastReceiver有这个限制)

其他广播接收
广播接收器另外的注册方法:

private void registerScreenActionReceiver(){
  final IntentFilter filter = new IntentFilter();
  filter.addAction(Intent.ACTION_SCREEN_OFF);
  filter.addAction(Intent.ACTION_SCREEN_ON);
  registerReceiver(receiver, filter);
}

private BroadcastReceiver receiver = new BroadcastReceiver(){
  @Override
  public void onReceive(final Context context, final Intent intent) {
    // Do your action here

  }
}


通过一个IntentFilter,将对应的Action加进去,然后进行注册;上面是注册屏幕锁定和解锁的广播接收器注册;receiver 是一个 Broadcast的匿名类实现;

开关机事件Action,可以在Manifest.xml里面,增加该Action对应的广播接收器配置
<action android:name="android.intent.action.BOOT_COMPLETED" /> 开机启动完毕
<action android:name="android.intent.action.ACTION_SHUTDOWN" /> 关机
android.intent.action.BATTERY_CHANGED 电量变化(电量变化可以在registerReceiver时候,返回的Intent中获取电量信息)
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> 网络状态变化


需要权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.BATTERY_STATS"/>

发送广播:
普通广播,通过 Context.sendBroadcast(Intent myIntent) 来发送广播;
有序广播,通过Context.sendOrderedBroadcast(intent, receiverPermission)来发送有序广播;第二个参数决定广播的级别,值越大优先级越高;广播接收器接收级别可以在intent-filter中指定
<intent-filter android:priority = "2147483647" > 设置priority=2147483647的话表示最高优先级,app先于其他app收到该广播,如果级别一样则会随机接收,例如某些短信防火墙之类的,大概就是安全软件获取了最高优先级,在接收到之后,调用  abortBroadcast()  可以中断广播的发送;
 
发送以上两个广播并不需要权限;
 
异步广播:
通过 sendStickyOrderedBroadcast(intent, resultReceiver, scheduler,  initialCode, initialData, initialExtras);来发送;
接收并处理完Intent后,广播依然存在,直到你调用removeStickyBroadcast(intent)主动把它去掉;
 
异步广播需要权限
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
 

还有其他的广播接收器使用,需要在以后的学习中慢慢整理出来;

原文地址:https://www.cnblogs.com/coldforce/p/4976046.html