• Android Studio 单刷《第一行代码》系列 07 —— Broadcast 广播


    前情提要(Previously)

    本系列将使用 Android Studio 将《第一行代码》(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Android Studio 作为开发 IDE 的同学开路。
    PS:其实我就是现学现卖,希望我能坚持刷完。

    系列目录在此:

    系统广播

    Android 内置了很多系统级别的广播,通过监听这些广播可以得到相关的系统状态信息。例如:

    • 系统启动完成
    • 打开、关闭飞行模式
    • 电量低
    • 内存不足
    • 网络变化

    动态注册

    下面是监听网络变化的例子,新建一个 BroadcastTest 项目。

    • 在 MainActivity 中定义一个内部类继承自 BroadcastingReceiver,代码如下:
    class NetworkChangeReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent){
            Toast.makeText(context, "network changes", Toast.LENGTH_SHORT).show();
        }
    }
    
    • 在 onCreate() 方法中注册,代码如下:
    private IntentFilter intentFilter;
    private NetworkChangeReceiver networkChangeReceiver;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        intentFilter = new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        networkChangeReceiver = new NetworkChangeReceiver();
        registerReceiver(networkChangeReceiver, intentFilter);
    }
    
    • 在 onDestroy() 方法中取消注册,代码如下:
    @Override
    protected void onDestroy(){
        super.onDestroy();
        unregisterReceiver(networkChangeReceiver);
    }
    
    • OK,运行一下,会发现程序启动时会弹出一个提示;按 Home 回到主界面,并尝试开关网络,会发现有提示弹出。

    静态注册

    下面是监听系统启动的例子。

    • 在 MainActivity 中新建一个 public 类继承自 BroadcastingReceiver,代码如下:
    public class BootCompleteReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent){
            Toast.makeText(context, "Boot complete", Toast.LENGTH_SHORT).show();
        }
    }
    
    • 在 AndroidManifest.xml 中静态注册,增加 receiver 代码如下:
    <receiver android:name=".MainActivity$BootCompleteReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
        </intent-filter>
    </receiver>
    
    • 监听系统开机广播需要权限,在 AndroidManifest.xml 中添加权限声明,代码如下:
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>
    
    • OK,运行程序,到设置 → 应用程序里找到我们的 Broadcast,点击打开会看到程序拥有了开机启动的权限。重启机器或模拟器就可以收到开机广播啦。

    自定义广播

    下面是在程序中发送自定义广播并接收的例子。

    • 在 MainActivity 中新建一个 MyBroadcastReceiver,代码如下:
    public static class MyBroadcastReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent){
            Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
        }
    }
    
    • 在 AndroidManifest.xml 中注册,代码如下:
    <receiver android:name=".MainActivity$MyBroadcastReceiver">
        <intent-filter>
            <action android:name="com.example.broadcasttest.MY_BROADCAST"/>
        </intent-filter>
    </receiver>
    

    让 MyBroadcastReceiver 接收一条 com.example.broadcasttest.MY_BROADCAST 的广播。

    • 给 MainActivity 增加一个按钮,并在 onCreate() 方法中添加点击事件,代码如下:
    Button button = (Button)findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
            sendBroadcast(intent);
        }
    });
    
    • OK,运行一下,点击按钮,就会收到我们发出的广播。

    本地广播 LocalBroadcast

    前面用到的都是全局广播,可以被其他任何程序接收到,会引起一些安全性问题。下面是一个发送接收本地广播的例子。

    • 定义一个 LocalReceiver ,代码如下:
    public static class LocalReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent){
            Toast.makeText(context, "received local broadcast", Toast.LENGTH_SHORT).show();
        }
    }
    
    • 使用 LocalBroadcastManager 来注册接收器、发送广播,代码如下:
    private IntentFilter intentFilter;
    private LocalReceiver localReceiver;
    private LocalBroadcastManager localBroadcastManager;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        localBroadcastManager = localBroadcastManager.getInstance(this);
        Button button = (Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
                localBroadcastManager.sendBroadcast(intent);
            }
        });
    
        intentFilter = new IntentFilter();
        intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
        localReceiver = new LocalReceiver();
        localBroadcastManager.registerReceiver(localReceiver, intentFilter);
    }
    
    • 别忘了取消注册,代码如下:
    @Override
    protected void onDestroy(){
        super.onDestroy();
        localBroadcastManager.unregisterReceiver(localReceiver);
    }
    
    • OK,运行一下,点击按钮,就会接收到我们发出的本地广播啦。

    PS:本地广播无法通过静态注册的方式接收。

    其它(Miscellaneous)

    最近家里事情太多,除我之外的大人小孩都生病了。有大病也有小病,反正就是各种跑医院,深深的感觉到健康的重要。

    附送段子一个:
    今天有人问我去过高消费场所么?
    我想了想问他:“医院算么?”

    尽管我试图在本文中尽量完整的进行描述,但受限于篇幅和我的个人水平,本文难免有所遗漏,欢迎在评论中指出。
    如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!

    关于作者(About Me)

    addict

    本文谢绝转载,如需转载需征得作者本人同意,谢谢。

  • 相关阅读:
    OVS local network 连通性分析
    再部署一个 instance 和 Local Network
    ARM Linux系统调用的原理
    Linux内存管理中的slab分配器
    浅析基于ARM的Linux下的系统调用的实现
    分享一个查看十六进制的位的小程序
    mokoid 源代码下载
    shell中eval的使用问题
    批量去掉文件中的^M
    基于TINY4412的Andorid开发-------简单的LED灯控制
  • 原文地址:https://www.cnblogs.com/DebugLife/p/4391160.html
Copyright © 2020-2023  润新知