? 在android下,要想接受广播信息,那么这个广播接收器就得我们自己来实现了,我们可以继承BroadcastReceiver,就可以有一个广播接受器了。有个接受器还不够,我们还得重写BroadcastReceiver里面的onReceiver方法,当来广播的时候我们要干什么,这就要我们自己 来实现,不过我们可以搞一个信息防火墙。具体的代码: ??当实现了广播接收器,还要设置广播接收器接收广播信息的类型,这里是信息:android.provider.Telephony.SMS_RECEIVED ??我们就可以把广播接收器注册到系统里面,可以让系统知道我们有个广播接收器。这里有两种,一种是代码动态注册: 一种是在AndroidManifest.xml中配 置广播 ??两种注册类型的区别是: ?????1)第一种不是常驻型广播,也就是说广播跟随程序的生命周期。 ?????2)第二种是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。 BroadcastReceiver用于监听被广播的事件 必须被注册,有两种方法: 1、在应用程序的代码中注册 注册BroadcastReceiver: registerReceiver(receiver,filter); 取消注册BroadcastReceiver: unregisterReceiver(receiver); 当BroadcastReceiver更新UI,通常会使用这样的方法注册。启动Activity时候注册 BroadcastReceiver,Activity不可见时候,取消注册。 2、在androidmanifest.xml当中注册 <receiver> ????<intent-filter> ?????<action android:name = "android.intent.action.PICK"/> ????</intent-filter> </receiver> 使用这样的方法注册弊端:它会始终处于活动状态,毕竟是手机开发,cpu和电源资源比较少,一直处于活动耗费大,不利。在 Android 里面有各种各样的广播,比如电池的使用状态,电话的接收和短信的接收都会产生一个广播,应用程序开发者也可以监听这些广播并做出程序逻辑的处理。下面我画一张粗略的图来帮助大家理解广播的运行机制。
Android 中有各式各样的广播,各种广播在Android 系统中运行,当系统/应用程序运行时便会向 Android 注册各种广播,Android 接收到广播会便会判断哪种广播需要哪种事件,然后向不同需要事件的应用程序注册事件,不同的广播可能处理不同的事件也可能处理相同的广播事件,这时就需要Android 系统为我们做筛选。
案例分析:
一个经典的电话黑名单,首先通过将黑名单号码保存在数据库里面,当来电时,我们接收到来电广播并将黑名单号码与数据库中的某个数据做匹配,如果匹配的话则做出相应的处理,比如挂掉电话、比如静音等等。。。
?
Demo 分析:
下面通过一个小DEMO 来讲解一下广播在Android 中如何编写,在Demo中我们设置了一个按钮为按钮设置点击监听通过点击发送广播,在后台中接收到广播并打印LOG信息。代码如下:
?
????public?static?final?String?ACTION_INTENT_TEST?=?"com.terry.broadcast.test";
????
[email protected]
????public?void?onCreate(Bundle?savedInstanceState)?{
????????super.onCreate(savedInstanceState);
????????setContentView(R.layout.main);
????????Button?btn?=?(Button)?findViewById(R.id.Button01);
????????btn.setOnClickListener(new?OnClickListener()?{
[email protected]
????????????public?void?onClick(View?v)?{
????????????????//?TODO?Auto-generated?method?stub
????????????????Intent?intent?=?new?Intent(ACTION_INTENT_TEST);
????????????????sendBroadcast(intent);
????????????}
????????});
????}
}??接收器代码如下:?
?????
????public?myBroadCast()?{
????????Log.v("BROADCAST_TAG",?"myBroadCast");
????}
[email protected]
????public?void?onReceive(Context?context,?Intent?intent)?{
????????//?TODO?Auto-generated?method?stub
????????Log.v("BROADCAST_TAG",?"onReceive");
????}
}Android 广播的生命周期在上面的接收器中,继承了BroadcastReceiver 并重写了它的onReceive 并构造了一个函数,下面通过图片来一步一步认识 Android 广播的生命周期。当我点击一下按钮,它向Android 发送了一个广播,如下图:这时我们再点击一下按钮,它还是会再向 Android 系统发送广播,此时日志信息如下:下面本人画一张图像,描述了Android 中广播的生命周期,其次它并不像Activity 一样复杂,运行原理很简单如下图:下面来看一下SDK给出的解释:大意为:如果一个广播处理完onReceive 那么系统将认定此对象将不再是一个活动的对象,也就会finished掉它。至此,大家应该能明白 Android 的广播生命周期的原理,代码也不用多介绍,很简单的一个发送广播并处理广播的Demo。?Android 如何判断并筛选广播?前面说过 Android 的广播有各式各样,那么Android 系统是如何帮我们处理我们需要哪种广播并为我们提供相应的广播服务呢?这里有一点需要大家注意,每实现一个广播接收类必须在我们应用程序中的 manifest 中显式的注明哪一个类需要广播,并为其设置过滤器,如下图:Tip:action 代表一个要执行的动作,在Andriod 中有很action 比如 ACTION_VIEW,ACTION_EDIT
那么有些人会问了,如果我在一个广播接收器中要处理多个动作呢?那要如何去处 理?
小结:
??Android广播机制(两种注册方法)?
{???
??
[email protected]
????public?void?onReceive(Context?context,?Intent?intent)???
????{???
????????Bundle?bundle?=?intent.getExtras();???
????????Object[]?object?=?(Object[])bundle.get("pdus");???
????????SmsMessage?sms[]=new?SmsMessage[object.length];???
????????for(int?i=0;i<object.length;i++)???
????????{???
????????????sms[0]?=?SmsMessage.createFromPdu((byte[])object[i]);???
????????????Toast.makeText(context,?"来 自"+sms[i].getDisplayOriginatingAddress()+"?的消息是:"+sms[i].getDisplayMessageBody(),?Toast.LENGTH_SHORT).show();???
????????}???
????????//终止广播,在这里我们可以稍微处理,根据用户输入的号码可以实现短信防火墙。???
????????abortBroadcast();???
????}???
???????
}??
smsBroadCastReceiver?=?new?SmsBroadCastReceiver();???
//实例化过滤器并设置要过滤的广播???
//注册广播???
BroadCastReceiverActivity.this.registerReceiver(smsBroadCastReceiver,?intentFilter);??
<manifest?xmlns:android="http://schemas.android.com/apk/res/android"??
??????package="spl.broadCastReceiver"??
??????android:versionCode="1"??
??????android:versionName="1.0">??
????<application?android:icon="@drawable/icon"?android:label="@string/app_name">??
????????<activity?android:name=".BroadCastReceiverActivity"??
??????????????????android:label="@string/app_name">??
????????????<intent-filter>??
????????????????<action?android:name="android.intent.action.MAIN"?/>??
????????????????<category?android:name="android.intent.category.LAUNCHER"?/>??
????????????</intent-filter>??
????????</activity>??
???????????
????????<!--广播注册-->??
????????<receiver?android:name=".SmsBroadCastReceiver">??
????????????<intent-filter?android:priority="20">??
????????????????<action?android:name="android.provider.Telephony.SMS_RECEIVED"/>??
????????????</intent-filter>??
????????</receiver>??
???????????
????</application>??
???????
????<uses-sdk?android:minSdkVersion="7"?/>??
???????
????<!--?权限申请?-->??
????<uses-permission?android:name="android.permission.RECEIVE_SMS"></uses-permission>??
???????
</manifest>???
详细解决方案
??Android广播机制(两种注册方法)?
热度:6 发布时间:2016-05-01 13:50:37.0
BroadCastActivity 页面代码
public?class?BroadCastActivity?extends?Activity?{
public?class?myBroadCast?extends?BroadcastReceiver?{
在Android 的接收器中onReceive 以经为我们想到的,同样的你必须在Intent-filter 里面注册该动作,可以是系统的广播动作也可以是自己需要的广播,之后你之需要在onReceive 方法中,通过intent.getAction()判断传进来的动作即可做出不同的处理,不同的动作。具体大家可以去尝试测试一下。
public?class?SmsBroadCastReceiver?extends?BroadcastReceiver????
//生成广播处理???
IntentFilter intentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");?
<?xml?version="1.0"?encoding="utf-8"?>??
相关解决方案
- android 读取byte[]中的元素解决方案
- android 标题栏兑现方式
- android 中Activity向BroadcastReceiver发送数据,该怎么解决
- Android 4.0 为什么模拟器老是提示小弟我谷歌拼音输入法已停止
- android:getSharedPreferences() 这是哪个类的方法解决思路
- android 怎么判断一个程序是否联网
- android 大量数据按周分组,该如何解决
- android RadioButton如何设置默认选中
- ksoap2-android-这个包,连接webService怎么设置超时
- android 怎么重新设置锚点
- android UI界面设计解决方案
- android 图片对象获取的有关问题
- android 怎么调用淘宝支付宝接口
- Android 沿袭InputMethodService自定义输入法
- android 关于服务连接的疑义
- android 两个activity如何通信
- android 怎么实现对view的放大和缩小
- android 教程解决方法
- android ID,该如何处理
- 准备复习2-3个月,看java+android,请问有经验者,怎么看效果最好》
- android UI线程与AsyncTask的有关问题
- android(java)中的java.net能不能和c#的system.net.sockets进行tcp通信,该如何解决
- android ListView 中的onItemClick Intent 没法跳转
- android(java) 中文乱码的有关问题
- c#c++,android,ios(iphone),php,java视屏课程 散分
- android Post文件到ASP.NET的有关问题,能收到参数收不到文件
- RIM 替 Android 开发者提供免费的 PlayBook!2月13日前
- android 动态设立控件高度
- Android test project 编译方法
- android -相机使用教程(1)解决方法