广播BroadcastReceiver(2)

有序广播的优先级:

发送有序广播的方法有:

public void sendOrderedBroadcast(Intent intent,String receiverPermission)

在接收有序广播时,可以自己为接收者指定优先级:

静态注册广播接收者时,在AndroidMainfest.xml文件中为<receiver>的<intent-filter>节点配置

android:priority属性;

动态注册广播接收者时,调用IntentFilter对象的setPriority()方法;

有序广播的优先级:

优先级属性值越大,则优先级越高;

优先级属性相同时,动态注册的广播接收者优先级高于静态注册的广播接收者;

同为静态/动态注册的广播接收者,且优先级相同时,越早注册的优先级越高;

同为静态注册的广播接收者,且优先级相同,但归属于不同的应用程序时,

按系统加载应用程序的先后顺序确定优先级(通常表现为按应用程序的包名排序);

始终接收广播的方法:

某些应用程序可能需要始终接收特定的广播,例如手机管理类软件,则需要始终接收主叫、

来电、短信等广播,为了正常接收到这些广播,且让自己的应用程序处于高优先级,通常会:

使用一个静态注册的广播接收者,接收开机广播;

接收到开机广播后,启动一个Service在后台运行;

在后台运行的Service中,动态的广播接收者,接收业务所需的广播。

有序广播的传递

中止有序广播

在广播接收者中,调用abortBroadcast()则可以中止有序广播的继续传递,

即优先级更低的BroadcastReceiver将不会收到该广播;

需要注意的是:使用该方法仅能用于接收有序广播,如果接收普通广播时调用

该方法则会导致程序异常!

在广播接收者们之间传递数据:

在有序广播的传递过程中,可以调用setResultXXX()系列方法设置数据,

例如:setResultData()、setResultExtras()等,并使用getResultXXX()系列方法获取这些数据;

管理呼出电话

呼出电话的广播为:

android.intent.action.NEW_OUTGOING_CALL

对呼出电话的管理的原理:

呼出电话是从拨号到呼叫的过程,当呼出电话时,系统会发出呼叫电话的有序广播,并且将需要呼叫的电话号码

使用setResultData()进行传递,处理程序接收到该广播后执行呼叫。

处理呼叫的程序接收该广播的优先级较低,因此,自定义广播接收者,

在接收到呼出电话的广播后,修改setResult()传递的电话号码,即可实现对呼出电话的管理。

对呼出的电话进行操作的实例:

Activity不用修改,默认状态即可,

这里只给出广播:

package com.example.chargecall;

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

public class OutReceiver extends BroadcastReceiver{

	@Override
	public void onReceive(Context context, Intent intent) {
		// 修改呼出的电话号码:
		/*可以对电话号码进行多种操作,如果想要禁止呼出的电话号码,可以直接设置为空值
		 *
		 * */
		String number = getResultData();
		number = "12345" + number;
		setResultData(number);

	}

}

在AndroidMainfest.xml中添加权限跟receiver:

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

<receiver android:name="com.example.chargecall.OutReceiver" >

<intent-filter>

<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>

</intent-filter>

</receiver>

对呼入的电话进行拦截:

拦截呼入电话的实现原理:

当存在呼入电话时,系统发出如下广播:

android.intent.action.PHONE_STATE

TeleohyManager是电话管理器,为其配置PhoneStateListener即可监听相关状态(响铃、通话、空闲),且

该监听器的会调方法中可获取来电号码;

调用ITelephony接口定义的boolean endCall()方法即可挂断电话,通过TelephonyManager的getTelephony()

方法即可获得ITelephony接口的对象。

对呼入的电话进行操作的实例:

同样的,主界面使用默认的即可,

给出广播:

package com.example.interceptcall;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import com.android.internal.telephony.ITelephony;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.RemoteException;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;

public class PhoneStateReceiver extends BroadcastReceiver {
	TelephonyManager manager;

	@Override
	public void onReceive(Context context, Intent intent) {
		manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
		PhoneStateListener listener = new InnerPhoneStateListener();
		int events = PhoneStateListener.LISTEN_CALL_STATE;
		manager.listen(listener, events);

	}

