当前位置: 代码迷 >> Android >> 【Android学习】Android播音机制
  详细解决方案

【Android学习】Android播音机制

热度:33   发布时间:2016-04-28 06:24:31.0
【Android学习】Android广播机制

Android广播机制简介:

在Android中,有一些操作完成以后,会发送广播,比如说发出一条短信或者打出一个电话,如果某个程序接收了这条广播,就会做相应的处理。而且该广播可以被不止一个应用程序所接收,当然也可以不被任何程序所接收。

广播机制最大的特点就是发送方并不关心接收方是否接收数据,也不关心接收方如何处理数据。

对于该广播是否被一个应用程序所接收,取决于这个应用程序是否注册BroadcastReceiver,因为roadcastReceiver用于监听被广播的事件(intent),为了达到这个目的,BroadcastReceiver必须被注册,注册的方法有以下两种:

1、静态注册方法

在AndroidManifest.xml的application里面定义receiver并设置要接收的action

其特点为:不管该应用程序是否处于活动状态,都会进行监听。

也就是说,这个程序无论是否开启,都会接收广播,并作出相应处理。如果一个程序接收是手机电量低的提醒,那么这个机制就很适合,因为不用顾忌这个程序是否关闭或者开启,都能得到手机电量低的提醒。但是,如果是接收某个广播来对该程序的Activity主页面的改变,那么这种机制就没有必要,因为当程序关闭时,我们不会关心这个程序页面的变化,而造成电量以及手机性能的影响。

2、在应用程序中注册

如果想避免上一种后果,那么就可以在应用程序中注册BroadcastReceiver。这样可以很方便的注册和取消注册,从而决定对广播是否接受。

下面是静态注册的实例:

广播发送:

package com.ye_yun_lin.broadcastreceiver;import android.os.Bundle;import android.app.Activity;import android.content.Intent;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity {	private Button button;	@Override	protected void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		setContentView(R.layout.activity_main);				button=(Button)findViewById(R.id.button);		button.setOnClickListener(new OnClickListener() {						@Override			public void onClick(View v) {				Intent intent=new Intent();				intent.setAction(intent.ACTION_EDIT);				MainActivity.this.sendBroadcast(intent);			}		});	}}

广播接收:

package com.ye_yun_lin.broadcastreceiver;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;public class Receiver extends BroadcastReceiver {	public Receiver(){		System.out.println("--Receiver");	}	@Override	public void onReceive(Context context, Intent intent) {		System.out.println("--onReceiver");	}}

BroadcastReceiver注册:

        <receiver android:name="com.ye_yun_lin.broadcastreceiver.Receiver">            <intent-filter>                <action android:name="android.intent.action.EDIT"/>            </intent-filter>        </receiver>

输出结果:




下面是在应用程序中注册的实例:


public class SMSReceiver extends BroadcastReceiver{	@Override	public void onReceive(Context context, Intent intent) {		// TODO Auto-generated method stub		System.out.println("receive message");				//接受Intent对象当中的数据		Bundle bundle = intent.getExtras();		//在Bundle对象当中有一个属性名为pdus,这个属性的值是一个Object数组		Object[] myOBJpdus = (Object[]) bundle.get("pdus"); 		//创建一个SmsMessage类型的数组        SmsMessage[] messages = new SmsMessage[myOBJpdus.length];          System.out.println(messages.length);        for (int i = 0; i<myOBJpdus.length; i++)         {            //使用Object数组当中的对象创建SmsMessage对象          messages[i] = SmsMessage.createFromPdu((byte[]) myOBJpdus[i]);            //调用SmsMessage对象的getDisppalyMessageBody()方法,就可以得到消息的内容          System.out.println(messages[i].getDisplayMessageBody());        }        try {			Thread.sleep(30 * 1000);			System.out.println("-------------------------------");		} catch (InterruptedException e) {			// TODO Auto-generated catch block			e.printStackTrace();		}	}}

public class TestBC2Activity extends Activity {    /** Called when the activity is first created. */	private Button registerButton = null;	private Button unregisterButton = null;	private SMSReceiver smsReceiver = null;		private static final String SMS_ACTION = "android.provider.Telephony.SMS_RECEIVED";    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        registerButton = (Button)findViewById(R.id.register);        registerButton.setOnClickListener(new RegisterReceiverListener());        unregisterButton = (Button)findViewById(R.id.unregister);        unregisterButton.setOnClickListener(new UnRegisterReceiverListener());    }        class RegisterReceiverListener implements OnClickListener{		@Override		public void onClick(View v) {			//生成一个BroiadcastReceiver对象			smsReceiver = new SMSReceiver();			//生成一个IntentFilter对象			IntentFilter filter = new IntentFilter();			//为IntentFilter添加一个Action			filter.addAction(SMS_ACTION);			//将BroadcastReceiver对象注册到系统当中			TestBC2Activity.this.registerReceiver(smsReceiver, filter);		}    	    }        class UnRegisterReceiverListener implements OnClickListener{		@Override		public void onClick(View v) {			//解除BroadcastReceiver对象的注册			TestBC2Activity.this.unregisterReceiver(smsReceiver);		}    	    }}



  相关解决方案