Android学习笔记(十一)——广播机制

来源:互联网 发布:微信公众号开发源码 编辑:程序博客网 时间:2024/05/22 14:37

Android广播机制和现实的广播差不多,Android发出一个事件的广播,然后所有BroadcastReveier都会接收到这个广播事件,但是只有和相应的BroadcastReveier相匹配的事件才会被接收处理。

BroadcastReveier用于监听被广播的事件,为了达到这个目的 ,必须对于进行注册,注册的方法有下面两种:

1、在应用程序的代码中进行注册;

                    registerReceiver(receiver,filter)用于注册BroadcastReceiver;

      unregisterReceiver(Receiver)用于取消注册

2、在AndroidMainfest.xml中进行注册;


如果BroadcastReceiver用于更新UI,那么通常会使用第一种方法进行注册,在Activity启动的时候进行注册,在Activity不可见的时候取消注册;

第二种方法无论应用程序打开与否,都会接收到相应的广播事件,因此会占用一定的CPU资源;

下面的程序用上述两个方法进行编写:

Activity类:package gap.DCRC;import gap.receiver.SMSReceicer;import android.app.Activity;import android.content.Intent;import android.content.IntentFilter;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class BroadCastRCActivity extends Activity {private Button register;private Button unregister;private Button sendButton;private static String SMS_ACTION = "android.provider.Telephony.SMS_RECEIVED";private SMSReceicer receiver;    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        //手动注册BroadcastReceiver        register = (Button)findViewById(R.id.register);        //手动解除BroadcastReceiver        unregister = (Button)findViewById(R.id.unregister);        //发送一个广播        sendButton = (Button)findViewById(R.id.send);        register.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stub//创建一个IntentFilterIntentFilter filter = new IntentFilter();//加入相应的过滤机制filter.addAction(SMS_ACTION);receiver = new SMSReceicer();//注册BroadcastReceiverBroadCastRCActivity.this.registerReceiver(receiver, filter);System.out.println("register BroadcastReceiver");}});        unregister.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stub//解除BroadcastReceiverBroadCastRCActivity.this.unregisterReceiver(receiver);System.out.println("unregister BroadcastReceiver");}});                //发送一个广播        sendButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIntent intent = new Intent();intent.setAction(Intent.ACTION_EDIT);BroadCastRCActivity.this.sendBroadcast(intent);}});    }}

有两个继承BroadcastReceiver的类:

package gap.receiver;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;public class TestReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubSystem.out.println("onReceive");}}

package gap.receiver;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.telephony.gsm.SmsMessage;public class SMSReceicer extends BroadcastReceiver {@SuppressWarnings("deprecation")@Overridepublic void onReceive(Context arg0, Intent intent) {// TODO Auto-generated method stub//接受发送的的短信System.out.println("receive SMS");Bundle bundle = intent.getExtras();Object[] myObjPdus = (Object[])bundle.get("pdus");SmsMessage[] messages = new SmsMessage[myObjPdus.length];for (int i = 0; i < myObjPdus.length; i++){messages[i] = SmsMessage.createFromPdu((byte[]) myObjPdus[i]);System.out.println(messages[i].getDisplayMessageBody());}}}

AndroidMainfest.xml<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"      package="gap.DCRC"      android:versionCode="1"      android:versionName="1.0">    <uses-sdk android:minSdkVersion="4" />    <application android:icon="@drawable/icon" android:label="@string/app_name">        <activity android:name=".BroadCastRCActivity"                  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="gap.receiver.TestReceiver">        <intent-filter >        <action android:name="android.intent.action.EDIT"/>        </intent-filter>        </receiver>    </application>        <uses-permission android:name="android.permission.RECEIVE_SMS"/></manifest>
执行的结果:



原创粉丝点击