安卓学习之广播

1.广播机制

  标准广播:

    标准广播(Normal broadcasts)是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因此它们之间没有任何先后顺序可言,它是无法被截断的。工作流程图:

  有序广播:

    有序广播(Ordered broadcasts)则是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。所以此时的广播接收器是有先后顺序的,优先级高的广播接收器就可以先收到广播消息,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息了。工作流程图:

2.接受系统广播:

  注册广播的方式一般有两种,在代码中注册和在 AndroidManifest.xml 中注册,其中前者也被称为动态注册,后者也被称为静态注册。

  动态注册:

    新建项目,修改 MainActivity 中的代码:

public class MainActivity extends Activity {
  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);
  }
  @Override
  protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(networkChangeReceiver);
  }
  class NetworkChangeReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
    Toast.makeText(context, "network changes", Toast.LENGTH_SHORT).show();
    }
  }
}

  我们在MainActivity定义了一个内部类 NetworkChangeReceiver,继承自 BroadcastReceiver。重写了父类的 onReceive()方法,每当网络发生变换,onReceive()方法得到执行。

  然后观察 onCreate()方法,首先我们创建了一个 IntentFilter 的实例,并给它添加了一个值为 android.net.conn.CONNECTIVITY_CHANGE的action,当网络状态发生变化时, 系统发 出的正是一条值为android.net.conn.CONNECTIVITY_CHANGE 的广播,也就是说我们的广播接收器想要监听什么广播,就在这里添加相应的action就行了。然后调用registerReceiver()

方法进行注册。这样NetworkChangeReceiver 就会收到所有值为 android.net.conn.CONNECTIVITY_CHANGE 的广播,也就实现了监听网络变化的功能。

  动态注册的广播接收器一定都要取消注册才行,这里我们是在 onDestroy()方法中通过调用 unregisterReceiver()方法来实现的。

  静态注册:

  动态注册的广播接收器可以自由地控制注册与注销,在灵活性方面有很大的优势,但是它也存在着一个缺点,即必须要在程序启动之后才能接收到广播,静态注册就可以避免这种跟情况。

  新建一个类BootCompleteReceiver 继承自BroadcastReceiver

public class BootCompleteReceiver extends BroadcastReceiver {
  @Override
  public void onReceive(Context context, Intent intent) {
    Toast.makeText(context, "Boot Complete", Toast.LENGTH_LONG).show();
  }
}

  修改 AndroidManifest.xml 文件

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.example.broadcasttest"
  android:versionCode="1"
  android:versionName="1.0" >
......
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
  <application
      android:allowBackup="true"
      android:icon="@drawable/ic_launcher"
      android:label="@string/app_name"
      android:theme="@style/AppTheme" >
......
     <receiver android:name=".BootCompleteReceiver" >
      <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
      </intent-filter>
    </receiver>
  </application>
</manifest>

  <application>标签内出现了一个新的标签<receiver>,所有静态注册的广播接收器都是在这里进行注册的。它的用法其实和<activity>标签非常相似,首先通过 android:name来指定具体注册哪一个广播接收器,然后在<intent-filter>标签里加入想要接收的广播就行了,由于 Android 系统启动完成后会发出一条值为 android.intent.action.BOOT_COMPLETED 的广播,因此我们在这里添加了相应的 action。

  另外,监听系统开机广播也是需要声明权限的,可以看到,我们使用<uses-permission>标签又加入了一条 android.permission.RECEIVE_BOOT_COMPLETED 权限。

  这样就能做开机接收广播了。

  未完~

时间: 2024-10-11 23:00:44

安卓学习之广播的相关文章

安卓学习笔记(二)基本构件

1.Activity 一个Activity,通常是用户在某一个时刻,在设备上看到的单独的界面.一个应用程序通常含有多个Activity,用户可在期间进行切换.对用户而言,这就是程序的外观部分. Activity的生命周期:启动一个Activity可能会消耗大量资源.他可能会涉及到新建一个Linux进程.为UI对象申请内存空间.从UML布局填充所有对象,以及创建整个界面.为了避免这种浪费,Android通过ActivityManager来管理活动的生命周期. ActivityManager负责创建

