广播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中,还要把写好的广播加入到这里边。
广播BroadcastReceiver(2)的更多相关文章
- Android 广播 BroadcastReceiver
Android 系统里定义了各种各样的广播,如电池的使用状态,电话的接收和短信的接收,开机启动都会产生一个广播.当然用户也可以自定义自己的广播. 既然说到广播,那么必定有一个广播发送者,以及广播接收器 ...
- Android广播BroadcastReceiver 二
BroadcastReceiver: 在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制.而BroadcastReceiver是对发送出来的 Broadcast进行过滤 ...
- Android广播BroadcastReceiver 一
Android 系统里定义了各种各样的广播,如电池的使用状态,电话的接收和短信的接收,开机启动都会产生一个广播.当然用户也可以自定义自己的广播. 既然说到广播,那么必定有一个广播发送者,以及广播接收器 ...
- 发送广播BroadcastReceiver
import android.os.Bundle;import android.app.Activity;import android.content.Intent;import android.vi ...
- 使用广播-BroadcastReceiver最详细解析
女孩:BroadcastReceiver是什么呀? 男孩:Broadcast是广播的意思,在Android中应用程序之间的传输信息的机制,BroadcastReceiver是接收广播通知的组件,广播和 ...
- Android数据传递,使用广播BroadcastReceiver;
Android数据传递有很多种,Intent意图传递或使用Bundle去传递,接口监听回调传递数据,也可以把数据保存起来,使用的时候去读取等等等...,"当你知道足够多的数据传递的方式之后, ...
- Android广播BroadcastReceiver
Android 系统里定义了各种各样的广播,如电池的使用状态,电话的接收和短信的接收,开机启动都会产生一个广播.当然用户也可以自定义自己的广播. 既然说到广播,那么必定有一个广播发送者,以及广播接收器 ...
- 接收广播BroadcastReceiver
Broadcast Receiver用于接收并处理广播通知(broadcast announcements).多数的广播是系统发起的,如地域变换.电量不足.来电来信等.程序也可以播放一个广播.程序可以 ...
- 035 Android 广播(BroadCastReceiver)
1.介绍 2.实现方法 3.注册广播 (1)静态广播 在AndroidManifest.xml文件中注册广播 <intent-filter>为过滤器 <receiver androi ...
随机推荐
- 从WAVE头文件里获取压缩方式
在解析WAV文件时.会从头文件里读取TAG值,表示当前文件的压缩格式,如该值为1,表示没有压缩,其他表示不同的压缩方式. 如当中为6时,表示压缩方式是alaw 列表例如以下: TAG值 音频描写叙述 ...
- TOMCAT虚拟路径配置
在tomcat安装好后,只要把你的web项目copy到%TOMCAT_HOME%webapp下面就可以是使用啦!!其实还有种方法就是设定虚拟目录,即把项目的目录映射到tomcat中.这样做即可以不用重 ...
- poj--1236--Network of Schools(scc+缩点)
Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 14062 Accepted: 56 ...
- linux系统oracle服务自启动
终于知道为什么自启动脚本一直无法成功执行,原来都是空格不对惹的祸.具体步骤说明如下: 1.修改dbstart和dbshut脚本 dbstart脚本默认值启动oracle服务,不启动监听服务,如果想在启 ...
- electron-vue中使用iview 报错this. is readonly的解决办法
title: electron-vue中使用iview 报错this. is readonly的解决办法 toc: false date: 2019-02-12 19:33:28 categories ...
- sdwebimage缓存图片
当使用SDWebImage时,如果用相同图片名的图片替换掉了原始缓存的图片,当再次请求的时候,还是使用的缓存图片,图片不会发生改变 原因:图片在NSCache中是以absolute url作为key存 ...
- 网易NAPM Andorid SDK实现原理--转
原文地址:https://neyoufan.github.io/2017/03/10/android/NAPM%20Android%20SDK/ NAPM 是网易的应用性能管理平台,采用非侵入的方式获 ...
- line-height与间距总总
一点说明(个人吐槽,可以略过) 之所以想写这篇文章,是因为自己工作的经验总结.以前的页面编写极度不注重间距大小,特别是行级元素间距.认为只要差不多好就行了,没必要花那么大的精力去抠几px的小细节.事实 ...
- DB2导出表结构、表数据小结
一.DB2命令行导出数据库全库表结构 ① Win+R进入到DB2安装目录的BIN目录下,执行命令:DB2CMD,进入到DB2 CLP窗口. 命令:DB2CMD ② 创建一个data文件夹 命令:MKD ...
- iOS系统结构
应用交互层.多媒体层.核心服务层.系统层. 参考官方文档apple Develop GuidesiOS Technologies IOS分为四级结构,由上到下为可触摸层,媒体层,核心服务层,核心系统层 ...