android四大组件之 - BroadcastReceive广播接受者

  • API
  • 创建广播接受者
  • 创建一个设备管理员的广播接受者
  • 创建Widget
  • 广播接受者接受的动作
  • 实例代码

API

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);//发送
  • BroadcastReceiver
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>

创建Widget


'###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);

你可能感兴趣的:(andorid)