Android广播的使用

来源:互联网 发布:java listview 编辑:程序博客网 时间:2024/05/21 22:42

广播的使用很简单,概括来讲只需要一个发广播和一个接收广播. 而广播接收者是Android四大组件之一,实际上这两种操作步骤最多的就是广播接收者

先说一下怎么发广播吧, 可以发有序广播和无序广播, 

无序广播我觉得应该是用的很多的,需要一个Intent  

Intent intent=new Intent("DFragment");
        这种写法和下面一种是一样的,都是有一个过滤的值

Intent intent=new Intent();intent.setAction("DFragment");
        也就是说在广播接收者中使用这个过滤值,那广播就可以被收到,当然如果要传值,那就把Intent像往常一样,带个值传过去就好

intent.putExtra("issign",true);
       这种广播是一旦发出所有页面都会收到,时间不固定,发广播只要一句话(这个用context的是在Fragment发广播)
context.sendBroadcast(intent);

有序广播发送方面与无序广播类似,一个带过滤值的Intent和希望携带的数据, 只有发送代码不同

context.sendOrderedBroadcast(intent,null);
第二个参数我们一般来讲填null就可以啦,那个是自定义权限,需要的自己查

单看发送广播,我们是看不出来两种广播的区别的,所以我们接下来说一下广播接收者来讲两种广播的区别

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

广播接收者是四大组件之一,所以它是需要注册的,注册方式有两种,两种注册方法都是创建一个类来继承广播接收者,并且在类中进行希望收到广播后做的事情,只不过注册方式,类的位置,作用有区别

第一种为静态注册. 静态注册是正常创建一个类(不是内部类)    注册方法就是在AndroidManifest文件中注册  这一种广播接收者一般是为了在应用关闭后来接收系统广播用的, 因为是静态注册,所以在应用安上后,并且应用启动过一次后, 他就可以一直接收广播 

public class MyBroadcastReceiver extends BroadcastReceiver{    @Override    public void onReceive(Context context, Intent intent) {        //在这里接收Intent 并且做希望做的事情(比如接到收到短信的广播后将程序启动)    }}

注册方式(与activity同级)

<receiver android:name=".tools.MyBroadcastReceiver">
<intent-filter android:priority="100">    <action android:name="android.intent.action.DREAMING_STOPPED"/></intent-filter>
</receiver>
   这里的intent-filter 是我们静态注册和动态注册都会用到的,这里的priority="100" 是用来接收有序广播的(无序广播不用这个属性),100这个数字代表优先级大小,从-1000~1000 数字越大,优先级越大,优先级大的先接到广播 ,当优先级相同时,接到广播的顺序不固定       先接到有序广播的可以截断广播(无序广播截断会崩溃),或者向下一个接到广播的接收者传值 (也是有序广播的特性)

name是我们想要接收的广播,这里我选的是系统广播, 这个name就是过滤值, 只有发送方和接收方的过滤值对上了才可以接到

静态广播这样就可以使用了


动态广播是我们经常使用的,它可以更新UI界面,界面间来回传值,非常方便  ,动态广播不需要在AndroidManifast中注册,而是选在了在代码中注册, 哪里需要注册在哪 

首先也要创建个类,不过这次是内部类(毕竟想要操作UI)

private class CReceiver extends BroadcastReceiver{    @Override    public void onReceive(Context context, Intent intent) {            imageView.setVisibility(View.VISIBLE);        }    }}
在这里我想要让ImageView显示   那么创建完类,我们来注册广播  

首先我们创建一个这个内部类的对象(这些都是在onCreate之类的生命周期里写的)

CReceiver actionReceiver = new CReceiver();

然后我们需要一个和静态广播类似的过滤器   那就是IntentFilter  这个是Intent过滤器对象,可以设置过滤的值(下面也是两种设置过滤值的方法)和优先级(第三个)

IntentFilter intentFilter=new IntentFilter("DFragment");

intentFilter.addAction("DFragment");
intentFilter.setPriority(100);
当我们做完这些就可以注册了

context.registerReceiver(actionReceiver,intentFilter);
记得当不使用了 一定要解除绑定(占用资源,而且动态注册的广播在关闭当前Activity之后就不会再监听了)

context.unregisterReceiver(actionReceiver);

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1.广播发送的过滤器是Intent     广播接收的过滤器是IntentFilter    当两者过滤值相同时 才能接到

2.静态广播是外部类 ,动态广播是内部类 ; 静态广播在AndroidManifest中注册, 动态广播在代码中注册 ;  

静态广播可以在应用关闭的情况下监听系统广播,动态广播在所注册页面销毁后就不在监听 ; 

静态广播不需要取消注册, 动态广播在页面销毁前一定要取消注册(不取消不会崩溃,但是会很占资源,属于不好的习惯) ;

静态广播一般都是用来接收系统广播,动态广播一般用来操作页面

动态广播的优先级高于静态广播(这一点有时候在设置了优先级时会使有序广播的顺序不对)

3. 有序广播的发送代码中有 order ;

有序广播的接收者需要比无序广播多加一个Priotity属性,用来确定广播接收的顺序

无序广播比有序广播快,但是有许多事情是只有在有序广播做得到的 (比如截断广播,向下一个接收广播的接收者传值)

(PS 有时候自己测试收不到手机的系统广播,很可能是手机里有软件优先级比你高,并且它缺德的把广播给截断了)

0 0
原创粉丝点击