Android:BroadcastReceiver:采用广播接收者拦截外拔电话、发送广播、其他常用广播、特性

77 篇文章 0 订阅
public class PhoneBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String number = getResultData();
        if("5556".equals(number)){
            setResultData(null);//清除电话号码,不能拨打电话
        }else{
            number = "12593"+ number;
            setResultData(number);//修改电话
        }
    }

}




<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="cn.itcast.smslistener"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <receiver android:name=".SMSBroadcastReceiver">
            <intent-filter android:priority="1000">
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
            </intent-filter>
        </receiver>
        <receiver android:name=".PhoneBroadcastReceiver">
            <intent-filter android:priority="1000">
                <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
            </intent-filter>
        </receiver>
    </application>
    <uses-sdk android:minSdkVersion="8" />

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

</manifest>


可以指定明确的接受者,这样终止这个命令就不好使了


EditText有一个属性:android:inputType设置只能输入什么东西,比如phoneemail



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

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

<receiver android:name=".IncomingSMSReceiver">

   <intent-filter>

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

   </intent-filter>

</receiver>

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

<receiver android:name=".IncomingSMSReceiver">

   <intent-filter>

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

   </intent-filter>

</receiver>

并且要进行权限声明:

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





Android中,程序的响应(Responsive)被活动管理器(ActivityManager)和窗口管理器(Window Manager)这两个系统服务所监视。当BroadcastReceiver10秒内没有执行完毕,Android会认为该程序无响应。所以在BroadcastReceiver里不能做一些比较耗时的操作,否侧会弹出ANRApplication No Response)的对话框。如果需要完成一项比较耗时的工作,应该通过发送IntentService,由Service来完成。而不是使用子线程的方法来解决,因为BroadcastReceiver的生命周期很短(在onReceive()执行后BroadcastReceiver的实例就会被销毁),子线程可能还没有结束它就先结束了。当然如果BroadcastReceiver结束了,它的宿主进程还在运行,子线程还会继续执行。但宿主进程此时很容易在系统需要内存时被优先杀死,因为它属于空进程(没有任何活动组件的进程)。

public class IncomingSMSReceiver extends BroadcastReceiver {

  @Override public void onReceive(Context context, Intent intent) {

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

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

            context.startService(service);

  }

}

每次广播消息到来时都会创建 BroadcastReceiver 实例并执行 onReceive () 方法。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值