第二行代码第五章笔记

来源:互联网 发布:中电四公司怎么样 知乎 编辑:程序博客网 时间:2024/06/05 02:18

第五章详解广播机制

广播机制简介

广播的类型主要分标准广播、有序广播。

接收系统广播(注册广播的两种方式)

  1. 创建一个广播接收器–>新建一个类并继承BroadcastReceiver–>重写父类的onReceive()方法。

  2. 动态注册(代码中注册)

    1. 注册用registerReceiver(BroadcastReceiver receiver, IntentFilter filter)方法。此方法需要两个参数,需要提前声明。

    2. 声明private :IntentFilter intentFilter = new IntentFilter(),然后intentFilter.addAction(String action);

    3. BroadcastReceiver receiver = new BroadcastReceiver();书中例子为private NetworkChangeReceiver networkChangeReceiver = new NetworkChangeReceiver();

    4. registerReceiver(receiver, filter)

    5. 动态注册的广播接收器一定都要取消注册:unregisterReceiver(receiver);书中例子为:unregisterReceiver(networkChangeReceiver);

    6. 书中例子进一步优化,准确地告诉用户是否有网络:在onReceive()方法中,首先通过getSystemService()方法得到了ConnectivityManager的实例,这是一个系统服务类,专门用于管理网络连接的。然后调用它的getActiveNetworkInfo()方法可以得到NetworkInfo的实例,接着调用NetworkInfo的isAvailable()方法,就可以判断出当前是否有网络。

    7. 程序访问系统关键性信息,书中例子查询网络状态需在配置文件中声明权限:

  3. 静态注册(Androidmanifest.xml中注册)

    1. 优点是程序未启动的情况下就能接收广播

    2. 通过AS提供的快捷方式创建一个veBroadcastReceiver,Exported属性表示是否允许这个广播接收器接收本程序之外的广播,Enabled属性表示是否启用这个广播接收器,代码中复写onReceive()方法,在里面编写自己的逻辑。

    3. 监听系统开机广播声明权限

    4. 在标签内添加,静态注册的广播接收器就在里面注册:通过android:name指定哪一个广播接收器,然后在标签中加入想要接收的广播。

    5. 不要再onReceive()方法中添加过多的逻辑或者耗时操作,因为广播接收器中是不允许开启线程,方法运行过久而没有结束,系统会报错。

发送自定义广播

  1. 发送标准广播

    <1>以书中用例子来讲解:先定义一个静态的广播接收器。

    <2>定义一个按钮,并设置它的点击事件,并构建一个intent对象且同时传入值(action)入内:Intent intent = new Intent(String action);

    <2>调用Context的sendBroadcast()方法将广播发送出去:sendBroadcast(intent);

  2. 发送有序广播

    1. 以书中用例子来讲解:新建一个项目,定义一个静态的广播接收器且接收值和标准广播接收器的值一样,然后在上面例子的程序中发送标准广播,且同时能被两个接收器接收,从而证明发送的广播能被其他程序接收到。

    2. 定义一个按钮,并设置它的点击事件,并构建一个intent对象且同时传入值(action)入内:Intent intent = new Intent(String action);

    3. 调用Context的sendOrderedBroadcast()方法将广播发送出去(第二个参数是与权限相关的参数): sendBroadcast(intent,null);

    4. 在广播接收器中可以截断广播,阻止其继续传播:abortBroadcast();

    5. 在AdroidManifest中广播接收器设置优先级:Android:priority=

使用本地广播

  1. 发出的广播只能在程序内部进行传递,接收器也只能接收本程序发出的广播,解决了安全性问题。

  2. 以书中例子来讲解

    <1>先声明两个变量:

    private LocalReceiver localReceiver; private LocalBroadcastManager localBroadcastManger; 

    <2>创建一个广播接收器

    class LocalReceiver extends BroadcastReceiver{}

    <3>通过LocalBroadcastManager的静态方法getInstance()方法得到它的一个实例:

    localBroadcastManger = LocalBroadcastManager.getInstance(this)

    <4>发送本地广播

    Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST")localBroadcastManager.sendBroadcast(intent)

    <5>通过LocalBroadcastManager的静态方法registerReceiver()注册广播并接收本地广播:

    intentFilter = new IntentFilter(); intentFilter.addAction(("com.example.broadcasttest.LOCAL_BROADCAST"); localReceiver = new LocalReceiver();localBroadcastManager.registerReceiver(localReceiver, intentFilter);
  3. 本地广播无法通过静态注册的方式来接受,因为也不需要,本地广播币全局广播更高效。

广播的实践–实现强制下线功能(暂略)

原创粉丝点击