1.为什么要使用广播接收者(BroadCastReceiver)
1>Android系统内部相当于已经有一个电台 定义了好多的广播事件 比如外拨电话 短信到来 sd卡状态 电池电量变化....
2>谷歌工程师给我们定义了一个组件专门用来接收这些事件的 那就是BroadCastReceiver
3>目的就是为了方便开发者进行开发
2.小案例 熟悉下广播接收者的使用(ip拨号器)
(1)定义一个类继承BroadCastReceiver (就像是听电台,先准备了一个收音机)
//四大组件就要到androidManifest
public class OutGoingCallReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//从sp中获得保存的数据
SharedPreferences config = context.getSharedPreferences("config", 1);
String ipnumber = config.getString("ipnumber", "17951");
//获得广播发过来的数据
String number = getResultData();
//判断是否是长途电话
if(number.startsWith("0")){
setResultData(ipnumber+number);
}
}
}
(2)记得要在清单文件中配置broadcastReceiver(配置broadcastReceiver就是在收音机中加入电池。然后指定activity,就是调节频道,指定收听的频道)
再添加一个权限
实现一个ip拨号器,在拨打0开头的电话时 自动在前面加上用户手动保存的ip号
(3)当我们配置的action 的事件发生了 onReceive方法就会执行
听电台的过程缺一不可
3. 不同版本广播的特点
(1)4.0之后的手机 谷歌为了更加安全考虑 要求第一次安装应用的时候必须有界面
(2)在设置页面有一个强行停止的按钮 如果点击了 广播事件就不生效
(3)在2.3的版本的手机没有这样的安全设计
4.小案例(卸载安装广播事件)
public class AppStateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if("android.intent.action.PACKAGE_ADDED".equals(action)){
System.out.println("安装了aaaaaaaaaaaa");
}else if("android.intent.action.PACKAGE_INSTALL".equals(action)){
System.out.println("安装了bbbbbbbbbbbb");
}else if("android.intent.action.PACKAGE_REMOVED".equals(action)){
System.out.println("卸载了呢。。。。。。");
}
}
}
清单文件配置
5.小案例对开机事件的广播进行页面跳转
BroadCastReceiver
public class RebootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//开机跳转该页面
Intent intent1 = new Intent(context,MainActivity.class);
//不能直接在广播接收者中直接跳转页面 需要指定一个标记 添加一个任务栈的标记
intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//开启页面
context.startActivity(intent1);
}
}
在清单文件进行配置
记得要加一个权限允许接受开机启动
完成后就会在手机启动后跳转到所写页面。
注意:不能直接在广播接收者中直接跳转页面 需要指定一个标记 添加一个任务栈的标记intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
6.有序广播和无序广播
无序广播:类似新闻联播:广播不可以被终止 数据不可以被修改 (sendBroadCast)getRequestDate获得广播携带传递的数据
有序广播:类似中央发送的红头文件 按照优先级一级一级的接收 有序广播可以被终止 数据可以被修改 (sendOrderBroadCast)
一个有序广播的小案例 北京下发黄金 进行一个逐级广播 在清单文件中配置广播接收者 配置一个参数 prioriity(一般-1000~1000)
1>写一个有序广播发送者
/写一个有序广播
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click(View v){
Intent intent = new Intent();
intent.setAction("com.zkcd.gold");
//发送一个有序广播
//receiverPermission 接受的权限
//resultReciver最终的接收者
//initialCode 初始化码
//initialData 初始化数据
FinallyReciver finallyReciver = new FinallyReciver();
sendOrderedBroadcast(intent,null,finallyReciver,null,
1,"北京发了1000kg黄金",null);
}
}
在有序广播中,添加一个特殊的广播接收者(不需要在Androidmanifest中配置)
//特殊的广播接收者 不需要在清单文件配置
public class FinallyReciver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String resultData = getResultData();
Toast.makeText(context,"最终(钦差):"+resultData,1).show();
}
}
广播接收者一共写了4个,都一样的,这里陈述一个:
public class GoldBroadCastReciver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String resultData = getResultData();
Toast.makeText(context,"省长:"+resultData,1).show();
//终止 abortBroadcast();
//可以对数据进行修改
setResultData("北京发了500kg黄金");
}
}
7.特殊广播接收者
比如操作特别频繁的广播事件 屏幕的锁屏和解锁 电池电量的变化 这样的广播接收者在清单文件里面注册无效
一个小案例熟悉下
写一个对手机锁屏解锁的广播接收
public class MainActivity extends AppCompatActivity {
private ScreenReceiver screenReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//特殊的广播需要动态注册
screenReceiver = new ScreenReceiver();
IntentFilter intentFilter = new IntentFilter();
//为这个广播设置action
intentFilter.addAction("android.intent.action.SCREEN_ON");
intentFilter.addAction("android.intent.action.SCREEN_OFF");
registerReceiver(screenReceiver,intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
//记得要在activity关闭的时候取消注册
unregisterReceiver(screenReceiver);
}
}
public class ScreenReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if("android.intent.action.SCREEN_ON".equals(action)){
System.out.println("屏幕打开了");
}else if("android.intent.action.SCREEN_OFF".equals(action)){
}
}
}