Android BroadcastReceiver 广播接收者

BroadcastReceiver 广播接收者




注册


清单文件中注册:

<application 层中
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
    <uses-permission android:name="android.permission.RECEIVE_SMS"/>
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
        <!-- 配置广播接收者 -->
        <receiver android:name="MyBroadcastReceiver">
            <intent-filter 
                android:priority="59520" > <!-- 配置有序广播优先级 越大越好越先 2147483647 -->
                <action android:name="android.intent.action.MEDIA_MOUNTED"/>   <!-- SD卡挂载 --> <!-- 需要约束 -->
                <action android:name="android.intent.action.MEDIA_UNMOUNTED"/> <!-- SD卡卸载 --> <!-- 需要约束 -->
                <action android:name="android.intent.action.NEW_OUTGOING_CALL"/> <!-- 打电话 --> <!-- 需要权限 -->
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/> <!-- 接短信 --> <!-- 需要权限 -->
                <action android:name="android.intent.action.PACKAGE_ADDED"/> <!-- 安装应用 --> <!-- 需要约束 -->
                <action android:name="android.intent.action.PACKAGE_REMOVED"/> <!-- 卸载应用 --> <!-- 需要约束 -->
                <action android:name="android.intent.action.BOOT_COMPLETED"/> <!-- 手机重启 --> <!-- 需要权限 -->
                <action android:name="com.bz.mydisorderreceiver"/> <!-- 自定义无序广播 -->
                <action android:name="com.bz.oreceiver"/> <!-- 自定义有序广播 -->

                <data android:scheme="file"/> <!-- SD卡广播必须配置 约束file 因为SD卡存的都是file/文件 -->
                <data android:scheme="package"/> <!-- 安装卸载广播必须配置 约束package 安卓应用都是一个package/包 -->
            </intent-filter>

在代码中注册:(与在清单文件注册的区别:代码注册-只有在程序运行时才能接收广播)

//动态注册广播接受者
ScreenReceiver screenreceiver;
public void screenReceiver(){ //动态注册广播接受者 (就不需要在清单文件中注册) 一些特殊的广播需要 比如锁屏,电量

    /*<receiver android:name="ScreenReceiver">
           <intent-filter >
               <action android:name="android.intent.action.SCREEN_OFF"/>
               <action android:name="android.intent.action.SCREEN_ON"/>
         </intent-filter>
    </receiver>*/

    screenreceiver = new ScreenReceiver();

    IntentFilter filter = new IntentFilter();
    filter.addAction("android.intent.action.SCREEN_OFF"); //锁屏
    filter.addAction("android.intent.action.SCREEN_ON");  //开屏

    registerReceiver(screenreceiver, filter); //记得要关闭
}

@Override
protected void onDestroy() {
    unregisterReceiver(screenreceiver); //关闭
    super.onDestroy();
}




第一次写的广播 MyBroadcastReceiver.java

package com.bz.broadcastreceiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.gsm.SmsManager;
import android.telephony.gsm.SmsMessage;
import android.widget.Toast;

public class MyBroadcastReceiver extends BroadcastReceiver {


    @SuppressWarnings("deprecation")
    @Override                                  //当收到广播时
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub

        String action = intent.getAction(); //获取广播的事件类型 SD卡/拨号/短信

        if("android.intent.action.MEDIA_MOUNTED".equals(action)){
            System.out.println("SD卡被挂载");
        }
        else if("android.intent.action.MEDIA_UNMOUNTED".equals(action)){
            System.out.println("SD卡被卸载");
        }
        else if("android.intent.action.NEW_OUTGOING_CALL".equals(action)){
            System.out.println("拨打电话");

            String currentnum = getResultData(); //接收广播的数据 手机号码

            if(currentnum.startsWith("0"))//判断拨打的号码是不是长途 以0开头
                setResultData("17951"+currentnum); //更改广播数据
        }
        else if("android.provider.Telephony.SMS_RECEIVED".equals(action)){
            System.out.println("收到短信");

            Object objects[] = (Object[]) intent.getExtras().get("pdus"); //获取广播pdus数据 s:多条

            for (Object obj : objects) {
                SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) obj); //得到消息实例
                String address = smsMessage.getOriginatingAddress(); //发送者地址/号码
                String messagebody = smsMessage.getMessageBody();    //短信内容

                System.out.println("收到短信 "+address+":"+messagebody);
            }
        }
        else if("android.intent.action.PACKAGE_ADDED".equals(action)){
            System.out.println("安装应用:" + intent.getData());
        }
        else if("android.intent.action.PACKAGE_REMOVED".equals(action)){
            System.out.println("卸载应用:" + intent.getData());
        }
        else if("android.intent.action.BOOT_COMPLETED".equals(action)){
            System.out.println("重启手机调用");
            //手机重启 开启服务
            Intent intent1 = new Intent(context, MyService.class);
            context.startService(intent1);
            //开机启动
            Intent intent2 = new Intent(context,MainActivity.class);
            intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //在广播接受者开启界面需要任务栈标记
            context.startActivity(intent2);
        }
        else if("com.bz.mydisorderreceiver".equals(action)){ //自定义的无序广播
            Toast.makeText(context, intent.getStringExtra("name"), 1).show();
            //不可终止,不可修改
        }
        else if("com.bz.oreceiver".equals(action)){ //自定义的有序广播
            Toast.makeText(context, getResultData(), 1).show();
            setResultData("什么都没有");

            //有序广播:会根据清单文件定义的优先级一级一级的往下传 (优先级最大INTMAX)
            //abortBroadcast(); //终止广播,不继续传
        }
    }

}

动态注册的 ScreenReceiver.java

package com.bz.broadcastreceiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class ScreenReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        String action = intent.getAction();

        if(action.equals("android.intent.action.SCREEN_OFF")) System.out.println("屏幕关闭了");
        if(action.equals("android.intent.action.SCREEN_ON")) System.out.println("屏幕开启了");
    }
}




发广播


普通广播

//发广播 普通广播
public void DisorderReceiver(View v){
    Intent intent = new Intent();
    intent.setAction("com.bz.mydisorderreceiver");
    intent.putExtra("name", "每天晚上准时KEEP呀~");
    sendBroadcast(intent);  //发送无序广播
}

有序广播

//发广播 有序广播
public void DynamicReceiver(View v){
    Intent intent = new Intent();
    intent.setAction("com.bz.oreceiver");

    sendOrderedBroadcast(intent, null, new FinalReceiver(),    null, 1, "根据黑马视频教程制作", null);  //发送有序广播
    //                          接收权限,   最终的Receiver             初始码,     初始化数据,      额外数据

    //最终的Receiver,传到最后*肯定*会到这个最终Receiver (有特权,不需要在清单文件中配权 可以用来检测数据有没有在传输过程被修改,或查看最终数据) 
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值