Android笔记三十三.BroadcastReceiver使用

2023-05-01,,

    广播是一种广泛运用在应用程序之间传输信息的机制,而BroadcastReceiver是对发送出来的广播进行过滤接收并响应的一类组件。

BroadcastReceiver本质上是一种全局监听器。用于监听系统全局的广播消息并接收指定的广播,因此它能够很方便地实现系统中不同组件之间的通信。例如以下为BroadcastReceiver知识点结构:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjYzNzUwMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" width="478" height="233" alt="" style="background-color:inherit; display:inline-block; margin-top:8px; height:233.1447661469933px; width:478px">

一、发送与接收广播
1.发送广播   
     广播的发送通过调用Context.sendBroadcast()、Context.sendOderedBroadcast()来实现:
     
     (1)Context.sendBroadcast(Intent
intent):用于发送普通广播。当中intent參数表示接收该广播的广播接收者所须要满足的条件,以及广播所传递的数据;
     (2)Context.sendOderedBroadcast(Intent intent, String receiverPermission):用于发送有序广播。intent參数同上。receiverPermission表示接收该广播的许可权限。
2.接收广播  
 

    广播的接收,则利用组件BroadcastReceiver是对发送出来的广播进行过滤接收并响应指定的广播。通常一个广播能够被订阅了该Intnet的多个广播接收者所接收。如同一个广播台。能够被多个多位听众收听一样。
启动BroadcastReceiver步骤:
(1)创建Intent,指定BroadcastReceiver的特征;
(2)调用Context的sendBroadcast()(发送普通广播)或sendOrderBroadcast()(发送有序广播)方法来发送广播,触发指定的BroadcasttReceiver。

    为此,当应用程序发出一个广播之后,全部匹配该Intent的BroadcastReceiver都有可能被启动。
二、广播的分类
1.普通广播
    是全然异步的。能够在同一时刻(逻辑上)被全部接收者接收到,消息传递的效率比較高。

但缺点是接收者不能将处理结果传递给下一个接收者。而且无法终止Broadcast
Intent的传播。

2.有序广播
    该广播的接收者将按预先声明的优先级次序接收广播。

有序广播接收者能够终止广播的传播(通过调用abortBroadcast()方法)。广播的传播一旦终止,后面的接收者就无法接收到广播。另外,广播的接收者能够将数据传递给下一个接收者(通过setResultExtras(Bundle
bundle)方法)。

三、BroadcastReceiver应用开发步骤

    BroadcastReceiver自身并不实现图形用户界面,可是当它收到某个消息之后,能够启动Activity作为响应,或者通过NotificationManager提醒用户,或者启动Service等等。

1.创建广播接收器

实现一个继承于BroadcastReceiver基类的子类,并实现里面的onReceiver()方法;

    public class MyBroadcastReceiver extends BroadcastReceiver
    {
    public void onReceiver(Context context,Intent intent){
    }
    }

    在onReceiver()方法中,接收了一个Intent的參数,通过它能够获取广播所携带的数据。也能够启动一个Service服务来处理耗时任务等。

2.发送广播,并指定该广播的Intent属性
    广播接收者注冊好了以后。并不会直接执行,必须在接收广播之后才会被调用。因此。必须首先发送广播,在Activity或Service调用Context的sendBroadcast(Intent
intent)或sendOrderedBroadcast(Intent intent, String receiverPermission)发送广播。


3.注冊广播接收器。指定其接收哪一个广播。


    创建完广播接收者后。并不能立即使用,还必须为它(广播接收者)注冊一个指定的广播。就如同我们有了收音机后,还必须选择收听哪个频道一样。

(1)静态注冊:是指在AndroidManifest.xml文件里进行注冊。

    <receiver android:name=".MyBroadcastReceiver">
    <intent-filter>
    <action
    android:name = "com.jiangdongguo.android.myBroadcastReceover">
    <action/>
    </intent-filter>
    </receiver>

