Android: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"?>
android:versionCode="1"
android:versionName="1.0">
可以指定明确的接受者,这样终止这个命令就不好使了
EditText有一个属性:android:inputType设置只能输入什么东西,比如phone、email
除了短信到来广播Intent,Android还有很多广播Intent,如:开机启动、电池电量变化、时间已经改变等广播Intent。
l 接收电池电量变化广播 Intent ,在 AndroidManifest.xml 文件中的 节点里订阅此 Intent:
android:name="android.intent.action.BATTERY_CHANGED"/>
l 接收开机启动广播 Intent ,在 AndroidManifest.xml 文件中的 节点里订阅此 Intent:
android:name="android.intent.action.BOOT_COMPLETED"/>
并且要进行权限声明:
在Android中,程序的响应(Responsive)被活动管理器(ActivityManager)和窗口管理器(Window Manager)这两个系统服务所监视。当BroadcastReceiver在10秒内没有执行完毕,Android会认为该程序无响应。所以在BroadcastReceiver里不能做一些比较耗时的操作,否侧会弹出ANR(Application No Response)的对话框。如果需要完成一项比较耗时的工作,应该通过发送Intent给Service,由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 () 方法。更多相关文章
- Android 子线程请求ASP.NET后台
- 【Android】使用Binder池减少Service进程数
- Android 使用AIDL实现守护进程
- android之UI线程处理
- Android安全模型之Android安全机制(进程沙箱)
- android之多线程
- Android 中的线程
- 浅析android线程模型【Android】
- Android底下多线程下载远程图片