一、BroadcastReceiver是Android系统的四大组件之一,它本质上就是一个全局的监听器,用于监听系统全局的广播消息。由于BroadcastReceiver是一种全局的监听器,因此它可以方便地实现系统中不同组件之间的通信。
二、BroadcastReceiver和事件处理机制相似,只不过事件处理机制是程序级别的的监听器,这些监听器运行在指定程序所在的进程中,当程序退出时,这些程序级别的监听器也会随之关闭。而BroadcastReceiver属于系统级别的监听器,它拥有自己的进程,只要系统中存在着与之匹配的Intent被广播出来, BroadcastReceiver总会被激发。
三、程序通过调用Context的sendBroadcast()方法来启动指定的BroadcastReceiver
BroadcastReceiver生命周期只有十秒左右,如果在 onReceive() 内做超过十秒内的事情,就会报错。所以不要在BroadcastReceiver的onReceiver()方法中执行耗时的操作,如果确实需要根据Broadcast来完成比较耗时的任务,则可以考虑通过Intent启动一个Service来完成操作。
一、静态注册。AndroidManifest.xml文件中配置。
这类BroadcastReceiver特点:常驻型的。
二、动态注册。代码中动态的指定广播地址并注册。
这类BroadcastReceiver特点:不是常驻型的,广播会跟随程序的生命周期。
注:注册BroadcastReceiver类似于给收音机加选台按钮
下面是一个实例,写了3个BroadcastReceive类,来测试无序广播
第一个广播类
package com.zdsft.administrator.mybroadcastreceiver.broadcastreceive;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
/**
* Created by Administrator on 2017/3/23.
*/
public class MyBroadcastReceive extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.e("MyBroadcastReceive","onReceive");
}
}
第二个广播类
package com.zdsft.administrator.mybroadcastreceiver.broadcastreceive;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
/**
* Created by Administrator on 2017/3/23.
*/
public class MyBroadcastReceive1 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.e("MyBroadcastReceive1","onReceive");
}
}
第三个广播类
package com.zdsft.administrator.mybroadcastreceiver.broadcastreceive;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
/**
* Created by Administrator on 2017/3/23.
*/
public class MyBroadcastReceive2 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.e("MyBroadcastReceive2","onReceive");
}
}
在AndroidManifest.xml中给3个广播注册权限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.zdsft.administrator.mybroadcastreceiver">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MybroadTest">
<activity android:name=".MainActivity"/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<!--注册广播权限-->
<receiver android:name=".broadcastreceive.MyBroadcastReceive">
<!--priority是在有序广播中给广播添加优先级,从-1000到1000 从小到大,优先级高的能终止优先级低的-->
<intent-filter android:priority="-100">
<!--相当于给广播调频-->
<action android:name="com.zdsft"/>
</intent-filter>
</receiver>
<!--给广播1注册权限-->
<receiver android:name=".broadcastreceive.MyBroadcastReceive1">
<intent-filter android:priority="200">
<action android:name="com.zdsft"/>
</intent-filter>
</receiver>
<!--给广播2注册权限-->
<receiver android:name=".broadcastreceive.MyBroadcastReceive2">
<intent-filter android:priority="999">
<action android:name="com.zdsft"/>
</intent-filter>
</receiver>
</application>
</manifest>
写一个测试类,来发送广播
package com.zdsft.administrator.mybroadcastreceiver;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
Button send_btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.send_btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//给各广播
Intent intent = new Intent("com.zdsft");
//发送无序广播
sendBroadcast(intent);
//发送有序广播
// sendOrderedBroadcast(intent,null);
}
});
}
}
测试类的布局activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<Button
android:id="@+id/send_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送广播"/>
</LinearLayout>
这是静态注册广播的用法