|
本帖最后由 liu 于 2018-12-21 15:24 编辑
BroadcastReceiver简介
广播接收器,四大组件之一,是一种全局的监听器,用于监听系统全局的广播消息。它可以监听或接收应用APP发出的广播消息,并做出响应
BroadcastReceiver的生命周期:
从对象调用它开始,到onReceiver方法执行完成之后结束。另外,每次广播被接收后会重新创建BroadcastReceiver对象,并在onReceiver方法中执行完就销毁,如果BroadcastReceiver的onReceiver方法中不能在10秒内执行完成,Android会出现ANR异常。所以不要在BroadcastReceiver的onReceiver方法中执行耗时的操作。
如果需要在BroadcastReceiver中执行耗时的操作,可以通过Intent启动Service来完成。但不能绑定Service。
如果在Activity中注册了BroadcastReceiver,当这个Activity销毁的时候要主动撤销注册否则会出现异常
BroadcastReceiver类型:
无序广播:所有跟广播的intent匹配的广播接收者都可以收到该广播,并且是没有先后顺序
有序广播:所有跟广播的intent匹配的广播接收者都可以收到该广播,但是会按照广播接收者的优先级来决定接收的先后顺序
创建BroadcastReceiver:
[Java] 纯文本查看 复制代码 //继承BroadcastReceiver,实现onReceive(Context context, Intent intent)方法public class MyBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
}
}
注册BroadcastReceiver:
1、静态注册
在AndroidManifest.xml文件中注册,通过这种方式注册的广播为常驻型广播
[Java] 纯文本查看 复制代码 <receiver android:name=".MyBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.MyBroadcastReceiver" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
2、动态注册
在Java代码中进行注册,通过这种方式注册的广播为非常驻型广播,在Activity结束时要调用unregisterReceiver(BroadcastReceiver receiver)方法结束它
[Java] 纯文本查看 复制代码 package com.company.helloworld.firstapplication;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private MyBroadcastReceiver receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
receiver = new MyBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.intent.action.MyBroadcastReceiver");
registerReceiver(receiver, intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}
}
一些常用的Android系统广播action:
监听网络变化 android.net.conn.CONNECTIVITY_CHANGE
屏幕锁屏 Intent.ACTION_CLOSE_SYSTEM_DIALOGS
屏幕被关闭 Intent.ACTION_SCREEN_OFF
屏幕被打开 Intent.ACTION_SCREEN_ON
重启设备 Intent.ACTION_REBOOT
屏幕锁屏 Intent.ACTION_CLOSE_SYSTEM_DIALOGS
充电时或电量发生变化 Intent.ACTION_BATTERY_CHANGED
插入外部储存装置(如SD卡) Intent.ACTION_MEDIA_CHECKING
设备当前设置被改变时(界面语言、设备方向等) Intent.ACTION_CONFIGURATION_CHANGED
|
|