	private ITelephony getITelephony(){
		ITelephony iTelephony = null;
		Method method = null;
		try {
			method = TelephonyManager.class.getDeclaredMethod("getITelephony", (Class[])null);
		    method.setAccessible(true);
		    iTelephony =  (ITelephony) method.invoke(manager, null);
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
		return iTelephony;
	}
	private class InnerPhoneStateListener extends PhoneStateListener{

		@Override
		public void onCallStateChanged(int state, String incomingNumber) {
			// TODO Auto-generated method stub
			switch (state) {
			case TelephonyManager.CALL_STATE_IDLE://空闲状态

				break;
			case TelephonyManager.CALL_STATE_OFFHOOK://通话状态

				break;
			case TelephonyManager.CALL_STATE_RINGING://响铃状态
				   if("15539187816".equals(incomingNumber)){//挂断电话
					   try {
						getITelephony().endCall();
					} catch (RemoteException e) {
						e.printStackTrace();
					}
				   }
				break;

			}
			super.onCallStateChanged(state, incomingNumber);
		}

	}
}

由于不能识别ITelephony,还需要自定义aidl接口,这样才可以,

ITelephony:

package com.android.internal.telephony;

interface ITelephony {
      boolean endCall();
}

注意包名要使用这里边的包名,

同样,要把权限加到AndroidMainfest.xml中,还要把写好的广播添加到这里边。

时间: 2024-08-23 21:08:03

广播BroadcastReceiver(2)的相关文章

Android广播BroadcastReceiver

Android广播BroadcastReceiver Android 系统里定义了各种各样的广播,如电池的使用状态,电话的接收和短信的接收,开机启动都会产生一个广播.当然用户也可以自定义自己的广播. 既然说到广播,那么必定有一个广播发送者,以及广播接收器.系统广播的发送者为系统,自定义广播当然是用户定义的了. 我们可以定义一个广播接收器,用来接收我们感兴趣的广播,不论是系统广播还是用户自定义广播.这个广播接收器必须继承至BroadcastReceiver. 老规矩,先来点基础知识. 一.基础知识

接收广播BroadcastReceiver

Broadcast Receiver用于接收并处理广播通知(broadcast announcements).多数的广播是系统发起的,如地域变换.电量不足.来电来信等.程序也可以播放一个广播.程序可以有任意数量的 broadcast receivers来响应它觉得重要的通知.broadcast receiver可以通过多种方式通知用户:启动activity.使用NotificationManager.开启背景灯.振动设备.播放声音等,最 典型的是在状态栏显示一个图标,这样用户就可以点它打开看通知

Android中 广播BroadcastReceiver

一.IP拨号器 activity_main.xml文件: 只有一个输入ip的文本框和一个保存按钮, <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_h

Android笔记(二十六) Android中的广播——BroadcastReceiver

什么是广播? 为了方便进行系统级别的消息通知,Android有一套类似广播的消息机制,每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接收自己所关心的广播内容,这些广播可能是来自于系统,也可能是来自于其他程序. 广播可以分为两种类型:有序广播和标准广播 标准广播是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因为它们之间没有任何先后顺序可言,这种广播的效率会比较高,但同时也意味着它是无法被截断的 如上图所示,每个人都代表一个广播接收器

发送广播BroadcastReceiver

import android.os.Bundle;import android.app.Activity;import android.content.Intent;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button; public class BroadcastMain extends Activity {

Android四大组件——BroadcastReceiver普通广播、有序广播、拦截广播、本地广播、Sticky广播、系统广播

BroadcastReceiver普通广播.有序广播.拦截广播.本地广播.Sticky广播.系统广播 本篇文章包括以下内容: 前言 BroadcastReceiver的简介 普通广播(自定义广播) 有序广播 拦截广播 本地广播 Sticky广播 系统广播 部分源码下载 前言 又是一篇基础总结性的文章来啦,个人强迫症犯了,非得把博客的四大组件模块给补齐了,总结了一下BoradcastReceiver的各种使用,废话不多说,开车啦.博主建议自己敲一遍代码来理解广播,因为里面有很多细节的东西需要注意,

Android基础笔记(九)- 广播

广播的概念 案例-监听短信到来并解析短信内容 案例-拦截外拨电话并设置区号 案例-SD卡状态监听 介绍一些常用的广播 发送自定义广播 有序广播和无序广播 启程!!! 广播的概念 广播的种类: 无序广播(Normal broadcasts),类似于日常使用的WIFI,由一个广播者发出信号,可以有很多接收者同时接收,并且信号无法被中断和篡改: 有序广播(Ordered broadcasts),可以有最终的接收者,并存在信号接收的优先级: 定义广播接收者的步骤: ①定义一个类,继承BroadcastR

Android 广播、服务、数据库、通知、包原理及描述

简介 在Android中运用了很多机制,例如:广播.服务.数据库.通知.包--等等.        什么是广播?Broadcast是一种广泛运用的在应用程序之间传输信息的机制.类似广播电台,根据特定频率来接收发送. 什么是服务?Service是android 系统中的四大组件之一,它跟Activity级别一样,但不能自己运行只能后台运行,并且可以和其他组件进行交互.使用场合例如:后台音乐播放器.         使用了什么数据库?在android中使用了开源项目sqlite操作数据. SQLit

基础篇:4.熟练掌握BroadcastReceiver的接收和使用

1.广播 既然要谈论到广播接收器,那必然先要来谈谈广播,毕竟两者相辅相成.在Android系统中有各种各样的广播如常见的:电池的使用状态.电话的接听.短信的接收等.应用开发者也可以在程序中发送出各种广播.那么广播到底是个什么东西?!---广播是一种广泛运用在应用程序之间传输信息的机制.广播的发送可以通过以下两种方式发送: (1)Context.sendBroadcast---广播无序事件,理论上,所有的接收者同时接收到广播. (2)Context.sendOrderedBroadcast---广