android-BroadcastReceiver的介绍与使用

1.什么是广播

  • 广播,是一个全局的监听器,属于Android四大组件之一
  • 广播分为两个角色:广告接收者和广告传递者
  • 广播的作用是监听或者接收应用App 发出的广播消息,并做出响应

2.广播的分类及区别–有序广播与无序广播
无序广播
- 无序广播即为我们平时经常使用的广播,其主要是通过public abstract void sendBroadcast (Intentintent)方法进行发送,并通过intent传递数据

Intent nonOrderIntent = new Intent();
nonOrderIntent.setAction(ACTION);
sendBroadcast(nonOrderIntent);
  • 无序广播不可以被拦截,不可以被终止,不可以被修改,无序广播任何接收者只要匹配条件都可以接收到,无优先级问题。
  • 如果想通过无序广播传递数据,则可以调用intent.putExtra方法传递,
    接收者可通过intent.get…接收,不可通过getResultData接收。

有序广播
有序广播主要是通过public abstract void sendOrderedBroadcast (Intent intent,
String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle
initialExtras)方法进行发送。

Intent intent = new Intent();
intent.setAction(ACTION);
sendOrderedBroadcast(intent, null, new Priority2BroadcastReceiver(), null, Activity.RESULT_OK, "MainActivity发送了一个有序广播", null);
  1. 有序广播可以被拦截,可以在较高优先级的接收器中通过abortBroadcast()拦截广播,这样就会导致较低优先级的接收器无法收到广播了,但是sendOrderedBroadcast第三个参数指定的BroadcastReceiver还是会收到广播的,而且能获得数据。
  2. 有序广播可以通过原始intent.putExtra这种方式传递数据给BroadcastReceiver,也能通过sendOrderedBroadcast方法的最后2个参数传递数据,但是通过第一种方式传递的数据无法中途修改,通过第二种方式传递的可以通过上面参数说明中的方式进行修改。

3.广播的注册方式及区别–静态注册和动态注册
静态注册
注册方式:在AndroidManifest.xml里通过标签声明

"true" | "false"]
//此broadcastReceiver能否接收其他App的发出的广播
//默认值是由receiver中有无intent-filter决定的:如果有intent-filter,默认值为true,否则为false
    android:exported=["true" | "false"]
    android:icon="drawable resource"
    android:label="string resource"
//继承BroadcastReceiver子类的类名
    android:name=".mBroadcastReceiver"
//具有相应权限的广播发送者发送的广播才能被此BroadcastReceiver所接收;
    android:permission="string"
//BroadcastReceiver运行所处的进程
//默认为app的进程,可以指定独立的进程
//注:Android四大基本组件都可以通过此属性指定自己的独立进程
    android:process="string" >

//用于指定此广播接收器将接收的广播类型
//本示例中给出的是用于接收网络状态改变时发出的广播
 filter>
"android.net.conn.CONNECTIVITY_CHANGE" />
    filter>

<receiver 
    //此广播接收者类是mBroadcastReceiver
    android:name=".mBroadcastReceiver" >
    //用于接收网络状态改变时发出的广播
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    intent-filter>
receiver>

动态注册
注册方式:在代码中调用Context.registerReceiver()方法

// 选择在Activity生命周期方法中的onResume()中注册
@Override
  protected void onResume(){
      super.onResume();

    // 1. 实例化BroadcastReceiver子类 &  IntentFilter
     mBroadcastReceiver mBroadcastReceiver = new mBroadcastReceiver();
     IntentFilter intentFilter = new IntentFilter();

    // 2. 设置接收广播的类型
    intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);

    // 3. 动态注册:调用Context的registerReceiver()方法
     registerReceiver(mBroadcastReceiver, intentFilter);
 }


// 注册广播后,要在相应位置记得销毁广播
// 即在onPause() 中unregisterReceiver(mBroadcastReceiver)
// 当此Activity实例化时,会动态将MyBroadcastReceiver注册到系统中
// 当此Activity销毁时,动态注册的MyBroadcastReceiver将不再接收到相应的广播。
 @Override
 protected void onPause() {
     super.onPause();
      //销毁在onResume()方法中的广播
     unregisterReceiver(mBroadcastReceiver);
     }
}

4.无序广播

Intent intent = new Intent();
//对应BroadcastReceiver中intentFilter的action
intent.setAction(BROADCAST_ACTION);
//发送广播
sendBroadcast(intent);
<receiver 
    //此广播接收者类是mBroadcastReceiver
    android:name=".mBroadcastReceiver" >
    //用于接收网络状态改变时发出的广播
    <intent-filter>
        <action android:name="BROADCAST_ACTION" />
    intent-filter>
receiver>

5.有序广播

<receiver android:name=".MyReceiver">
            <intent-filter>
                <action android:name="edu.jju.broadcastreceiver" />
            intent-filter>
        receiver>


        <receiver android:name=".MyReceiverA">
            <intent-filter>
                <action android:name="edu.jju.broadcastreceiver" />
            intent-filter>
        receiver>

        <receiver android:name=".MyReceiverB">
            <intent-filter>
                <action android:name="edu.jju.broadcastreceiver" />
            intent-filter>
        receiver>

        <receiver android:name=".MyReceiverC">
            <intent-filter>
                <action android:name="edu.jju.broadcastreceiver" />
            intent-filter>
        receiver>

6.Service中发送广播示例

  • Android中,service的开启,默认是绑定activity的,是activity级的。如果要实现当退出程序后,保持Service的运行,那么需要把service设置成为system级的,首先声明权限

复制代码

<service
    android:name="com.androidnodesocket.PushNotificationService"
    android:enabled="true"
    android:process="system"
    />
  • 然后定义一个推送消息的服务类
package com.androidnodesocket;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
/**
 * Created by Administrator on 2017-10-14.
 */
public class PushNotificationService extends Service {
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
    }
    @Override
    public void onCreate() {
        super.onCreate();
    }
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

最后在启动的activity中启动服务

//启动服务
Intent i = new Intent(this,  PushNotificationService .class);
//下面写自己的路径
i.setAction("com.androidnodesocket.PushNotificationService");
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
this.startService(i);

首先在mainActivity中定义一个内部广播的类(广播接收器)用来接收到数据后更新到 textViewJishu 这个TextView的文本中

/**
 * 定义广播接收器(内部类)
 *
 * @author lenovo
 *
 */
private class UpdateUIBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        textView.setText(String.valueOf(intent.getExtras().getInt("count")));
    }
}

在MainActivity中声明两个变量并且在初始化的时候注册这个接收器的实例(下面是部分代码,请放到对应的位置)

//声明一个操作常量字符串
public static final String ACTION_UPDATEUI = "action.updateUI";
//声明一个广播实例
public UpdateUIBroadcastReceiver broadcastReceiver;
//在初始化的时候注册实例
// 动态注册广播
IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_UPDATEUI);
broadcastReceiver = new UpdateUIBroadcastReceiver();
registerReceiver(broadcastReceiver, filter);

在推送消息的服务类中发送广播消息给界面

你可能感兴趣的