前情提要(Previously)

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

系列目录在此:

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

系统广播

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;@Overrideprotected 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() 方法中取消注册,代码如下:
@Overrideprotected 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;@Overrideprotected 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);}
  • 别忘了取消注册,代码如下:
@Overrideprotected void onDestroy(){    super.onDestroy();    localBroadcastManager.unregisterReceiver(localReceiver);}
  • OK,运行一下,点击按钮,就会接收到我们发出的本地广播啦。

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

其它(Miscellaneous)

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

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

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

关于作者(About Me)

addict

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

更多相关文章

  1. Android应用程序怎么刷到手机上
  2. Android Studio 单刷《第一行代码》系列 06 —— Fragment 生命
  3. 用PHP编写Android应用程序
  4. Android Studio 单刷《第一行代码》系列 01 —— 第一战 HelloWo
  5. Android Studio 单刷《第一行代码》系列 05 —— Fragment 基础
  6. Android 系统概要 ——《第一行代码 Android》
  7. Android Studio 单刷《第一行代码》系列 04 —— Activity 相关
  8. 第二讲:Android系统构架分析和应用程序目录结构分析
  9. Android 核心已经从 Linux kernel 代码库中删除

随机推荐

  1. ***武器库---Metasploit***测试框架实战
  2. CSS:box-sizing理解与相对定位与绝对定位
  3. 金币问题
  4. CAD 入门 平面图
  5. elasticsearch历史数据清理
  6. gitlab迁移及迁移后500问题
  7. 仿写京东商城
  8. 210325 CSS flex布局 项目属性
  9. flex基础:flex容器中的四个属性的功能,参数
  10. 0325作业