Android| |广播机制
1、Android的广播机制介绍
机制:广播接收者通过注册到Android系统,然后接收Android发送的消息
大概和设计模式之观察者模式有点相像,大家可以相互对比来学习
2、BroadcastReceiver的作用
例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能;当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作;当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户及时保存进度,等等。
3、BroadcastReceiver的编写方法
Demo:一个简单的栗子
启动广播程序的类
要想启动一个BroadcastReceiver(把一个广播发送出去),必须调用sendBroadcast这个方法(然后在需要接收广播的activity中添加相应的intent-filter,当然在Receiver接收者中也要重写onReceiver方法)
public class TestActivity extends AppCompatActivity {
private Button sendButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
sendButton=(Button)findViewById(R.id.sendButton);
sendButton.setOnClickListener(new BroadcastListener());
}
class BroadcastListener implements View.OnClickListener{
@Override
public void onClick(View v) {
TestReceiver tr=new TestReceiver();
Intent intent=new Intent();
intent.setAction(Intent.ACTION_EDIT);
TestActivity.this.sendBroadcast(intent);
}
}
}
如果我们想要实现广播的接收,首先就需要创建一个继承BroadcastReceiver的一个类
public class TestReceiver extends BroadcastReceiver {
public TestReceiver(){
System.out.println("TestReceiver");
}
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("onReceiver");
}
}
然后在Manifest.xml文件中注册,通过Receiver标签来注册,通过intent-filter来确定需要需要接收广播的对象
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="chao.pers.testbc">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".TestActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name="chao.pers.testbc.TestReceiver">
<intent-filter>
<action android:name="android.intent.action.EDIT"/>
</intent-filter>
</receiver>
</application>
<uses-sdk android:minSdkVersion="4"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
</manifest>
如果成功匹配到接收者后,那么接收者会创建一个实例,并且调用自己的onReceive方法,每次接收广播都会生成一个新的Receiver
4、BroadcastReceiver的生命周期
BroadcastReceiver的实例是每触发一次就新建一次的,而且和程序是在同一个进程同一线程内.
5、注册BroadcastReceiver的方法
BroadcastReceiver用于监听被广播的事件(Intent)为了达到这个目的,BroadcastReceiver必须进行注册,注册的方法有以下两种:
1、在应用程序的代码当中进行注册
特点:适合使用广播机制来更新一些控件的状态
比如:如果一个BroadcastReceiver用于更新UI,那么通常会使用这种方法进行注册,在Activity启动的时候注册BroadcastReceiver,在Activity不可见以后取消注册
注册BroadcastReceiver:registerReceiver(receiver,filter);
取消注册BroadReceiver:unregisterReceiver(receiver);
Demo代码如下:
public class SMSReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("receiver message");
}
}
public class TestBC2Activity extends AppCompatActivity {
private SMSReceiver smsReceiver=null;
private Button registerButton;
private Button unregisterButton;
//接收短消息的Action
private static final String SMS_ACTION="android.provider.Telephony.SMS_RECEIVED";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_bc2);
registerButton=(Button)findViewById(R.id.register);
registerButton.setOnClickListener(new RegisterReceiverListener());
unregisterButton=(Button)findViewById(R.id.unregister);
unregisterButton.setOnClickListener(new UnRegisterReceiverListener());
}
class RegisterReceiverListener implements View.OnClickListener{
@Override
public void onClick(View v) {
//生成一个BroadcastReceiver对象
smsReceiver=new SMSReceiver();
//生成一个IntentFilter对象
IntentFilter filter=new IntentFilter();
//为IntentFilter添加一个Action
filter.addAction(SMS_ACTION);
//将BroadastReceiver对象注册到系统当中
TestBC2Activity.this.registerReceiver(smsReceiver,filter);
}
}
class UnRegisterReceiverListener implements View.OnClickListener{
@Override
public void onClick(View v) {
//解除BroadcastReceiver对象的注册
TestBC2Activity.this.unregisterReceiver(smsReceiver);
}
}
}
接收到短消息后,我们也可以进行某些处理,则我们就在SMSReceiver中重新复写onReceiver方法
public class SMSReceiver extends BroadcastReceiver{
@Override
//intent 就是广播的内容
public void onReceive(Context context, Intent intent) {
System.out.println("receiver message");
//接收Intent对象中的数据
Bundle bundle=intent.getExtras();
//在Bundle对象中有一个属性名为pdus,这个属性的值是一个Object数组
Object[] myObjects=(Object[])bundle.get("pdus");
//创建一个
SmsMessage[] messages=new SmsMessage[myObjects.length];
System.out.println(messages.length);
for (int i = 0; i < myObjects.length; i++) {
messages[i]=SmsMessage.createFromPdu((byte[])myObjects[i]);
System.out.println(messages[i].getDisplayMessageBody());
}
}
}
2、在AndroidManifest.xml当中进行注册
特点:即使应用程序没有启动或者已经关闭,还是会时刻监听广播事件,一直处于活动状态(比如监听电池的状态)
<receiver android:name="chao.pers.testbc.TestReceiver">
<intent-filter>
<action android:name="android.intent.action.EDIT"/>
</intent-filter>
</receiver>
6、Android内置的Broadcast Actions
内置的监听手机上所发生的各种事件,以下是比较常用的Action,完整列表可以参考: