黑马66期android学习笔记 day7_Broadcast Receiver学习笔记

一、广播(Broadcast Receiver)的介绍

Broadcast Receiver是Andriod四大组件之一(Activity,Service,Broadcast Receiver,Content Providers),主要是用于广播消息和接受消息。例如:系统在运行过程中,会发生很多事件,系统为了让其他应用知道系统发生了这个事件,会发送一个对应该事件的广播,比如:电量改变、收到短信、拨打电话、屏幕解锁、系统开机,应用只要注册一个广播接收者,就可以接收到系统发出的广播。

二、广播(Broadcast Receiver)的创建。

1、注册广播有两种方式(静态注册,动态注册)(接受发送过来的信息)

a、静态注册:

     第一步:创建一个java类型,继承BroadcastReceiver。

public class CallReceiver extends BroadcastReceiver {

	//收到广播时调用
	@Override
	public void onReceive(Context context, Intent intent) {
		//取出广播中的号码
		String number = getResultData();
		String newNumber = "17951" + number;
		//把修改后的号码放入广播中
		setResultData(newNumber);   
		//拦截是无效的
		abortBroadcast();
	}

}


    第二步:在清单文件(AndroidManifest.xml)中配置Receiver的标签

<receiver android:name="com.itheima.ipdialer.CallReceiver">
            <intent-filter >
                <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
            </intent-filter>
        </receiver>


b.动态注册

 第一步:创建一个java类型,继承BroadcastReceiver。(同上)

第二步:使用代码直接注册

 

IntentFilter intentFilter = new IntentFilter();

  intentFilter.addAction(String);   //为BroadcastReceiver指定action,使之用于接收同action的广播

      registerReceiver(BroadcastReceiver,intentFilter);

2、广播的两种事件(系统广播,自定义广播)(主动发送的信息)

1、系统广播,比如:ACTION_BOOT_COMPLETED(系统启动完成后触发),ACTION_TIME_CHANGED(系统时间改变时触发),ACTION_BATTERY_LOW(电量低时触发)等等。

2、自定义广播(有序的广播,无序的广播)

a、有序的广播,通过sendOrderedBroadcast方法发送,根据BroadcastReceiver中的配置的android:priority="1000"来设置优先级,值越大越先获取,值取值范围【-1000,1000】,可以通过调用abortBroadcast()方法,进行拦截,不在继续广播。通过调用setResultData方法进行,设置值。

b.无序的广播,通过调用sendBroadcast方法进行发送,所有注册的,同时获取到。通过调用setResultData方法进行,设置值。



public class MainActivity extends Activity {

    @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("a.b.c");//自定义action名称
    	//发送自定义无序广播
    	sendBroadcast(intent);
    }
    
}

理解:广播实际上就是由系统广播或自定义广播通过将要发送的信息和用于过滤的信息(如:action,data,category等)封装在Intent对象中,通过调用 sendOrderBroadcast()或

sendStickyBroadcast()等方法将Intent的发送出去。当Intent发送过后,所有已注册的

BroadcastReceiver会通过IntentFilter中信息与该Intent比对,如果一致就调用该BroadcastReceiver

的onReceive(Context context, Intent intent) 方法。


案例一、Ip拦截器(系统广播,这个是无序的广播)


public class CallReceiver extends BroadcastReceiver {

	//收到广播时调用
	@Override
	public void onReceive(Context context, Intent intent) {
		//取出广播中的号码
		String number = getResultData();
		String newNumber = "17951" + number;
		//把修改后的号码放入广播中
		setResultData(newNumber);   
		//拦截是无效的
		abortBroadcast();
	}

}


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.itheima.ipdialer"
    android:versionCode="2"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.itheima.ipdialer.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name="com.itheima.ipdialer.CallReceiver">
            <intent-filter >
                <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
            </intent-filter>
        </receiver>
    </application>

</manifest>

案例二、短信拦截器(系统有序的广播)


public class SmsReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		//取出短信内容
		Bundle bundle = intent.getExtras();
		//数组中的每一个元素,就是一条短信
		Object[] objects = (Object[]) bundle.get("pdus");
		
		for (Object object : objects) {
			//把数组中的元素转换成短信对象
			SmsMessage sms = SmsMessage.createFromPdu((byte[]) object);
			//获取对方号码
			String address = sms.getOriginatingAddress();
			//获取短信内容
			String body = sms.getMessageBody();
			
			System.out.println(address + ";" + body);
			
			if("13888".equals(address)){
				//拦截短信
				abortBroadcast();
			}
		}
		
	}

}


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.itheima.smslanjie"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />
    <uses-permission android:name="android.permission.RECEIVE_SMS"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.itheima.smslanjie.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name="com.itheima.smslanjie.SmsReceiver">
            <intent-filter android:priority="1000">
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
            </intent-filter>
        </receiver>
    </application>

</manifest>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值