关闭

Broadcast简介

标签: Androidbroadcast通信
96人阅读 评论(0) 收藏 举报
分类:

简介:

 Broadcast是用于接收广播的组件,用于组件和组件之间的通信,可以跨应用程序传递。如操作系统电池电量低会发送一个广播,这样我们的程序就可以去监听这个广播,然后程序可以做相应的事儿。

需要掌握的类:BroadcastRecevier,开发利器。

BroadcastRecevier创建

  • 系统提供的Broadcast是抽象类,需要重写 onReceive(Context context, Intent intent)方法,这个方法可以得到随广播而来的数据

Broadcast注册

  • 静态注册
    • 特点:是当程序退出后,广播依然存在,直至用户卸载
    • 注册方式:在AndriodManifest文件中
<receiver
    android:name="com.mixm.activity.BroadCastT3"
    android:exported="true" >
    <intent-filter android:priority="4" >
        <action android:name="all" >
        </action>
    </intent-filter>
</receiver>  

说明:android:exported=”true” 是否只接收本应用的广播 android:priority=”4”:优先级

  • 动态注册
    • 特点:该广播只在应用中有效,退出广播后不再接收广播
    • 注册方式:动态注册需要在代码中动态的指定广播地址并注册
      注册
Recevier r = new Recevier();
IntentFilter filter = new IntentFilter();
filter.addAction("all");
registerReceiver(r, filter);

解除注册

@Override
protected void onDestroy() {
        super.onDestroy();

        try {
            this.unregisterReceiver(r);
        } catch (Exception e) {
            //不做任何处理
        }
}
  • 注意:registerReceiver 是 android.content.ContextWrapper 类中的方法, Activity 和 Service都继承了 ContextWrapper,所以可以直接调用。在实际应用中,我们在 Activity 或 Service 中注册了一个 BroadcastReceiver,当这个 Activity 或 Service 被销毁时如果没有解除注册,系统会报一个异常,提示我们是否忘记解除注册了。所以,记得在特定的地方执行解除注册操作

广播的发送

 广播的发送和接收都是跨进程的,一个app发送的广播,其他的app只要有权限和action匹配都可以接收到该广播。

  • 发送标准广播
Intent intent = new Intent(this, BroadCastT1.class);
sendBroadcast(intent);    //这个方法是上下文中的
  • 发送有序广播
    第一种方式

    Intent intent = new Intent();
    intent.setAction("all");
    intent.putExtra("data", "heiheiheiheida");
    sendBroadcast(intent, receiverPermission);

    说明:receiverPerssion:是否需要接受者需要选取相应的权限才可以收到广播
    第二种方式

    sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler, initialCode, initialData, initialExtras);

    说明:由于发送广播的时候,中间可能会被接受者拦截,resultReceiver指定一个这个广播的最终接受者,最终接收者肯定会接收到。其余的参数暂且给0或者null。
  • 注意:
    • 发送有序广播时,先接到广播的可以取消广播,导致后面的优先级低的广播接收者不会接到广播。
abortBroadcast(); //放弃当前的广播,则优先级低的无法收到当前广播
  • 如果优先级高的广播想给优先级低的广播接收者传递数据,可以通过以下方法:
setResult();
setResultData()
setResultCode()
setResultExtras();

广播的分类

  • 普通广播

说明:普通广播对于多个接收者来说是完全异步的,通常每个接收者都无需等待即可以接收到广播,接收者相互之间不会有影响。对于这种广播,接收者无法终止广播,即无法阻止其他接收者的接收动作。

  • 有序广播

说明:有序广播比较特殊,它每次只发送到优先级较高的接收者那里,然后由优先级高的接收者再传播到优先级低的接收者那里,优先级高的接收者有能力终止这个广播可以使用 intent-filter 里面的 android:priority=”1000”去解决
使用方式:

  • 可以通过android:priority属性指定广播接收者的接收顺序,值较大的广播接收者会优先接收
  • 每个广播接受者是有序接收广播,如果中间使用abortBraodcast()方法会终止广播,即后面的接收者不会再收到广播。
  • 每个接收者接收的intent都是从发送方发送的同一个intent对象,每个接收者都是孤立的,它们之间不可以互相接收intent。

注意:

  1. 静态注册的广播接收者 app 一旦安装在系统,则可以接收到指定的广播。不管这个 app 有没有启动。 2、动态注册的广播接收者只有在注册完成后才能接收到广播,当注册他的组件销毁的时候,广播接收者也应该解除注册。
  2. 如果接收者处于一个非前台的状态下,就不能随便创建实例化可视化的view,包括alertDialog,可以创建notification对象。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:6315次
    • 积分:444
    • 等级:
    • 排名:千里之外
    • 原创:39篇
    • 转载:0篇
    • 译文:1篇
    • 评论:1条
    文章分类
    最新评论