zoukankan      html  css  js  c++  java
  • 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" />
     

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

  • 相关阅读:
    Linux下启用异步IO
    ORA-20011 ORA-29913 KUP-11024
    OCP 11G 053题库解析汇总链接(601-712)
    OCP 11G 053题库解析汇总链接(201-400)
    OCP 11G 053题库解析汇总链接(401-600)
    OCP 11G 053题库解析汇总链接(1-200)
    OCP 11G 052题库解析汇总链接
    OCP 11G 051题库解析汇总链接
    Vue外部js引入做为全局变量
    Java实现atoi函数
  • 原文地址:https://www.cnblogs.com/coldforce/p/4976046.html
Copyright © 2011-2022 走看看