Android -- 怎么发出和接收广播, Broadcast, 电话拨号拦截,短信拦截

android的广播机制中存在这三种不同的广播类型:
普通广播(Normalbroadcasts)
发送一个广播,所以监听该广播的广播接收者都可以监听到改广播。
异步广播
当处理完之后的Intent,依然存在,这时候registerReceiver(BroadcastReceiver,IntentFilter) 还能收到他的值,直到你把它去掉,不能将处理结果传给下一个接收者,无法终止广播.
有序广播(Orderedbroadcasts)
按照接收者的优先级顺序接收广播,优先级别在intent-filter中的priority中声明,-1000
1000之间,值越大,优先级越高.可以终止广播意图的继续传播.接收者可以篡改内容.

普通广播的发送和接收:
sendBroadcast(intent);

[mw_shl_code=java,true]< receiver android:name = ".MyBroadcastReceiver" >
           < intent-filter android:priority = "1000" >
             
< action android:name = "cn.lenovo.yangguangfu" />
</ intent-filter >
</ receiver >
[/mw_shl_code]
1,他决定该广播的级别,级别数值是在-10001000之间,值越大,优先级越高;
2,同级别接收是先后是随机的;级别低的收到广播;
3,在android系统中只要监听该广播的接收者,都能够收到sendBroadcast(intent)发出的广播;
4,不能截断广播的继续传播,
5,实验现象,在这个方法发来的广播中,代码注册方式中,收到的广播的先后和注明优先级最高的他们的先后是随机。如果都没有优先级,代码注册收到为最先。
   
有序广播的发送和接收:
sendOrderedBroadcast(intent,receiverPermission);
sendOrderedBroadcast(intent,receiverPermission, resultReceiver,
       scheduler,initialCode, initialData, initialExtras)