(2)动态注冊:须要在代码中动态的指定广播地址并注冊,一般是在Activity或Service中调用ContextWrapper的

    MyBroadcastReceiver myBroadcastReceiver = new MyBroadcastReceiver();
    IntentFilter filter = new IntentFilter("com.jiangdongguo.android.myBroadcastReceover"); //指定接收哪个广播
    registerReceiver(BroadcastReceiver receiver。IntentFilter filter)方法进行注冊

    当中,MyBroadcastReceiver为基类BroadcastReceiver子类。

注冊完毕后。就可以接收相应的广播消息。一旦广播(Broadcast)事件发生后,系统就会创建相应的BroadcastRecevier实例,并自己主动触发它的onReceiver()方法,onReceiver()方法运行后,BroadcastReceiver的实例就会被销毁。

三、源代码实战

实现:在Activity中启动一个广播,通过广播接收器接收该广播并作出响应。
1.MyBroadcastReceiver.java:
    继承于BroadcastReceiver子类-广播接收器,用于接收指定广播并作出对应响应。

    package com.example.mybroadcast;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.widget.Toast;
    /*BroadcastReceiver子类
    * 用于接收指定发送广播*/
    public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context arg0, Intent arg1) {
    Toast.makeText(arg0, "我是BroadcastReceiver,我已经接收到发送的广播。", Toast.LENGTH_SHORT).show();
    }
    }

凝视:我们能够在onReceiver()方法中获取Intent携带的数据,也能够启动一个Service服务来运行耗时任务等。
2.MainActivity.java
    主Activity。用于发送一个广播。或者能够取代AdroidManifest.xmlproject文件注冊广播接收器

    package com.example.mybroadcast;
    import android.app.Activity;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    public class MainActivity extends Activity {
    private Button sendBroad;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    /*1.广播接收器注冊方式二:注冊一个广播接收器*/
    MyBroadcastReceiver myBroadcastReceiver = new MyBroadcastReceiver();
    IntentFilter filter = new IntentFilter("com.jiangdongguo.Android.BroadcastReceiver");
    registerReceiver(myBroadcastReceiver,filter);
    sendBroad = (Button)findViewById(R.id.send);
    sendBroad.setOnClickListener(new OnClickListener(){
    public void onClick(View v) {
    /*2.发送一个广播,并指明其action属性*/
    //a.指明该广播的action属性
    Intent intent = new Intent("com.jiangdongguo.Android.BroadcastReceiver");
    //b.发送广播
    sendBroadcast(intent);
    }
    });
    }
    }

3.AndroidManifest.xml
    project文件。在这里的作用是添加对BroadcastReceiver注冊。

    <?xml version="1.0" encoding="utf-8"?

    >
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.mybroadcast"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="14" />
    <application
    android:allowBackup="true"
    android:icon="@drawable/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=".MyBroadcastReceiver">
    <intent-filter >
    <action android:name="com.jiangdongguo.Android.BroadcastReceiver"/>
    </intent-filter>
    </receiver> -->
    </application>
    </manifest>

效果演示:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjYzNzUwMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" width="605" height="407" alt="" style="background-color:inherit; display:inline-block; margin-top:8px; width:605.4336099585063px; height:407px">

源代码分析:
(1)假设确定须要依据广播来完毕一项比較耗时的操作,则能够考虑通过Intent启动一个Service来完毕操作。不应考虑使用新线程去完毕耗时的操作。由于BroadcastReceiver本身的生命周期极短,可能出现的情况是子线程可能没有结束,BroadcastReceiver就已经退出了。

(2)假设广播接收者所在的进程结束了,尽管该进程内还实用户启动的新线程。但因为该进程内不包括不论什么活动组件,因此系统可能在内存紧张时优先结束线程。

这样就可能导致BroadcastReceiver启动的子线程不能运行完毕。

Android笔记三十三.BroadcastReceiver使用的相关教程结束。

《Android笔记三十三.BroadcastReceiver使用.doc》

下载本文的Word格式文档,以方便收藏与打印。