1.清单文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="mobi.vhly.broadcastreceiverdemo"
>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<!-- 自定义权限:通常消息推送 大量使用自定义权限 -->
<permission android:name="com.qianfeng.permission.TEST_1_PERMISSION"/>
<uses-permission android:name="com.qianfeng.permission.TEST_1_PERMISSION"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<!-- <uses-permission android:name="android.permission.BROADCAST_SMS"/> -->
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme"
>
<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=".receivers.NetworkReceiver">
<intent-filter>
<!-- action 内部指定的内容,就是广播的信息类型 -->
<!-- 代表广播接收者接收网络状态变化的广播Intent -->
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
<receiver
android:name=".receivers.Normal1Receiver"
android:enabled="true"
android:exported="false"
>
<intent-filter android:priority="3">
<action android:name="com.qianfeng.ACTION_TEST_0"/>
</intent-filter>
</receiver>
<receiver
android:name=".receivers.Normal0Receiver"
android:enabled="true"
android:exported="false"
>
<!--priority数字越大优先级越高-->
<intent-filter android:priority="4">
<action android:name="com.qianfeng.ACTION_TEST_0"/>
</intent-filter>
</receiver>
<receiver
android:name=".receivers.SmsReceiver"
android:enabled="true"
android:exported="true"
>
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
<!--
permission 属性是 sendOrderedBroadcast 内部指定的内容,
这个权限内容,需要在清单文件最上方定义
-->
<receiver
android:name=".receivers.Ordered1Receiver"
android:enabled="true"
android:exported="false"
android:permission="com.qianfeng.permission.TEST_1_PERMISSION"
>
<intent-filter android:priority="-2">
<action android:name="com.qianfeng.ACTION_TEST_1"/>
</intent-filter>
</receiver>
<receiver
android:name=".receivers.Ordered0Receiver"
android:enabled="true"
android:exported="false"
>
<intent-filter android:priority="-1">
<action android:name="com.qianfeng.ACTION_TEST_1"/>
</intent-filter>
</receiver>
<receiver
android:name=".receivers.BootReceiver"
android:enabled="true"
android:exported="true"
>
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
</application>
</manifest>
2.无序广播接收者实例:
1)Normal0Receiver.java
public class Normal0Receiver extends BroadcastReceiver {
public Normal0Receiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
Log.d("Normal", "Normal0 received!");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d("Normal", "Normal0 Finished!");
}
}
2)Normal1Receiver.java
public class Normal1Receiver extends BroadcastReceiver {
public Normal1Receiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
Log.d("Normal", "Normal1 received!");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d("Normal", "Normal1 Finished!");
}
}
3.UI线程
public class MainActivity extends AppCompatActivity {
// 动态注册部分:
// 1. 创建一个BroadcastReceiver对象
// 2. 通过代码来注册要接收哪些广播信息
// 3. 不需要接收的时候,直接取消注册就可以了
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
/**
* 1. onReceive 默认执行在主线程,希望运行于子线程那么使用Handler
* 2. onReceive 方法在主线程执行时,允许执行最长10s,超过则被系统强制终止
* 3. 静态注册的广播接收者只要onReceive方法完成,那么创建的对象也会被系统删除
* 4.
* @param context
* @param intent
*/
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(action.equals(Intent.ACTION_BATTERY_CHANGED)){
// BatteryManager 内部定义了Intent中包含的各种EXTRA
int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0);
Log.d("Battery", "Level = " + level);
Log.d("Battery", "plugged = " + plugged);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onResume() {
super.onResume();
Context context = this;
/*
<receiver name="xxx$1">
<intent-filter>
<action name="Battery......"/>
</intent-filter>
</receiver>
*/
IntentFilter filter = new IntentFilter();
// 电量变化的广播,!电量变化只能用动态注册来监听
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
context.registerReceiver(mReceiver, filter);
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(mReceiver);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu, menu);
return true;
}
@Override
protected void onDestroy() {
super.onDestroy();
}
public void btnSendNormal(View view) {
// 广播信息
Intent intent = new Intent("com.qianfeng.ACTION_TEST_0");
intent.putExtra("name", "admin");
Context context = this;
// 发送无序广播
context.sendBroadcast(intent);
}
public void btnSendOrdered(View view) {
Intent intent = new Intent("com.qianfeng.ACTION_TEST_1");
//sendOrderedBroadcast(intent, null);
// 参数2:是定义的权限,只有声明使用这个权限内容的广播接收者才可以接收到广播消息
sendOrderedBroadcast(intent, "com.qianfeng.permission.TEST_1_PERMISSION");
}
public void btnSendLocal(View view) {
// 本地广播管理器
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(this);
Intent intent = new Intent("com.qianfeng.ACTION_TEST_2");
// 发送无序普通的广播
manager.sendBroadcast(intent);
// 发送广播,并且等待所有的广播发送给广播接收者,当所有广播接收者执行完成,
// 这个方法才会结束
manager.sendBroadcastSync(intent);
}
}
4.有序广播接收者
1)接收者一
public class Ordered0Receiver extends BroadcastReceiver {
public Ordered0Receiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
Log.d("Receiver", "Ordered0 Receive");
//abortBroadcast();
// 设置处理的结果
Bundle extras = new Bundle();
extras.putString("name", "admin");
setResult(998, "Hello", extras);
}
}
2)接收者二
public class Ordered1Receiver extends BroadcastReceiver {
public Ordered1Receiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
Log.d("Receiver", "Ordered1 Receive");
// Intent 参数传递的是初始的 广播信息
int code = getResultCode();
String data = getResultData();
// 获取传递的参数
Bundle extras = getResultExtras(true);
Log.d("Receiver", "code = " + code);
Log.d("Receiver", "data = " + data);
Log.d("Receiver", "extras = " + extras);
}
}
5.开机启动广播接收者
BootReceiver.java
public class BootReceiver extends BroadcastReceiver {
public BootReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
Log.d("BOOT", "手机启动了");
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
Notification n =
builder.setContentTitle("启动了")
.setContentText("检测到手机启动")
.setSmallIcon(R.mipmap.ic_launcher)
.build();
NotificationManagerCompat managerCompat = NotificationManagerCompat.from(context);
managerCompat.notify(998, n);
}
}