广播

来源:互联网 发布:小蚂蚁微信编辑器源码 编辑:程序博客网 时间:2024/04/29 11:58

广播

广播作为安卓四大组件之一,具有很大的作用,总结了一下广播的使用方法,希望能够帮助到一些人

1.广播概念
系统提供,应用程序之间信息传递的机制

2.原理
数据发送源发送广播(按照特定的频率(action)),广播接收方可以是多个,但是要保证接收方,接收的频率(action)和发送方一
intent-filter–设置频率(action)

3.用途
意图过滤器作用Intetnt-Filter–>
告诉系统我能够处理哪些事情
1>接收系统广播 安卓系统不停往外发送广播
比如电量.wifi状态…
2>接收应用程序组件之间广播
界面–服务
界面–界面
服务–服务

4.适用场景
广播获取消息后,应用场景
UI更新
handler–ui更新


5.学习广播基本步骤
广播对象的创建
1>创建广播类对象对象继承BroadcastReceiver
2>要求重写onReceive{
}

广播注册分为静态注册和动图注册两种方式

1静态注册
在主配置文件添加 <receiver> 节点
<intent-filter>–意图过滤器表明我能够处理的广播
特点:常驻型广播(活一次,永久活着,Activity销毁,还能接收广播)
测试–>系统广播的接收飞行模式测试

创建FirstBroadCast类继承BroadcastReceiver,代码如下

package com.tedu.broad;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.widget.Toast;public class FirstBroadCast extends BroadcastReceiver{    @Override  //接收广播数据,并对数据做出处理    public void onReceive(            Context context,//上下文对象            Intent intent//意图对象(数据,频率(action))            ) {        //注意:不能阻止该方法超过10s---ANR        //耗时操作不能做-网络访问,数据库获取数据        //测试wifi状态的改变        Toast.makeText(context, "飞行模式状态改变", Toast.LENGTH_SHORT).show();    }}

MainAcitivity代码如下

package com.tedu.broad;import android.os.Bundle;import android.app.Activity;import android.view.Menu;public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    }    @Override    public boolean onCreateOptionsMenu(Menu menu) {        // Inflate the menu; this adds items to the action bar if it is present.        getMenuInflater().inflate(R.menu.main, menu);        return true;    }}

AndroidManifest.xml文件中配置如下

<receiver android:name="com.tedu.broad.FirstBroadCast">            <intent-filter >                <action android:name="android.net.wifi.STATE_CHANGE"/>                <action android:name="android.net.wifi.WIFI_STATE_CHANGED"/>                <action                <!-- 飞行模式Action --> android:name="android.intent.action.AIRPLANE_MODE"/>                </intent-filter>        </receiver>

2> 动态注册广播
创建在activity目录下注册位置
activity生命周期的oncreat()
注册的方法
registerReceiver(
innerReceiver–>广播对象
, filter—>过滤器
);
注意动态注册广播要在activity生命周期结束之后解除注册
protected void onDestroy() {
//将广播解除注册
unregisterReceiver(解除注册的广播对象);
}
动态广播如果不解除注册在给报异常

MainActivity代码如下

package com.tedu.broad;import android.os.Bundle;import android.app.Activity;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.view.Menu;import android.view.View;import android.widget.Toast;public class MainActivity extends Activity {    //声明一个类内的广播    private InnerBroadCast innerReceiver;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //注册过程        //广播初始化        innerReceiver=new InnerBroadCast();        //调用注册方法注册        //intent-filter设置        IntentFilter filter=new IntentFilter();        filter.addAction("com.tedu.broad_INNER");//告诉系统我能处理声明广播        registerReceiver(innerReceiver, filter);    }    @Override    protected void onDestroy() {        //将广播解除注册        unregisterReceiver(innerReceiver);        super.onDestroy();    }    /**     * @author pjy     * 类内创建的一个广播     *     */    class InnerBroadCast extends BroadcastReceiver{        @Override        public void onReceive(Context context, Intent intent) {                Toast.makeText(context, "InnerReciver反馈", Toast.LENGTH_SHORT).show();        }    } /** * @param v * 用于处理单击按钮对广播进行发送 *  */public void doClick(View v){    switch (v.getId()) {    case R.id.main_send_btn:        Intent intent=new Intent("com.tedu.broad_INNER");        //发送广播方法        sendBroadcast(intent);        break;    } }}

通过广播传递数据


发送数据
借助intent putExtra(“key”,value);

获得数据
get…Extra(“key”);

广播的分类

无序广播
特点:只要注册相应频率(action)任何广播接收器都可以接收

有序的广播
特点:传递有顺序,先接收广播的可以将广播中断,通过abortBroadcast()方法来中断广播,后序接受者收不到消息
注意如果无序广播调用这个方法出现异常

接收的信息进行修改
setResult..();

获取接收到的信息
getResult..();

广播的优先级:
1> 如果没有设置任何优先条件的话.
在主配置文件里边谁先注册的谁先接收消息
2>人为干涉优先级
优先级所在位置 intent-filter标签里有属性

 <intent-filter    android:priority=""   > priority="整型变量" 优先数值大会优先接收

3>匹配action(频道)相同又没有优先级设置的话,动态广播先于静态广播接收

0 0
原创粉丝点击