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);
- 有序广播可以被拦截,可以在较高优先级的接收器中通过abortBroadcast()拦截广播,这样就会导致较低优先级的接收器无法收到广播了,但是sendOrderedBroadcast第三个参数指定的BroadcastReceiver还是会收到广播的,而且能获得数据。
- 有序广播可以通过原始intent.putExtra这种方式传递数据给BroadcastReceiver,也能通过sendOrderedBroadcast方法的最后2个参数传递数据,但是通过第一种方式传递的数据无法中途修改,通过第二种方式传递的可以通过上面参数说明中的方式进行修改。
3.广播的注册方式及区别–静态注册和动态注册
静态注册
注册方式:在AndroidManifest.xml里通过标签声明
<receiver
android:enabled=["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" >
//用于指定此广播接收器将接收的广播类型
//本示例中给出的是用于接收网络状态改变时发出的广播
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
<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);
在推送消息的服务类中发送广播消息给界面