Android_5_Broadcast

作者: icechao | 来源:发表于2017-02-24 23:14 被阅读0次

    Broadcast(广播)

    在Android中,Broadcast是一种广泛运用的在应用程序之间以及进程间传输信息的机制。而BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件。

    首先在需要发送信息的地方,把要发送的信息和用于过滤的信息(如Action、Category)装入一个Intent对象,然后通过发送无序广播 Context.sendBroadcast()、有序广播sendOrderBroadcast()或粘性广播sendStickyBroadcast()方法,把 Intent对象以广播方式发送出去。

    当Intent发送以后,对应已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,若匹配则就会调用BroadcastReceiver的onReceive()方法。所以当我们定义一个BroadcastReceiver的时候,都需要实现onReceive()方法。

    广播是Android组件间的通信方式的一种,一般系统会发送很多广播,当有需要时可以接收系统的广播,同时当我们需要让其他组件做事时,也可以给对应的组件发送广播.

    Android广播分为两个方面:发送者和接收者,通常情况下,BroadcastReceiver指的就是广播接收者.

    可以使用的场景如下:

    1.同一app内部的同一组件内的消息通信(单个或多个线程之间);
    
    2.同一app内部的不同组件之间的消息通信(单个进程);
    
    3.同一app具有多个进程的不同组件之间的消息通信;
    
    4.不同app之间的组件之间消息通信;
    
    5.Android系统在特定情况下与App之间的消息通信。
    

    定义广播接收者:

    一.静态广播接收者(在清单文件中声名广播,应用生效广播生效不能被反注册)

    1.自定义类继承自BroadCastReciver
    
     public class Revicer extends BroadcastReceiver { 
     }
     
    2.复写 onReceive(Context context, Intent intent) 方法在定义自己要的操作
    
     @Override
     public void onReceive(Context context, Intent intent) {
            Log.e("icechao","手机已开机,接收到开机广播");
     }
     
    3.注册广播接收者,(有两种方式,要看具体使用场景来使用)
    
        (1).由系统到调用起的广播接收者,当有对应的广播发生时就会调用onReceive方法 
        
            <receiver android:name=".Revicer">
                <intent-filter >
                    <action android:name="android.intent.action.BOOT_COMPLETED"/>
                </intent-filter>
            </receiver>
            
        (2).代码中注册广播接收者,当我们不需要时可以手动把这个接收者结束
    
            IntentFilter intentFilter = newIntentFilter(Intent.ACTION_BOOT_COMPLETED);
            Revicer revicer = new Revicer();
            registerReceiver(revicer,intentFilter);
    
    静态注册的广播不能反注册,只是通过条件判断终止广播执行

    二. 动态注册广播(广播在代码中进行注册和取消)

    context.registerReceiver
    

    这个方法是定义在Context中的也就是说,当要启动服务时必须要先有一个Context对象,同时当在代码中手动注册广播时,在不使用时可以使用unRegistReceiver把广播接收者取消

    unregisterReceiver(revicer);
    
    当在代码中动态注册广播时需要保留这个广播的对象,当需要反注册这个广播时需要使用这个对象

    要注意的是在接收的系统的广播时,要在menifet中声名对应的权限否则不能接收到广播

    广播几种类型
    一. 无序广播
        广播接收者,接收到这个广播没有固定的先后顺序
        通过Context.sendBroadcast()方法来发送,它是完全异步的。所有的receivers
        (接收器)的执行顺序不确定,因此所有的receivers(接收器)接收broadcast的顺序不确定。
    二. 有序广播
        广播接收者,在注册时指定优先级,优先级高的接收者先接收到广播
        Context.sendOrderedBroadcast来发送
        BroadcastReceiver可以使用setResult系列函数来结果传给下一个BroadcastReceiver,
        通过getResult系列函数来取得上个BroadcastReceiver返回的结果,
        并可以abort系列函数来让系统丢弃该广播,使用该广播不再传送到别的BroadcastReceiver。
        例:
        <receiver android:name=".SmsReceiver">
            <intent-filter android:priority="100">
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>                    
            </intent-filter>
        </receiver>
        
    三. 粘性广播
        广播不会在被接收后停止,会持续
        Context.sendStickyBroadcast()发送粘性的广播
        使用这个api需要权限android.Manifest.permission.BROADCAST_STICKY,
        粘性广播的特点是Intent会一直保留到广播事件结束,而这种广播也没有所谓的10秒限制,
        10秒限制是指广播如果onReceive方法执行时间超过10秒,系统会将这个广
        播置为可以干掉的candidate,一旦系统资源不够的时候,就会干掉这个广播而让它不执行。
    
    注意:当广播接收者执行超过10s程序就会出现ANR,所以最好不要在广播接收者中进行过于耗时的操作,当onRecieve()方法结束,广播接收者的执行就可以说结束了

    相关文章

      网友评论

        本文标题:Android_5_Broadcast

        本文链接:https://www.haomeiwen.com/subject/tlkgwttx.html