Broadcast Recevier 广播接收器是一个专注于接收广播通知信息,并做出对应处理的组件。很多广播是源自于系统代码的──比如,通知时区改变、电池电量低、拍摄了一张照片或者用户改变了语言选项。应用程序也可以进行广播──比如说,通知其它应用程序一些数据下载完成并处于可用状态。 应用程序可以拥有任意数量的广播接收器以对所有它感兴趣的通知信息予以响应。所有的接收器均继承自BroadcastReceiver基类。 广播接收器没有用户界面。然而,它们可以启动一个activity来响应它们收到的信息,或者用NotificationManager来通知用户。通知可以用很多种方式来吸引用户的注意力──闪动背灯、震动、播放声音等等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。句段摘自Android Broadcast Security
这是接受由sendBroadcast()发送的Intent的代码的基类。
如果broadcast只是在自己应用内发送接收,应该考虑使用 LocalBroadcastManager类,
广播接收器的注册方式有两种
可以接收的广播有两种
注意,尽管广播也是通过intent类发送和接受广播,但是,这种Intent broadcast机制和通过 Context.startActivity()启动Activities 的intent是不同的概念
通过 Context APIs实现Receivers,会赋予其夸应用的性质。所以必须考虑会有其他程序滥用这些广播接收器:
使用LocalBroadcastManage意图不会在进程之外传递,全无这些问题
BroadcastReceiver 对象仅在调用 onReceive(Context, Intent) 期间有效,一旦此方法中进行return ,系统会认为其结束了并且不再执行.
此方法内不能进行任何异步或耗时的操作,尤其是不能使用BroadcastReceiver显示对话框或绑定服务,对于前者,可以使用NotificationManager API., 对于后者,可以通过调用 Context.startService() 向service发送一个命令.
正在执行BroadcastReceiver的进程(也就是说正在执行 onReceive(Context, Intent) 方法),系统会当作其为一个前台进程,并且即使在内存不足的时候也会保持它运行
一旦onReceive()中return,BroadcastReceiver就不会再执行了,其宿主进程的重要程度会变得和其他组件一样,这个性质很重要,因为如果宿主进程仅仅包含一个BroadcastReceiver,如果onReceive()中return,BroadcastReceiver就会结束,进程就是一个空进程,系统会为其他更重要的进程提供内存资源而杀死这个进程
这意味着,对于一些耗时操作,需要使用 Service 搭配 BroadcastReceiver, 保证在操作时间内,进程一直处于有效状态
在进程中为本地对象注册并发送广播。这比使用sendBroadcast(Intent)发送的全局性的广播有优点:
LocalBroadcastManager可以认为是context版的Broadcast的缩小版 相似方法用法相似
1,创建启动BroadcastReceiver的intent
2,发送广播
Intent intent=new Intent();//创建Intent
intent.setAction("android.accessibilityservice.AccessibilityService");//注册广播接收器时包含有意图过滤器时的intent设置
//intent.setClassName(context,"类名");//明确指出发送的接收器的类
//intent.setPackage("包名");//明确指出哪个包的接收器
//intent.setClass(context,class);//明确指出发往的接收器的类
// context.sendBroadcast(intent);//发送全局性质的普通广播
//context.sendUrderedBroadcast(intent,null);//发送全局性质的有序广播
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);//发送本地广播
继承BroadcastReceiver:
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class MyReceiver extends BroadcastReceiver {
public MyReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
}
}
".MyReceiver"
android:enabled="true"
android:exported="true" //使用LocalBroadcastManager时,设置为false
android:permission="android.permission.自定义">
"android.accessibilityservice.AccessibilityService"/> //自定义
MyReceiver receiver=new MyReceiver();
IntentFilter filter=new IntentFilter();
filter.addAction("android.accessibilityservice.AccessibilityService");
//注册receiver
registerReceiver(receiver, filter);
//取消注册receiver
unregisterReceiver(receiver);
此时也可以以new的方式创建广播:
BroadcastReceiver broadcastReceiver=new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
}
};
静态注册时:
"200">
"android.accessibilityservice.AccessibilityService"/>
动态注册时:
filter.setPriority(200);
Android开发之BroadcastReceiver详解
Broadcast内部机制讲解
Android Broadcast Security
import android.app.admin.DeviceAdminReceiver;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
/**
* 作者:liuyaowei;日期:2016-07-14.
* QQ:1054185214
* 类作用:设备管理器服务类 手机上的位置:设置--安全与隐私--设备管理器
*/
public class ${className} extends DeviceAdminReceiver {
public ${className}() {
}
@Override
public DevicePolicyManager getManager(Context context) {
return (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
}
@Override
public ComponentName getWho(Context context) {
return new ComponentName(context, ${className}.class);
}
/**
* 接受其他组件发送来的广播
* @param context
* @param intent
*/
@Override
public void onReceive(Context context, Intent intent) {
int flags=intent.getFlags();
if (!getManager(context).isAdminActive(getWho(context))){
// Launch the activity to have the user enable our admin.
Intent a = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
a.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, getWho(context));
a.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "555555");//说明信息
context.startActivity(a);
}else {
switch (flags){
case 0:
getManager(context).lockNow();
break;//锁屏
case 1:
getManager(context).wipeData(DevicePolicyManager.WIPE_EXTERNAL_STORAGE);
break; //清除存储数据
case 2:
getManager(context).wipeData(DevicePolicyManager.WIPE_RESET_PROTECTION_DATA);
break; //恢复出厂设置
case 3:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
getManager(context).reboot(getWho(context));
}
break; //重启
case 4:
getManager(context).resetPassword("",DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED);
break; //更改锁屏密码
case 5:
getManager(context).removeActiveAdmin(getWho(context));
break;//取消激活设备管理器
default:
break; //其他另行
}
}
}
/**
* 供其他组件调用来发送广播
* @param context
* @param flag
*/
public static void sendBroadcast(Context context,int flag){
Intent intent=new Intent();
intent.setAction("android.app.action.DEVICE_ADMIN_ENABLED");
intent.addFlags(flag);
context.sendBroadcast(intent,"android.permission.BIND_DEVICE_ADMIN");
}
}
liuyaowei/DeviceAdminReceiver
完