Android 采用广播接收者拦截外拨电话及其特性

来源:互联网 发布:yy挂机软件 编辑:程序博客网 时间:2024/05/18 02:15

拦截外拨电话

向外拨打电话时系统化发出一个有序广播,虽然该广播最终会被拨号器里的广播接收者所接收并实现电话拨打,但我们可以在广播传递给拨号广播接收者之前先得到该广播,然后和清除传递给拨号广播接收者的电话号码,在拨号广播接收者接收到该广播时,由于电话号码为null,因此取消电话拨打。

public class PhoneBroadcastReceiver extends BroadcastReceiver {


@Override
public void onReceive(Context arg0, Intent arg1) {
// TODO Auto-generated method stub
//取得广播接收者的接收数据,即电话号码
String number = getResultData();
if("5556".equals(number)) {
setResultData(null);//清除电话号码,广播被传给系统的接收者后,因为电话为null,取消电话拨打。
}else {
//修改数据
number = "12593"+number;
//将修改后的电话号码设成新的电话号码
setResultData(number);
}
}


}

接收外拨电话Intent,在AndroidManifest.xml的<application>节点里订阅此Intent:

<receiver Android:name=".PhoneBroadcastReceiver">
            <intent-filter android:priority="1000">
                <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
            </intent-filter>
        </receiver>

并且要进行权限声明:

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


广播接收者的响应性

在Android中,每次广播消息到来时都会创建BroadcastReceiver实例并执行onReceive()方法,onReceive()方法执行完后,BroadcastReceiver的实例就会被销毁。当onReceive()方法在10秒内没有执行完毕,Android会认为该程序无响应。所以在BroadcastReceiver里不能做一些比较耗时的操作,否则会弹出ANR(Application No Response)错误对话框。如果需要完成比较耗时的工作,应该通过发送Intent给Seivice来完成。这里不能使用子线程来解决,因为BroadcastReceiver的生命周期很短,子线程可能还没有结束BroadcastReceiver就先结束了。BroadcastReceiver一旦结束,此时BroadcastReceiver所在的进程很容易在系统内需要内存时被优先杀死。因为它属于空进程(没有任何活动组件的进程)。如果它的所在进程被杀死,那么正在工作的子线程也会被杀死。所以采用子线程来解决是不可靠的

public class IncomingSMSReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context,Intent intent) {

//发送Intent启动服务,由服务来完成比较耗时的操作

Intent serivce = new Intent(context,XxxService.class);

context.startService(serivce );

}



广播接收者

除了短信到来广播Intent,Android还有很多广播Intent,如:开机启动、电池电量变化、时间已经改变等广播Intent。

接受电池电量变化广播Intent,在AndroidManifest.xml文件中的<application>节点里订阅此Intent:

<receiver android:name=".IncomingSMSReceiver">
            <intent-filter android:priority="1000">
                <action android:name="android.intent.action.BATTERY_CHANGED"/>
            </intent-filter>
        </receiver>

接收开机启动广播Intent,在AndroidManifest.xml文件中的<application>节点里订阅此Intent:

<receiver android:name=".IncomingSMSReceiver">
            <intent-filter android:priority="1000">
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>

并且要进行权限声明:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"

阅读全文
0 0