intent.sendOrderedBroadcast() //发送有序广播
intent.sendBroadcast() //发送无序广播
Intent intent = new Intent();
intent.setAction("com.fuheng.test");//动作
intent.setData(Uri.parse("package:com.fuheng.test"));//设置数据 ,接受者可以用getData()或者getDataString()得到
intent.putExtra("aa", "haha");//存值
sendBroadcast(intent);//发送
onReceive() 接受到广播的时候回调
getResultData() 获取结果数据(有序广播)
setResultData() 修改结果数据(有序广播)
abortBroadcast() 终止广播事件(有序广播)后面的就接受不到了
BroadcastReceiver–>DeviceAdminReceiver ‘设备管理员的广播接受者
发广播
BroadcastReceiver b = new MyBroadcast();
IntentFilter filter = new IntentFilter();//意图过滤
filter.addAction("com.fuheng.test");//增加广播接受的动作
filter.addDataScheme("nihao");//增加接受的数据
filter.addDataScheme("package");//一样
registerReceiver(b, filter);//注册广播
一:创建一个广播接受者
(1)买一个收音机: 继承BroadcastReceiver
(2)装电池: "全路径名">(3)
(3)调频道(意图过滤器):
filter android:priority="int值(表示优先级-1000-1000)">
"关心的广播事件动作"/>
"数据参数类型">
filter>
二:注意事项
(1)当广播接受者需要开启一个activity时
setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) 告知activity运行在增加的任务栈里面
(2)当用户为高版本的时候要记住需要添加一个权限(低版本不写也可以)
RECEIVE_BOOT_COMPLETED
(3)在高版本4.0后,当手机点强行停止之后,就接不到广播了,只有手动打开这个软件又可以监听
三:发送广播
(1)发送无序广播
Activtiy--->sendBroadcast() 发送无序广播
(2)发送有序广播
Activtiy-->sendOrderedBroadcast(意图, 权限(默认为null), 结果接受者(默认为null), 消息处理器(一般主线程为null), 编号(这个随便,知识一个区分), "消息"(getResultData()获取), 额外的数据(也可以为null))
指定的广播结果接受者可以不用配置清单文件,但是是最后一个接受数据(可以效验数据是否被修改)
四:特殊广播接受者
在android里面有一些产生非常频繁的广播事件,在清单文件里面配置是不会生效的
比如,电量的变化,屏幕的解锁,就要在代码里面实现,所以只有在应用程序启动的时候才能接受广播
(a)创建一个继承广播接受者的类,
(b)然后在activity里面写清单代码,就可以实现广播接受者
清单代码
(1)ScreenStatusReceiver aa=new ScreenStatusReceiver();得到一个广播接受者的类
(2)IntentFilter filter=new IntentFilter() 设置意图过滤器
(3)filter.addAction("动作") 指定动作
(4)registerReceiver()注册一个广播接受者
(5)unregisterReceiver(aa)取消注册广播接受者
'创建一个设备管理员的广播接受者
1.新建一个类,继承DeviceAdminReceiver public class MyAdmin extends DeviceAdminReceiver {
}
2.在清单文件中进行配置
<receiver
android:name="com.itheima.mobilesafe.ui.receiver.MyAdmin" //广播接收者的全类名
android:description="@string/sample_device_admin_description" //描述
android:label="@string/sample_device_admin" //标签
android:permission="android.permission.BIND_DEVICE_ADMIN" >
<meta-data
android:name="android.app.device_admin"
android:resource="@xml/device_admin_sample" /> //要使用到的权限
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
intent-filter>
receiver>
3.android:name处填入广播接收者的全类名
4.新建label和description对应的字符串,声明标签和描述的内容
5.新建device_admin_sample.xml文件,声明要使用的管理员权限
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
<uses-policies>
<limit-password /> //设置密码规则
<watch-login /> //监视屏幕解锁尝试次数
<reset-password /> //更改屏幕解锁密码
<force-lock /> //锁定屏幕
<wipe-data /> //清除所有数据
<expire-password /> //设置锁定屏幕密码的有效期
<encrypted-storage /> //设置存储设备加密
<disable-camera /> //停用相机
uses-policies>
device-admin>
'###1.创建Widget的步骤
1. 创建一个类继承AppWidgetProvider
public class MyWidget extends AppWidgetProvider {
}
2. Widget就是一个广播接收者,所以在清单文件中进行配置
<receiver android:name="com.itheima.widget.MyWidget" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/example_appwidget_info" />
receiver>
android:name 处配置全类名
android:resource 处配置一个Widget的描述文件
3. 描述文件(xml类型的xml文件)
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:initialLayout="@layout/test" //布局文件
android:minHeight="40dp"
android:minWidth="40dp"
android:updatePeriodMillis="86400000" >
appwidget-provider>
注意事项:app不能装在sd卡里面比如不能有android:installLocation="preferExternal"
***Widget的生命周期
1. onEnable():第一次widget被创建,初始化工作
2. onDisable():最后一个widget被销毁的时候,擦屁股工作
3. onUpdate():每当widget被创建的时候,以及updatePeriodMillis时间到的时候
4. onDelete():每当widget被删除的时候调用
5. onAppWidgetOptionsChanged():当widget被改变大小
6. onReceive():其他是声明周期事件都是通过onReceive分发的
"android.intent.action.BOOT_COMPLETED" /> //开机广播
Intent.ACTION_NEW_OUTGOING_CALL //外拨电话
"android.provider.Telephony.SMS_RECEIVED" //短信到来
Intent.ACTION_SCREEN_ON //屏幕点亮
Intent.ACTION_SCREEN_OFF //屏幕关闭
Intent.ACTION_PACKAG._ADDED // 一个新应用包已经安装在设备上,数据包括包名(最新安装的包程序不能接收到这个广播,(当前正在安装的程序不能接收这个广播))
Intent.ACTION_PACKAGE_REPLACED //一个新版本的应用安装到设备,替换之前已经存在的版本
Intent.ACTION_PACKAGE_REMOVED //一个已存在的应用程序包已经从设备上移除,包括包名(正在被卸载的包程序不能接收到这个广播)
filter.addAction(Intent.ACTION_PACKAGE_REMOVED); //应用卸载的广播
filter.addDataScheme("package");
'*窃听短信广播的代码*
System.out.println("短信到来了....");
//短信的数据是pdus的数据,必须对短信的格式很了解才可以解析短信.
Object[] objs = (Object[]) intent.getExtras().get("pdus");//得到短信的信息
for(Object obj:objs){
SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) obj);
String body = smsMessage.getMessageBody();
String sender = smsMessage.getOriginatingAddress();
System.out.println("body:"+body);
System.out.println("sender:"+sender);
abortBroadcast();
}
------------------------------------------------------------------------------------------------------------------------
'###2.*接收卸载应用程序的广播*
AppUninstallReceiver receiver = new AppUninstallReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
filter.addDataScheme("package");
registerReceiver(receiver, filter);
* **相关广播**
* ACTION\_PACKAGE\_ADDED 一个新应用包已经安装在设备上,数据包括包名(最新安装的包程序不能接收到这个广播,(当前正在安装的程序不能接收这个广播))
* ACTION\_PACKAGE\_REPLACED 一个新版本的应用安装到设备,替换之前已经存在的版本
* ACTION\_PACKAGE\_REMOVED 一个已存在的应用程序包已经从设备上移除,包括包名(正在被卸载的包程序不能接收到这个广播)
// 5秒后发送广播
AlarmManager alarmMgr = (AlarmManager) VirtualCore.get().getContext().getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent();
intent.setAction("com.lody.virtual.client.hook.wx.StartupVAReceiver");
int requestCode = 0;
PendingIntent pendIntent = PendingIntent.getBroadcast(VirtualCore.get().getContext(),
requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
int triggerAtTime = (int) (SystemClock.elapsedRealtime() + 5 * 1000);
alarmMgr.set(AlarmManager.ELAPSED_REALTIME, triggerAtTime, pendIntent);