组件------BroadcastReceiver

来源:互联网 发布:java private class 编辑:程序博客网 时间:2024/06/08 11:21

组件------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 {@Overrideprotected 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;}}@Overrideprotected void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();unregisterReceiver(new BCR1());}@Overridepublic 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;}@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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>

布局文件只有三个按钮


0 0
原创粉丝点击