组件------BroadcastReceiver

组件------BroadcastReceiver
1、Broadcast(广播)介绍:
---是一种广泛运用在程序之间传输信息的机制。
2、-BroadcastReceiver广播接收者:
---是对发送出来的广播进行过滤接收并相应的一类组件,他就是用来接收来自系统和应用的广播。
3、用途:减少工作量和开发周期
---开机完成后系统会产生一条广播;(开机启动)
---当网络状态改变时系统会产生一条广播;()
---电量改变系统会发送一个广播
普通广播(无序)特点:
——同级别接收先后是随机的
——级别低的后收到广播
——接收器不能截断广播的继续传播,也不能处理广播。
——同级别动态注册高于静态注册
有序广播特点:
——同级别接受顺序是随机的。
——能截断广播的继续传播,高级别的广播接收器收到该广播后,可以决定是否截断
——接收器能截断广播的继续传播,也能处理广播
——同级别动态注册高于静态注册
补充:四大组件只有广播有两种注册方式!!!!
使用方法:
1、发送:
——首先在需要发送信息的地方,把要发送的信息和用于过滤的信息(如Action、Category)装入一个intent对象,
——然后通过调用:
Context.sendBroadcast()——//发送一条无序的广播
sendOrderBroadcast()——//发送一条有序的广播
sendStickyBroadcast()——//发送一条异步的广播
某一个方法,把Intent对象以广播方式发送出去。
2、接收:
——当Intent发送以后,所有已注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,
——若匹配则就会调用BroadcastReceivce的onReceiver()方法。
注意:BroadcastReceivce需要注册(静态或动态) 一些详细步骤:
静态注册:<receiver android:name="com.zxx.service.Reeciver">
设置优先级: <intent-filter android:priority="100"/>——默认是(-1000,1000)
设置过滤: <action android:name="zxx" />
动态注册:(代码没执行不会接收广播) ——>结束时一定要取消注册;
IntentFilter filter=new IntentFilter("aaaa");
Reeciver mreeciver=new Reeciver();
registerReceiver(mreeciver,filter);
????动态设置优先级???

数据处理:
Bundle类
bundle.putString("test", "广播处理的数据");
setResultExtras(bundle);
getResultExtras(true);
截断广播:abortBroadcast();


异步广播:(粘滞性滞留广播)当处理完厚度Intent,任然存在。这时候registerReceiver(reeciver,filter)还能收到他的值
直到你把他去掉,不能将处理结果传给下一个接收者,无法终止广播。
异步广播要加权限 : <uses-permission android:name="android.permission.BROADCAST_STICKY" />'
发送异步广播:sendStickyBroadcast(intent3);
!!!!注意!!!!:
——BroadcastReceiver生命周期只有10秒左右
——在BroadcastReceiver不能做比较耗时的操作
——应该通过发送Intent给Service让Service完成
——不能子线程

代码:

import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		IntentFilter filter = new IntentFilter("zxx");
		BCR2 bcr2 = new BCR2();
		registerReceiver(bcr2, filter);
	}

	public void doClick(View v) {
		switch (v.getId()) {
		case R.id.receiver1:
			Intent mintent1 = new Intent();
			mintent1.putExtra("R.id.receiver1", "这是一条无序广播!!");
			mintent1.setAction("zxx");
			sendBroadcast(mintent1);// 发送一条无序的广播
			Log.i("tag", "点击了");
			break;
		case R.id.receiver2:
			Intent mintent2 = new Intent();
			mintent2.putExtra("R.id.receiver2", "这是一条有序广播!!");
			mintent2.setAction("zxx");
			sendOrderedBroadcast(mintent2, null);// 这是一条有序广播!!
			Log.i("tag", "点击了");
			break;
		case R.id.receiver3:
			Intent mintent3 = new Intent();
			mintent3.putExtra("R.id.receiver3", "这是一条异步广播!!");
			mintent3.setAction("zxx");
			sendStickyBroadcast(mintent3);// 这是一条异步广播!!
			IntentFilter filter = new IntentFilter("zxx");
			BCR3 bcr3 = new BCR3();
			registerReceiver(bcr3, filter);
			break;

		default:
			break;
		}
	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		unregisterReceiver(new BCR1());
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}
}
广播1类:
package zxx.Broadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

public class BCR1 extends  BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		String s=intent.getStringExtra("R.id.receiver1");	
		Log.i("tag", "BCR1"+s);
		Bundle bundle = getResultExtras(true);
		String s2 = bundle.getString("test");
		Log.i("tag", "BCR1接收到值:"+s2);
	}

}
广播2类:
package zxx.Broadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

public class BCR2 extends  BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		
		String s=intent.getStringExtra("R.id.receiver2");	
		Log.i("tag", "BCR2"+s);
		//abortBroadcast();//截断一条有序广播
		Bundle bundle = 	new Bundle();
		bundle.putString("test", "广播处理的数据");
		setResultExtras(bundle);
	}

}
异步广播基本相似:
清单文件中的静态注册:
<pre class="html" name="code"><pre class="html" name="code"><receiver android:name="zxx.Broadcast.BCR1" >
            <intent-filter 
                >
                <action android:name="zxx" />
         	</intent-filter>
        </receiver>

布局文件只有三个按钮

 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值