`
chjmars
  • 浏览: 77304 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论
阅读更多

    一听广播二字,我们第一感觉就会联想到了小时候村里的广播播音,收音机等。对于广播来说,广播发送方 并不在意广播接收方 动作, 接收到广播时如何处理,需要干什么,那是你接受者事。其实,Android 中的广播又何尝不是呢。

    Android 中有各式各样的广播,各种广播在Android 系统中运行,当系统/应用程序运行时便会向 Android 注册各种广播,Android 接收到广播会便会判断哪种广播需要哪种事件,然后向不同需要事件的应用程序注册事件,不同的广播可能处理不同的事件也可能处理相同的广播事件,这时就需要 Android 系统为我们做筛选。

    无论怎么,既然是广播机制,最最起码的必须要有广播方式者,Android中,广播发送有三种形式,即,sendBroadcast(),sendOrderedBroadcast(),sendStickyBroadcast(),至于这三种的区别google一下遍地都是。此外就是接收端,只有接收了才能做相应的动作,如果没有接收,那么广播就没有什么意义了。而Android广播接收使用了2种方式,它们的是继承了BroadcastReceiver,实现其方法onReceive,在广播被接收之后,接收者就可以在onReceive中做各种各样的处理。

      下面是广播机制中的2中接收方式的测试Demo;

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" android:layout_width="fill_parent"
	android:layout_height="fill_parent">
	<TextView android:layout_width="fill_parent"
		android:layout_height="wrap_content" android:text="@string/hello" />
	<LinearLayout android:orientation="horizontal"
		android:layout_width="fill_parent" android:layout_height="wrap_content">
		<Button android:layout_height="wrap_content" android:text="@string/static_label"
			android:layout_width="wrap_content" android:id="@+id/button1" />
		<Button android:text="@string/dynamic_code" android:id="@+id/button2"
			android:layout_width="wrap_content" android:layout_height="wrap_content" />
	</LinearLayout>
	<TextView android:text="TextView" android:id="@+id/textView1"
		android:layout_width="fill_parent" android:layout_height="wrap_content" />
</LinearLayout>

 MainActivity实现了主要广播接收发送的简短方式:

public class MyTestBroadcarsReceiverActivity extends Activity {
	public static final String CODELOGIN_INTENTFILTER_ACTION = "com.testbroadcastreceiver.TestBroadcastReceiver.CodeLogin";
	public static final String LABELLOGIN_INTENTFILTER_ACTION = "com.testbroadcastreceiver.TestBroadcastReceiver.LabelLogin";

	public static Context mBase;

	private Button codeLoginBtn;
	private Button labelLoginBtn;
	public TextView broadcastReceiverTV;

	private TextViewParcel mTextViewParcel;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		mBase = this;

		initComponent();

		mTextViewParcel = new TextViewParcel(broadcastReceiverTV);
		mCodeLogin_BroadcastReceiver = new CodeLogin_BroadcastReceiver();
	}

	@Override
	protected void onStart() {
		super.onStart();

		mFilter = new IntentFilter();
		mFilter.addAction(CODELOGIN_INTENTFILTER_ACTION);
		if (mCodeLogin_BroadcastReceiver != null && mFilter != null) {
			mBase.registerReceiver(mCodeLogin_BroadcastReceiver, mFilter);
		}
	}

	@Override
	protected void onStop() {
		super.onStop();

		if (mCodeLogin_BroadcastReceiver != null) {
			mBase.unregisterReceiver(mCodeLogin_BroadcastReceiver);
		}
	}

	private void initComponent() {
		labelLoginBtn = (Button) findViewById(R.id.button1);
		if (labelLoginBtn != null) {
			labelLoginBtn.setOnClickListener(LabelLogin_SendBroadcastListener);
		}

		codeLoginBtn = (Button) findViewById(R.id.button2);
		if (codeLoginBtn != null) {
			codeLoginBtn.setOnClickListener(CodeLogin_SendBroadcastListener);
		}

		broadcastReceiverTV = (TextView) findViewById(R.id.textView1);
		if (broadcastReceiverTV != null) {
			broadcastReceiverTV.setText("Test BroadcastReceiver");
		}
	}

	public OnClickListener LabelLogin_SendBroadcastListener = new OnClickListener() {

		@Override
		public void onClick(View v) {
			Log.d("TestBroadcastReceiver", "onClick()");
			labelLogin_sendBroadcart();
		}
	};

	public OnClickListener CodeLogin_SendBroadcastListener = new OnClickListener() {

		@Override
		public void onClick(View v) {
			codeLogin_sendBroadcart();
		}
	};

	private void codeLogin_sendBroadcart() {
		Intent intent = new Intent();
		intent.setAction(CODELOGIN_INTENTFILTER_ACTION);

		Bundle extras = new Bundle();
		String str = mBase.getString(R.string.dynamic_code) + ":\n    "
				+ mBase.getString(R.string.dynamic_code_content) + "\n    ";

		String s = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
		char c[] = s.toCharArray();
		for (int i = 0; i < 100; i++) {
			int randomId = new Random().nextInt(s.length());
			str += c[randomId];
		}

		extras.putString("TVText_codeLogin", str);
		intent.putExtras(extras);
		mBase.sendBroadcast(intent);
	}

	private void labelLogin_sendBroadcart() {
		Intent intent = new Intent();
		intent.setAction(LABELLOGIN_INTENTFILTER_ACTION);

		Bundle extras = new Bundle();
		String str = mBase.getString(R.string.static_label) + ":\n    "
				+ mBase.getString(R.string.static_label_content) + "\n    ";

		String s = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
		char c[] = s.toCharArray();
		for (int i = 0; i < 100; i++) {
			int randomId = new Random().nextInt(s.length());
			str += c[randomId];
		}

		extras.putString("TVText_labelLogin", str);
		extras.putParcelable("TVWidget_labelLogin", mTextViewParcel);
		intent.putExtras(extras);
		mBase.sendBroadcast(intent);
	}

	private CodeLogin_BroadcastReceiver mCodeLogin_BroadcastReceiver;
	private IntentFilter mFilter;

	public class CodeLogin_BroadcastReceiver extends BroadcastReceiver {

		public CodeLogin_BroadcastReceiver() {
			Log.d("CodeLogin_BroadcastReceiver",
					"new CodeLogin_BroadcastReceiver()");
		}

		@Override
		public void onReceive(Context context, Intent intent) {
			Log.d("CodeLogin_BroadcastReceiver", "onReceive()");

			Bundle extras = intent.getExtras();
			if (extras != null && broadcastReceiverTV != null) {
				String str = extras.getString("TVText_codeLogin");
				broadcastReceiverTV.setText(str);
			}
		}
	}

}

 对于静态注册方式,这里实现了利用Bundle传递对象的方式:

package com.testbroadcastreceiver.br;
public class LabelLogin_BroadcastReceiver extends BroadcastReceiver {

	private TextViewParcel mTextViewParcel;

	public LabelLogin_BroadcastReceiver() {
		Log.d("LabelLogin_BroadcastReceiver", "new LabelLogin_BroadcastReceiver()");
	}

	@Override
	public void onReceive(Context context, Intent intent) {
		Log.d("LabelLogin_BroadcastReceiver", "onReceive()");

		Bundle extras = intent.getExtras();
		if (extras != null) {
			if (intent.hasExtra("TVWidget_labelLogin")) {
				extras.getParcelable("TVWidget_labelLogin");
				mTextViewParcel = extras.getParcelable("TVWidget_labelLogin");
			}
			String str = extras.getString("TVText_labelLogin");
			if (mTextViewParcel != null
					&& mTextViewParcel.getBroadcastReceiverTV() != null)
				mTextViewParcel.getBroadcastReceiverTV().setText(str);
		}
	}
}

 Bundle传递对象的处理方式,注意TextViewParcel中writeValue()和readValue()的写法:

public class BroadcastReceiverTV extends Binder {
	
	public TextView mTextView;

}
 
package com.testbroadcastreceiver.textviewparcel;
public class TextViewParcel implements Parcelable {

	private BroadcastReceiverTV broadcastReceiverTV = new BroadcastReceiverTV();

	public TextViewParcel(TextView mTextView) {
		broadcastReceiverTV.mTextView = mTextView;
	}

	public TextViewParcel(Parcel in) {
		broadcastReceiverTV = (BroadcastReceiverTV)in.readValue(BroadcastReceiverTV.class
				.getClassLoader());
	}

	public TextView getBroadcastReceiverTV() {
		return broadcastReceiverTV.mTextView;
	}

	public void setBroadcastReceiverTV(TextView broadcastReceiverTV) {
		this.broadcastReceiverTV.mTextView = broadcastReceiverTV;
	}

	@Override
	public int describeContents() {
		return 0;
	}

	@Override
	public void writeToParcel(Parcel dest, int flags) {
		dest.writeValue(broadcastReceiverTV);
	}

	public static final Parcelable.Creator<TextViewParcel> CREATOR = new Creator<TextViewParcel>() {

		@Override
		public TextViewParcel[] newArray(int size) {
			return new TextViewParcel[size];
		}

		@Override
		public TextViewParcel createFromParcel(Parcel source) {
			return new TextViewParcel(source);
		}
	};

}
分享到:
评论
3 楼 dodomelee 2014-03-03  
  
2 楼 追逐779 2012-08-02  
是不是发错了,工程呢?谢谢
1 楼 aaa12 2012-01-11  
怎么是个apk 呀?

相关推荐

    android广播机制

    Android 广播机制是Android系统中一种用于组件间通信的重要机制。BroadcastReceiver,即广播接收器,是Android四大组件之一,它允许应用程序在不互相依赖的情况下接收和响应系统或应用程序发出的广播事件。这些事件...

    Android广播机制详解

    本文将详细解析Android广播机制的核心概念、工作原理以及如何使用。 一、广播基本概念 1. 广播Intent:广播Intent是Android系统中用于发送和接收广播消息的对象。它包含一个动作(Action)、数据(Data)、类型...

    android-关于广播机制的使用

    总结,Android广播机制是实现系统事件通知和跨应用通信的重要手段。理解并熟练运用广播,可以提升应用的功能性和响应性。在实际开发中,根据需求选择合适的注册方式,合理设计IntentFilter,以及适时使用...

    Android广播机制安全性研究.pdf

    【Android 广播机制概述】 Android 广播机制是 Android 操作系统中一个核心的组件交互方式,它允许应用程序在不直接互相通信的情况下共享信息。广播接收器(Broadcast Receiver)作为四大组件(Activity、Service、...

    Android广播机制

    Android广播机制

    broadcast_Android 广播机制broadcast用法实例.rar

    在这个“broadcast_Android 广播机制broadcast用法实例.rar”压缩包中,我们很可能会找到关于如何使用BroadcastReceiver的示例代码和教程。 首先,广播分为两种类型:显式广播和隐式广播。显式广播是直接指定接收者...

    android 广播机制

    本教程将深入探讨Android广播机制的核心概念、工作原理以及如何在实践中运用。 **广播的概念** 广播在Android中扮演着一个通知的角色,当系统或某个应用产生了一个广播事件(例如设备开机、网络状态改变等),这个...

    Android 广播机制实例

    Android中的广播机制设计的非常出色,很多事情原本需要开发者亲自操作的,现在只需等待广播告知自己就可以了,大大减少了开发的工作量和开发周期。而作为应用开发者,就需要数练掌握Android系统提供的一个开发利器,...

    android 广播机制和短信截获

    总结来说,Android的广播机制为应用程序提供了强大的通讯能力,而短信广播截获则能让我们实时监控短信消息。通过理解广播的工作原理,合理选择注册方式,以及正确处理权限和系统限制,我们可以创建出高效且可靠的...

    android广播机制(二)

    本文将深入探讨Android的广播机制,主要关注标准广播和有序广播的实现和区别。 首先,我们来理解什么是广播。在Android中,BroadcastReceiver是用于接收和响应系统或应用程序发送的广播消息的组件。广播可以是系统...

    android的广播机制和广播的简单使用

    首先,理解Android广播机制的核心概念。Android系统会发送各种广播Intent,比如设备启动、网络状态改变等。这些Intent可以被任何注册了对应意图过滤器的BroadcastReceiver所接收。BroadcastReceiver是Android中处理...

    Android broadcast广播机制的使用

    本文将深入探讨Android广播机制的使用,包括动态注册与静态注册两种方式。 首先,我们要理解广播的基本概念。Android广播是系统用于在整个应用环境中发送全局通知的方式。这些通知可以是系统级别的,如设备启动、...

    Android广播onReceiver回调更新ui

    在实际开发中,这涉及到对Android广播机制的理解、广播接收器的注册与管理、onReceive()回调的使用以及安全地更新UI的策略。掌握这些知识点有助于构建一个能够及时响应系统事件并提供反馈的应用程序。

    android 广播简单的使用

    ### Android广播机制详解 在Android开发中,广播(Broadcast)是一种常见的组件间通信方式,用于在应用程序的不同部分或不同应用程序之间传递消息。本篇将基于提供的文件内容详细讲解Android广播的简单使用方法。 ...

    Android基础程序设计第五章-广播机制.pptx

    "Android基础程序设计第五章-广播机制" ...本章节讲解了Android系统中的广播机制,包括广播机制的简介、发送自定义广播、接收系统广播、实战演练等内容,为读者提供了一个系统的了解Android广播机制的机会。

    Android代码-安卓广播机制

    在Android系统中,广播(Broadcast)是一种...以上就是关于Android广播机制的基本知识,理解并熟练掌握广播机制对于开发高效、稳定的Android应用至关重要。在实际开发中,合理使用广播可以提高应用的交互性和响应性。

    android广播小例子

    总的来说,Android广播机制提供了一种灵活的消息传递方式,使得应用程序可以在适当的时候做出反应,增强了系统的交互性和可扩展性。了解并熟练掌握广播接收器的使用,对于开发Android应用来说至关重要。在这个...

Global site tag (gtag.js) - Google Analytics