广播接收器—Broadcast Receiver(一)

来源:互联网 发布:seo的优化 编辑:程序博客网 时间:2024/05/01 11:46

广播接收器是android 应用程序的四大组件之一。但我来理解,还是很容易就理解的,就像是现场搞个活动抽奖一样,既然是要抽奖,首先第一步就要给抽奖的人发放数字编号(相当于注册接收器),然后再把这些相同的编号放到一个纸箱子里面,在没有抽之前,谁也不到会抽到哪个号,接下来主持人会抽出第一个号码,第二个,第三个……下面的人一定得和主持人抽到的号码一样才能中奖,抽到一样的号码就是重点,对号入座啊,中奖之后就随便由中奖者处置这个奖品了。这就像我发送一条广播到android系统,只有和这条信息相对应的接收器才能接收,比如接收一条短信,必须指定一个广播动作才能接收,对号入座嘛,然后就可以在onReceive 这个方法中实现自己想要干的事情了。

我解释的可能不好,看到的觉得不好请原谅哈,本人表达能力不是特别好。

下面就来写个短信拦截的例子

第一步:注册广播接收器

注册接收器有两种方法,一种是在manifest.xml文件中注册,另一种用java代码注册。

在manifest 中注册

    <receiver             android:name=".TestRecevier">            <intent-filter>                <action android:name="android.intent.action.EDIT"/>                </intent-filter>        </receiver>

package mobile.android.register.receiver;import android.app.Activity;import android.content.IntentFilter;import android.os.Bundle;import android.view.View;import android.widget.Toast;public class Main extends Activity{private ShortMessageReceiver shortMessageReceiver;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);shortMessageReceiver = new ShortMessageReceiver();} public void onClick_Register_Broadcast(View view){ registerReceiver(shortMessageReceiver, new IntentFilter( "android.provider.Telephony.SMS_RECEIVED"));Toast.makeText(this, "注册成功", Toast.LENGTH_LONG).show();}public void onClick_Unregister_Broadcast(View view){unregisterReceiver(shortMessageReceiver);Toast.makeText(this, "注销成功", Toast.LENGTH_LONG).show();}}
这是用java代码注册。

package mobile.android.register.receiver;import java.util.Set;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.telephony.SmsMessage;import android.util.Log;import android.widget.Toast;public class ShortMessageReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent){Bundle bundle = intent.getExtras();if (bundle != null){Set<String> keys = bundle.keySet();for (String key : keys){Log.d("key", key);}Object[] objArray = (Object[]) bundle.get("pdus");SmsMessage[] messages = new SmsMessage[objArray.length];for (int i = 0; i < objArray.length; i++){messages[i] = SmsMessage.createFromPdu((byte[]) objArray[i]);String s = "通过代码注册\n手机号:" + messages[i].getOriginatingAddress()+ "\n";s += "短信内容:" + messages[i].getDisplayMessageBody();Toast.makeText(context, s, Toast.LENGTH_LONG).show();}} }}
接收在广播后执行onReceive方法。

这里还需相应的权限

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

广播机制理解起来不是不是特别难。还有一个问题就是两种注册方法有什么区别呢?

在androidmanifest.xml文件注册,如果应用程序关掉了,依然可以接受到广播消息,比如监控电池的电量,应用程序关了,还是一样可以监控到电量的变化。但是有些情况是不合适的,不如在窗口中更新控件的状态,这个在manifest中注册就不是很合适了,这时候就应该用java代码来注册,这个有什么好处呢,这个可以随时打开应用程序,随时注册,当你不想用了,关闭应用程序,接收器也就销毁了。这就是两者的区别。

广播接收器的优先级问题

通过<intent-filter>标签中的android:priority  来设置调用的优先级,属性值越大,优先级就越高。比如android:priority=“500”  比android:priority=“1000”要小。这个属性只适合同步处理方式,对于异步处理方式,则调用的顺序除了鱼优先级有关,还和android系统的并发调度有关。

0 0
原创粉丝点击