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

来源:互联网 发布:手机淘宝链接在哪里 编辑:程序博客网 时间:2024/05/01 13:28
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 extendsBroadcastReceiver {

  @Override public void onReceive(Context context, Intentintent) {

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

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

            context.startService(service);

  }

}

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


0 0