receiverPermission这是权限,一个接收器必须持以接收您的广播。如果为null,不经许可的要求。 
resultReceiver
您自己BroadcastReceiver来当作最后的广播接收器。 
调度自定义处理程序,用以安排resultReceiver回调;如果为null将语境中的主线程举行。 
initialCode
一种结果代码的初始值。通常为Activity.RESULT_OK。这个值是-1;为其他int型也可以,如0,1,2; 
initialData
一种结果数据的初始值。通常情况下为空,String类型;
initialExtras
一种结果额外的初始值。通常情况下为空,Bundle;
1,  该广播的级别有级别之分,级别数值是在-10001000之间,值越大,优先级越高;
2,  同级别接收是先后是随机的,再到级别低的收到广播;
3,  同级别接收是先后是随机的,如果先接收到的把广播截断了,同级别的例外的接收者是无法收到该广播的。(abortBroadcast()
4,能截断广播的继续传播,高级别的广播收到该广播后,可以决定把该钟广播是否截断掉。
5,实验现象,在这个方法发来的广播中,代码注册方式中,收到广播先后次序为:注明优先级的、代码注册的、没有优先级的;如果都没有优先级,代码注册收到为最先。


异步广播的发送和接收:
sendStickyBroadcast(intent);
当处理完之后的Intent,依然存在,直到你把它去掉。
发这个广播需要权限<uses-permissionandroid:name="android.permission.BROADCAST_STICKY" />
去掉是用这个方法removeStickyBroadcast(intent);但别忘了在执行这个方法的应用里面AndroidManifest.xml同样要加上面的权限;
sendStickyOrderedBroadcast(intent,resultReceiver, scheduler,
       initialCode,initialData, initialExtras)
这个方法具有有序广播的特性也有异步广播的特性;
发送这个广播要:<uses-permissionandroid:name="android.permission.BROADCAST_STICKY" />这个权限。才能使用这个方法。如果您并不拥有该权限,将抛出SecurityException的。
实验现象(sendStickyOrderedBroadcast()中),在这个方法发来的广播中,代码注册方式中,收到广播先后次序为:注明优先级的、代码注册的、没有优先级的;如果都没有优先级,代码注册收到为最先。


1. 发送广播

使用以下三个API可以发送广播

public void click(View view){
		Intent intent = new Intent();
		intent.setAction("com.itheima.xxxooo");
		//把这个自定义的广播发送出去
		//sendBroadcast(intent); //发送一条无序的广播事件
		//如果广播事件是无序发送出去的 所有的广播接受者 都会接受到这个事件
		
		//如果广播是有序的发送出去的, 广播接收者会按照优先级 接受到广播事件
		// 有序广播 特点: 高优先级的广播接受者 可以终止掉 广播事件
		//sendOrderedBroadcast(intent, null);
		
		//第三个参数设置, 无论此接受者的优先级有多低,或是其他中断了广播,他最后都能接收到
		sendOrderedBroadcast(intent, null, new FinalRecevier(), null, 0, null, null);
	}

2. 接收广播,继承BroadCastReceiver, 需要在xml权限中注册接收器, 并且有些广播需要添加权限

onReceive 其实是在主线程中执行,所以如果有UI更新可以直接做, 但是如果是耗时操作则要考虑开新线程

public class MyBroadcastReceiver extends BroadcastReceiver {
	@Override
	public void onReceive(Context context, Intent intent) {
		System.out.println("reveriver 1 接收到了广播");
		Toast.makeText(context, "检查到了 自定义的广播事件", 1).show();
	}	
}
AndroidManifest.xml 注册接受者  可以设置优先级  int, 值越大 优先级越高
<receiver android:name=".MyBroadcastReceiver" >
            <intent-filter android:priority="1000">
                <action android:name="com.kevin.xxxooo" >
                </action>
            </intent-filter>
        </receiver>
        <receiver android:name=".MyBroadcastReceiver2" >
            <intent-filter android:priority="1000">
                <action android:name="com.kevin.xxxooo" >
                </action>
            </intent-filter>
        </receiver>
        <receiver android:name=".MyBroadcastReceiver3" >
            <intent-filter android:priority="1000">
                <action android:name="com.kevin.xxxooo" >
                </action>
            </intent-filter>
        </receiver>

广播接收者的注册可以在xml文件中, 也可以在代码中注册(一般在 onCreate这样的开始创建的方法中注册) 

MyBroadcastReceiver  myReceiver = new MyBroadcastReceiver ();
IntentFilter filter = new IntentFilter();
filter.addAction("com.kevin.xxxooo");
registerReceiver(myReceiver, filter);


3. 示例:拦截电话拨号

public class OutCallReceiver extends BroadcastReceiver {

	//当有广播事件产生的时候 就会执行onrecevie方法
	@Override
	public void onReceive(Context context, Intent intent) {
		System.out.println("onreceiver 发现了新的外拨电话...");
		String number = getResultData();//外拨的电话号码
		System.out.println("number="+number);
		//替换掉这个号码
		
		SharedPreferences sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);
		String ipnumber = sp.getString("ipnumber", "");
		String newnumber = ipnumber+number;
		//设置外拨的电话号码
		setResultData(newnumber);
		//不会生效的 广播终止不了 显示的指定了接受者
		abortBroadcast();		
	}
}

AndroidManifest.xml  需要设置权限 和 注册广播接收者

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.itheima.ipdail"
    android:versionCode="1"
    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.ipdail.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>
		<!-- 定义了一个广播接受者  new出来了一个收音机   ,设置action 就相当于设置了监听的频道 -->
        <receiver android:name=".OutCallReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
            </intent-filter>
        </receiver>
    </application>

</manifest>

 

4.示例: 短信拦截

public class SmsReceiver extends BroadcastReceiver {
	@Override
	public void onReceive(Context context, Intent intent) {
		System.out.println("短信收到了...");

		Object[] pdus = (Object[]) intent.getExtras().get("pdus");
		for (Object pdu : pdus) {
			SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdu);
			String body = smsMessage.getMessageBody();
			String sender = smsMessage.getOriginatingAddress();
			System.out.println("body:" + body);
			System.out.println("sender:" + sender);
			if ("5556".equals(sender)) {
				// 短信的拦截, 高优先级的receiver将短信拦截,低优先级的就接受不到了
				abortBroadcast();
				SmsManager smsManager = SmsManager.getDefault();
				smsManager.sendTextMessage(sender, null, "我已经喜欢上 xxx了 ,你去死吧", null, null);
			}

		}
	}
}

AndroidManifest.xml 权限配置

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.itheima.smslistener"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.SEND_SMS" />

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

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name=".SmsReceiver" >
            <intent-filter android:priority="1000" >
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>
    </application>

</manifest>




 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值