android 大喇叭,广播实战

在学校里,通常每个教室都会有一个大喇叭,只要广播室有什么通知,全校师生都能听到,类似的工作原理在计算机领域也有很广泛的应用。

比如一个IP地址中最大的地址是被保留作为广播地址使用的。 一如:IP地址范围是192.1680.0.x,子网掩码为255.255.255.0的网络,广播地址地址就是192.168.0.255.同样android 中也提供了类似机制。

广播的分类:
1)标准广播,是一种异步执行的广播,一个广播发出后,所有的接受者几乎都会在同一时刻接受到广播消息。
2)有序广播,则是一种同步执行的广播,在广播发出后,同一时刻只会有一个接受者会收到消息,当其执行完
后,广播才能继续被传播,当然前面的接受者也可以截断广播,

例子:
1)动态注册监听网络变化

public class MainActivity extends Activity {
    ////////////////////////////////////////////////////////////////////////////////////////////////
    private IntentFilter            m_intentFilter;
    private NetWorkChangeReceiver   m_receiver;
    ////////////////////////////////////////////////////////////////////////////////////////////////

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        init();
    }

    private void init(){

        //新建一个广播的过滤器
        m_intentFilter = new IntentFilter();
        //当网络状态发生变化时 系统便会发送这个广播 因此这个过滤器就能捕捉到这个广播
        m_intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");

        //新建一个广播接受者
        m_receiver = new NetWorkChangeReceiver();

        //注册广播
        registerReceiver(m_receiver, m_intentFilter);
    }

    //当活动摧毁的时候 记得把广播取消注册
    @Override
    public void onDestroy(){

        super.onDestroy();
        unregisterReceiver(m_receiver);
    }

    //重写广播接受者的方法
    class NetWorkChangeReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {

            Toast.makeText(context,"网络状态发生变化",Toast.LENGTH_SHORT).show();
        }
    }
}

不过这里因为访问了网络状态,所以要在AndroidManifest.xml中加这样一行

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

2)静态注册实现开机自启动

新建一个Java类 继承自BroadcastReceiver

/**
 * Created by 李嘉诚 on 2015/5/25.
 * 最后修改时间: 2015/5/25
 */
public class BootCompleteReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        Toast.makeText(context,"开机成功",Toast.LENGTH_LONG).show();
    }
}

由于接受系统广播,因此还需在AndroidManifest.xml中注册权限,除此之外还有广播接受者
AndroidManifest.xml文件如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.broadcast" >

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name=".BootCompleteReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>

    </application>

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>


</manifest>

查看一下应用权限 就会发现有了开启自启动 同样你也可以重启一下机器 看有没有使用成功
这里写图片描述
3)自定义广播

新建一个广播接受者

package com.broadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

/**
 * Created by 李嘉诚 on 2015/5/25.
 * 最后修改时间: 2015/5/25
 */
public class ChanBroadcastReceiver extends BroadcastReceiver {

    //当广播接受者收到广播时 便会调用这个方法
    @Override
    public void onReceive(Context context, Intent intent) {

        Toast.makeText(context, "这是我自定义的广播", Toast.LENGTH_SHORT).show();
    }
}

在AndroidManifest.xml中注册一下广播

  <receiver android:name=".ChanBroadcastReceiver">
            <intent-filter>
                <action android:name="com.theOldMen.CHAN_BROADCAST"></action>
            </intent-filter>
        </receiver>

使用的时候 直接发送广播就行了,action要和注册的时候一样

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        init();
    }

    private void init(){

        findViewById(R.id.m_sendButton).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent x = new Intent("com.theOldMen.CHAN_BROADCAST");
                sendBroadcast(x);
            }
        });
    }
}

运行效果
这里写图片描述
4)发送有序广播
广播是一种跨进程的通信方式,读者可以自己写另外一个程序,接受同样的广播消息,你会发现当前应用发送的广播,其他注册过的程序都能接受到,这个问题我们会在下面进行讲解

我们现在需要准备的是:两个应用,这两个应用都接受同一个广播,到现在为止,我已经假设你已经完成了那必要的准备,我们开始讲解有序广播

发送有序广播非常简单,只需修改一行代码就行

       findViewById(R.id.m_sendButton).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent x = new Intent("com.theOldMen.CHAN_BROADCAST");
                sendOrderedBroadcast(x,null);
            }
        });

第二个参数可以不予理会,它是跟权限有关的

好像并没有什么特别,别急,有序广播是有优先级的,因而还需指定优先级

  <receiver android:name=".ChanBroadcastReceiver">
            <intent-filter android:priority="100">
                <action android:name="com.theOldMen.CHAN_BROADCAST"></action>
            </intent-filter>
        </receiver>

这里设置了优先级 为100

刚刚说到,其实当前的广播接受者是可以丢弃广播的
如下:

/**
 * Created by 李嘉诚 on 2015/5/25.
 * 最后修改时间: 2015/5/25
 */
public class ChanBroadcastReceiver extends BroadcastReceiver {

    //当广播接受者收到广播时 便会调用这个方法
    @Override
    public void onReceive(Context context, Intent intent) {

        Toast.makeText(context, "这是我自定义的广播", Toast.LENGTH_SHORT).show();

        //丢弃广播 后面的人无法收到消息
        abortBroadcast();
    }
}

5)使用本地广播

会看第四部分的内容,我们了解到,其实普通广播发送的时候,任何注册了接受者的应用都能够收到广播消息,那么这就必然带来安全问题,那么当我们要发送的数据带有一些敏感信息的时候呢,我们是不是应该换种方式。幸运的是android提供了一种机制,他也是一种广播,但只能让本应用的接受者能够收到消息。这就是本地广播。

本地广播的使用并不复杂,主要使用一个LocalBroadcastManager来对广播进行管理,并提供了发送广播和注册广播的方法,实例如下

public class MainActivity extends Activity {
    ////////////////////////////////////////////////////////////////////////////////////////////////
    private static final String     s_action = "com.chan.LOCAL_BROADCAST";
    ////////////////////////////////////////////////////////////////////////////////////////////////
    private LocalBroadcastManager   m_manager;
    private LocalReceiver           m_receiver;
    private IntentFilter            m_filter;
    ////////////////////////////////////////////////////////////////////////////////////////////////

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        init();
    }

    private void init(){

        //获得本地广播管理器
        m_manager = LocalBroadcastManager.getInstance(this);

        //设置接受者
        m_receiver = new LocalReceiver();

        //获得过滤器
        m_filter = new IntentFilter();
        m_filter.addAction(s_action);

        //注册广播
        m_manager.registerReceiver(m_receiver,m_filter);

        findViewById(R.id.m_sendButton).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent x = new Intent(s_action);

                //发送广播
                m_manager.sendBroadcast(x);
            }
        });
    }

    @Override
    public void onDestroy(){

        super.onDestroy();

        //取消注册
        m_manager.unregisterReceiver(m_receiver);
    }

    class LocalReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {

            Toast.makeText(context,"本地广播",Toast.LENGTH_SHORT).show();
        }
    }
}

运行结果
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值