Android中BroadcastReceiver主要用途有

发送通知,更新UI或者数据,应用程序间相互通信,监听系统状态(比如开机,网络等)

Android中BroadcasetReceiver的注册方式

  1. manifest清单文件中的全局注册

  2. 按照生命周期,在Service或者Activity中使用代码注册

manifest的注册方式

<receiverandroid:name="com.sample.test.MyBroadcastReciever"><intent-filter><actionandroid:name="com.sample.test.ACTION_DO_SOMETHING"></action><actionandroid:name="android.intent.ACTION_WIFI_STATE_CHANGED"></action></intent-filter></receiver>

使用代码注册

SampleActivity

privateMyReceiverreceiver;@OverridepublicvoidonStart(){super.onStart();receiver=newMyReceiver();IntentFilterfilter=newIntentFilter();filter.addAction("android.intent.action.MY_BROADCAST");registerReceiver(receiver,filter);}@OverridepublicvoidonStop(){super.onStop();unregisterReceiver(receiver);}

Android中发送广播的方式

普通广播:无论优先级大小,将发送给所有监听Action="com.test.sample.action"的广播,内容不可被修改,无传递性。

Intentintent=newIntent("com.test.sample.action");sendBroadcast(intent);

异步(黏性)广播:当处理完之后的Intent,依然存在,这时候registerReceiver(BroadcastReceiver, IntentFilter)还能收到他的值,直到你把它去掉,无传递性,无法终止(abort())广播

发这个广播需要权限<uses-permission android:name="android.permission.BROADCAST_STICKY"/>

去掉是用这个方法removeStickyBroadcast(intent);但别忘了在执行这个方法的应用里面AndroidManifest.xml同样要加上面的权限;

sendStickyOrderedBroadcast(intent,resultReceiver,scheduler,initialCode,initialData,initialExtras)

有序广播:

按照接收者的优先级顺序接收广播,优先级别在intent-filter中的priority中声明,-1000到1000之间 ,值越大 优先级越高 。可以终止广播意图的继续传播 , 接收者可以篡改内容,具有传递性。

sendBroadcast(intent);

Android中的BroadcastReceiver可以用来发送信息到另一个广播,这种方式可实现程序或者进程间的通行。


上面回顾了一下Android的广播用例,总体来说安全性都不太好,因此只适用于安全性较低的数据传递,或者页面更新。

在android-support-v4.jar中引入了LocalBroadcastManager,称为局部通知管理器,这种通知的好处是安全性高,效率也高,适合局部通信,可以用来代替Handler更新UI

publicclassLocalServiceBroadcasterActivityextendsActivity{staticfinalStringACTION_STARTED="com.example.android.supportv4.STARTED";staticfinalStringACTION_UPDATE="com.example.android.supportv4.UPDATE";staticfinalStringACTION_STOPPED="com.example.android.supportv4.STOPPED";LocalBroadcastManagermLocalBroadcastManager;BroadcastReceivermReceiver;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);finalTextViewcallbackData=(TextView)findViewById(R.id.callback);callbackData.setText("Nobroadcastreceivedyet");mLocalBroadcastManager=LocalBroadcastManager.getInstance(this);IntentFilterfilter=newIntentFilter();filter.addAction(ACTION_STARTED);filter.addAction(ACTION_UPDATE);filter.addAction(ACTION_STOPPED);mReceiver=newBroadcastReceiver(){@OverridepublicvoidonReceive(Contextcontext,Intentintent){if(intent.getAction().equals(ACTION_STARTED)){callbackData.setText("STARTED");}elseif(intent.getAction().equals(ACTION_UPDATE)){callbackData.setText("Gotupdate:"+intent.getIntExtra("value",0));}elseif(intent.getAction().equals(ACTION_STOPPED)){callbackData.setText("STOPPED");}}};mLocalBroadcastManager.registerReceiver(mReceiver,filter);Buttonbutton=(Button)findViewById(R.id.start);button.setOnClickListener(mStartListener);button=(Button)findViewById(R.id.stop);button.setOnClickListener(mStopListener);}@OverrideprotectedvoidonDestroy(){super.onDestroy();mLocalBroadcastManager.unregisterReceiver(mReceiver);}privateOnClickListenermStartListener=newOnClickListener(){publicvoidonClick(Viewv){startService(newIntent(LocalServiceBroadcasterActivity.this,LocalService.class));}};privateOnClickListenermStopListener=newOnClickListener(){publicvoidonClick(Viewv){stopService(newIntent(LocalServiceBroadcasterActivity.this,LocalService.class));}};publicstaticclassLocalServiceextendsService{LocalBroadcastManagermLocalBroadcastManager;intmCurUpdate;staticfinalintMSG_UPDATE=1;HandlermHandler=newHandler(){@OverridepublicvoidhandleMessage(Messagemsg){switch(msg.what){caseMSG_UPDATE:{mCurUpdate++;Intentintent=newIntent(ACTION_UPDATE);intent.putExtra("value",mCurUpdate);mLocalBroadcastManager.sendBroadcast(intent);Messagenmsg=mHandler.obtainMessage(MSG_UPDATE);mHandler.sendMessageDelayed(nmsg,1000);}break;default:super.handleMessage(msg);}}};@OverridepublicvoidonCreate(){super.onCreate();mLocalBroadcastManager=LocalBroadcastManager.getInstance(this);}publicintonStartCommand(Intentintent,intflags,intstartId){//Tellanylocalinterestedpartiesaboutthestart.mLocalBroadcastManager.sendBroadcast(newIntent(ACTION_STARTED));//Preparetodoupdatereports.mHandler.removeMessages(MSG_UPDATE);Messagemsg=mHandler.obtainMessage(MSG_UPDATE);mHandler.sendMessageDelayed(msg,1000);returnServiceCompat.START_STICKY;}@OverridepublicvoidonDestroy(){super.onDestroy();//Tellanylocalinterestedpartiesaboutthestop.mLocalBroadcastManager.sendBroadcast(newIntent(ACTION_STOPPED));//Stopdoingupdates.mHandler.removeMessages(MSG_UPDATE);}@OverridepublicIBinderonBind(Intentintent){returnnull;}}}



更多相关文章

  1. 申请Android Map 的API Key(v2)的最新申请方式(SHA1密钥)
  2. Android请求网络有三种方式:HttpURLConnection、 HttpClient和OkH
  3. Android三种播放视频的方式
  4. android中的http访问方式
  5. 2011.09.13(3)——— android 添加快捷方式并且图标上添加数字
  6. Android -- android activity 各种布局方式以及相关参数
  7. Android提供了5种方式存储数据:
  8. android实现视频播放的几种方式
  9. Android的两种数据存储方式分析(一)

随机推荐

  1. Android中解决输入法问题
  2. android学习之ToggleButton实现开关效果
  3. [Android实例] android 蓝牙开发浅析
  4. Android Device Monitor的 “provide the
  5. Android(安卓)SDK Manager下载,解决方案
  6. Android之自定义Dialog屏幕旋转时自动关
  7. Android第一行代码学习笔记Chapter1&2
  8. Android组件 子菜单(SubMenu)
  9. Android新特性之RecyclerView的简单使用
  10. Android开发指南(33) —— Multimedia an