发表于: 2018-12-19 21:24:46

0 649


今天完成的事情

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

发送Broadcast和使用BroadcastReceiver过滤接收的过程:

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

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

注册BroadcastReceiver有两种方式:

      静态注册:在AndroidManifest.xml中用标签生命注册,并在标签内用标签设置过滤器。

  <receiver android:name="myRecevice">    //继承BroadcastReceiver,重写onReceiver方法

    <intent-filter>    

      <action android:name="com.dragon.net"></action> //使用过滤器,接收指定action广播

      </intent-filter>

  </receiver> 

      动态注册:

  IntentFilter intentFilter = new IntentFilter();

  intentFilter.addAction(String);   //为BroadcastReceiver指定action,使之用于接收同action的广播

      registerReceiver(BroadcastReceiver,intentFilter);

一般:在onResume中注册,onPause中注销unregisterReceiver

指定广播目标Action:Intent intent = new Intent(actionString);

并且可通过Intent携带消息 :intent.putExtra("msg", "hi,我通过广播发送消息了");

发送广播消息:Context.sendBroadcast(intent ) 

其中在动态注册中可将BroadcastReceiver的继承类进行封装,添加构造函数和BroadcastReceiver注册。


Activity中声明BroadcastReceiver的扩展对象,在onResume中注册,onPause中注销,在onResume()注册、onPause()注销是因为onPause()在App死亡前一定会被执行,从而保证广播在App死亡前一定会被注销,从而防止内存泄露。

BroadcastReceiverHelper  rhelper;

@Override
    public void onResume(){
        //注册广播接收器
        rhelper=new BroadcastReceiverHelper(this);
        rhelper.registerAction("com.cbin.sendMsg");
        super.onStart();
    }
    
    @Override
    public void onPause(){
        //取消广播接收器
        unregisterReceiver(rhelper);
        super.onStop();
    }


广播的分类

普通广播、系统广播、有序广播、粘性广播、APP应用内广播

(1)普通广播

(2)系统广播

Android中内置了多个系统广播:只要涉及到手机的基本操作(如开机、网络状态变化、拍照等等),都会发出相应的广播

每个广播都有特定的Intent - Filter(包括具体的action),Android系统广播action如下:

当使用系统广播时,只需要在注册广播接收者时定义相关的action即可,并不需要手动发送广播,当系统有相关操作时会自动进行系统广播


(3)有序广播

发送出去的广播被广播接收者按照先后顺序接收,有序是针对BroadastReceiver而言的

广播接受者接收广播的顺序规则(同时面向静态和动态注册的广播接受者)

按照Priority属性值从大-小排序;

Priority属性相同者,动态注册的广播优先;

特点

接收广播按顺序接收

先接收的广播接收者可以对广播进行截断,即后接收的广播接收者不再接收到此广播;

先接收的广播接收者可以对广播进行修改,那么后接收的广播接收者将接收到被修改后的广播


(4)粘性广播

在Android5.0 & API 21中已经失效


(5)APP应用内广播

App应用内广播可理解为一种局部广播,广播的发送者和接收者都同属于一个App。相比于全局广播(普通广播),App应用内广播优势体现在:安全性高 & 效率高。

使用

(1)将全局广播设为局部广播

注册广播时将exported属性设置为false,使得非本App内部发出的此广播不被接收;

在广播发送和接收时,增设相应权限permission,用于权限验证;

发送广播时指定该广播接收器所在的包名,此广播将只会发送到此包中的App内与之相匹配的有效广播接收器中。

(2)使用LocalBroadcastManager类,本地广播


注意

对于不同注册方式的广播接收器回调OnReceive(Context context,Intent intent)中的context返回值是不一样的:

对于静态注册(全局+应用内广播),回调onReceive(context, intent)中的context返回值是:ReceiverRestrictedContext;

对于全局广播的动态注册,回调onReceive(context, intent)中的context返回值是:Activity Context;

对于应用内广播的动态注册(LocalBroadcastManager方式),回调onReceive(context, intent)中的context返回值是:Application Context。

对于应用内广播的动态注册(非LocalBroadcastManager方式),回调onReceive(context, intent)中的context返回值是:Activity Context;


二、明天的计划

学习ContentProvider,之前很少用,了解不多


三、遇到的问题    

导入别人的项目时,因Android Studio以及gradle版本不同导致的各种冲突


四、收获

重新学习了BroadCast




返回列表 返回列表
评论

    分享到