前情提要(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

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

Android Studio 单刷《第一行代码》系列 07 —— Broadcast 广播的更多相关文章

  1. Android Studio 单刷《第一行代码》系列目录

    前言(Prologue) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Android ...

  2. Android Studio 单刷《第一行代码》系列 02 —— 日志工具 LogCat

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

  3. Android Studio 单刷《第一行代码》系列 01 —— 第一战 HelloWorld

    前言(Prologue) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Android ...

  4. Android Studio 单刷《第一行代码》系列 06 —— Fragment 生命周期

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

  5. Android Studio 单刷《第一行代码》系列 05 —— Fragment 基础

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

  6. Android Studio 单刷《第一行代码》系列 04 —— Activity 相关

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

  7. Android Studio 单刷《第一行代码》系列 03 —— Activity 基础

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

  8. 【java学习系列】 Android第一本书《第一行代码》

    开始Java的学习,从Android,开始吧.<第一代码>开始阅读和调试demo例子. 下面是 <第一行代码>的思维导图:

  9. Android Studio:Unable to add window android.view.ViewRootImpl$W@5e2d85a -- permission denied for this window 第一行代码

    学习<第一行代码>的时候,出现的错误. java.lang.RuntimeException: Unable to start receiver com.example.sevenun.l ...

随机推荐

  1. 关于windows中的快捷键

    Windows快捷键大全编辑 目录1快捷方式 2IE浏览器 3小键盘 4WIN键 5资源管理器 6对话框7我的电脑 8放大程序 9辅助选项 10XP键盘 11对话框 12自然键盘13辅助键盘 14键盘 ...

  2. 【策略】UVa 1344 - Tian Ji -- The Horse Racing(田忌赛马)

    Here is a famous story in Chinese history. That was about 2300 years ago. General Tian Ji was a high ...

  3. 关于Merge的整理--Merge的使用方法和注意事项的Demo

    上一篇文章中讲到了Merge的用法和注意事项,所以本人就想,做了一个Demo进行验证下. 一.Merge的使用 (1)activity中的onCreate方法中的setContentView(R.la ...

  4. Map集合的四种遍历方式

    很久以前写的代码,和上一个做比较吧!便于以后查看 import java.util.HashMap; import java.util.Iterator; import java.util.Map; ...

  5. C# 为网络程序添加用户代理

    如何为网络程序添加用户代理,本人推荐使用UrlMkSetSessionOption函数, 不过该函数有一个弱点不可以X64编译,X86编译软件才可以调用该函数 否则会一直返回!S_OK意义错误.第二呢 ...

  6. Asp.Net运行原理(=)

    浏览器与服务器之间的通信. 一般浏览器与服务器之间的底层是通过socket建立连接的. 当浏览器与服务器之间建立了socket连接之后,服务器就开始监听. 当浏览器与服务器之间建立了相互兼容的协议之后 ...

  7. 第五十三篇、OC利用AFN上传视频到服务器

    整体思路已经清楚,拿到视频资源,先转为mp4,写进沙盒,然后上传,上传成功后删除沙盒中的文件. 本地拍摄的视频,上传到服务器: //视频转换为MP4 //转码操作... _hud.mode = MBP ...

  8. iOS的沙箱目录和文件操作

    一.沙箱 iOS的每一个应用程序都有自己的目录来存放数据,这个目录称为沙箱目录.沙箱目录是一种数据安全策略,它设计的原理是只能允许自己的应用访问目录,而不允许其他的应用访问,这样可以保证数据的安全,应 ...

  9. windows 7 64 bit 使用 virtual box 的经验

    本人电脑是联想thinkpad E535的机子,安装的是64bitwindows7 旗舰版 为了更好的工作,我安装了虚拟机virtualbox最新版 很不幸,我出现了多次蓝屏的情况,我换到32位系统下 ...

  10. Android内存机制分析1——了解Android堆和栈

    //----------------------------------------------------------------------------------- Android内存机制分析1 ...