安卓学习-界面-布局-RelativeLayout

RelativeLayout相对布局,所有内部的组件都是相对的 XML属性 XML属性 函数 说明 android:gravity setGravity 内部组件的对其方式 android:ignoreGravity setIgnoreGravity 设置哪个组件不受Gravity影响 RelativeLayout.LayoutParams用来设置内部组件的对齐方式 XML属性 说明 android:layout_centerHorizontal 水平居中 android:layout_cent

安卓学习第13课——BaseAdapter

BaseAdapter创建这么一个对象,需要些四个方法. int getCount(); Object getItem(int position); long getItemId(int position);View getView(int position, View convertView, ViewGroup parent);(1)列表中的项数(2)返回值的列表内容(3)获得postion处的列表项的ID(4)该列表项里的组件 package com.example.baseadapter

深入浅出安卓学习相关知识,如何从零学好移动开发

原文发表自我的个人主页,欢迎大家访问 http://purplesword.info/mobile-develop 由于近几年来互联网的飞速发展,安卓和iOS平台的大量普及推广,移动开发在当前是非常热门的一个方向. 有不少同学问我如何学习安卓,要学些什么,难不难学.之前一直没有想好应该怎么回答这个问题,只是简单的说安卓自身门槛不高,并不难学.因为我觉得准确回答一个类似这样的问题往往需要灵感.现在根据我的学习体验,做个大概的总结. 1.我为什么学安卓 我从刚开始接触安卓开发到现在也有两三年的时间了

安卓学习第12课——SimpleAdapter

SimpleAdapter一点也不简单,他的参数就带了5个,天哪,晕了.. 今天学的这个适配器, public SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to) 看这个大概明白,参数分别是第一个:表示访问整个android应用程序接口,基本上所有的组件都需要,一般都写this(改天研究一下),第二个应该是这个List对象

安卓学习第9课——计时器chronometer

今天学习了钟表及计时器.. 我觉得AnalogClock和DigitalClock直接使用就可以.唯一需要知道的就是AnalogClock是可以修改表盘和分针时针的. 方法是android:dail及android:hand_minute和hand_hour. 下面介绍的是计时器的用法. 首先xml中只要放入一个chronometer和一个按钮即可.为的是是点击启动按钮,开始计时,20s停止. package com.example.chronometer; import android.app

安卓学习随笔 -- 自定义标题栏

在安卓中不喜欢系统默认的标题栏,那么如何让自定义一个自己的标题栏呢. 自定义后的标题栏如下: 首先这里需要定义一个自定义的标题栏布局 title.xml文件 (里边需要两个图片这个很简单) <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fi

Android开发手册 安卓学习教程手册(MtAndroid开发手册)

发布本资料须遵守开放出版许可协议 1.0 或者更新版本. 未经版权所有者明确授权,禁止发行本文档及其被实质上修改的版本. 未经版权所有者事先授权,禁止将此作品及其衍生作品以标准(纸质)书籍形式发行. 如果有兴趣再发行或再版本手册的全部或部分内容,不论修改过与否,或者有任何问题,请联系版权所有者 [email protected]. Android开发者必备学习手册,基础和进阶手册. (MtAndroid开发手册) Android开发手册 安卓学习教程手册(MtAndroid开发手册),布布扣,b

安卓学习第11课——AutoCompleteTextView

...在百度上搜了这么一段.理解了ArrayAdapter的三个参数的用途 1. 这个小例子是要显示一个数组,我们就用ArrayAdapter,数组适配器,数据的数据类型<>是String类型的,数据的数据类型还可以是其他的包括对象类型的 2. ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(ArrayListDemo.this, android.R.layout.simple_list_item