Android LocalBroadcastManager的使用

一、BroadcastReceiver主要用途有

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

二、BroadcasetReceiver的注册方式

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

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

manifest的注册方式


 
 
  1.   <receiver android:name="com.sample.test.MyBroadcastReciever">  
  2.              <intent-filter>  
  3.                  <action android:name="com.sample.test.ACTION_DO_SOMETHING"> </action>
  4.                  <action android:name="android.intent.ACTION_WIFI_STATE_CHANGED"> </action>  
  5.              </intent-filter>  
  6.    </receiver>

使用代码注册

SampleActivity


 
 
  1. private  MyReceiver receiver;
  2. @Override 
  3. public void onStart() {
  4.      super.onStart();  
  5.     receiver =  new MyReceiver();
  6.     IntentFilter filter =  new IntentFilter();
  7.     filter.addAction( "android.intent.action.MY_BROADCAST");
  8.     registerReceiver(receiver, filter);
  9. }
  10. @Override
  11. public void onStop(){
  12.      super.onStop();
  13.     unregisterReceiver(receiver);  
  14. }

Android中发送广播的方式

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


 
 
  1. Intent intent =  new Intent(  "com.test.sample.action");
  2. sendBroadcast(intent);

三、广播分类

黏性广播

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

发这个广播需要权限

<uses-permission android:name="android.permission.BROADCAST_STICKY" />
 
 

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


 
 
  1. sendStickyOrderedBroadcast(intent, resultReceiver, scheduler,
  2.        initialCode, initialData, initialExtras)

有序广播

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

sendOrderBroadcast(intent);
 
 

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

无序广播

所谓无序广播是指、发送广播之后,接收顺序是无序的,发送方式如下。

sendBroadcast(intent);
 
 

注意:无序广播在某些情况下还是有序的,比如使用代码注册的的广播优先级高、前台app优先级更高、此外,无序广播的接收顺序和程序安装顺序也有一定的关系。

 

四、LocalBroadcastManager

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

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


 
 
  1. public  class LocalServiceBroadcasterActivity extends Activity {
  2. static  final String ACTION_STARTED =  "com.example.android.supportv4.STARTED";
  3. static  final String ACTION_UPDATE =  "com.example.android.supportv4.UPDATE";
  4. static  final String ACTION_STOPPED =  "com.example.android.supportv4.STOPPED";
  5. LocalBroadcastManager mLocalBroadcastManager;
  6. BroadcastReceiver mReceiver;
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.main);
  11. final TextView callbackData = (TextView) findViewById(R.id.callback);
  12. callbackData.setText( "No broadcast received yet");
  13. mLocalBroadcastManager = LocalBroadcastManager.getInstance( this);
  14. IntentFilter filter =  new IntentFilter();
  15. filter.addAction(ACTION_STARTED);
  16. filter.addAction(ACTION_UPDATE);
  17. filter.addAction(ACTION_STOPPED);
  18. mReceiver =  new BroadcastReceiver() {
  19. @Override
  20. public void onReceive(Context context, Intent intent) {
  21. if (intent.getAction().equals(ACTION_STARTED)) {
  22. callbackData.setText( "STARTED");
  23. else  if (intent.getAction().equals(ACTION_UPDATE)) {
  24. callbackData.setText( "Got update: " + intent.getIntExtra( "value"0));
  25. else  if (intent.getAction().equals(ACTION_STOPPED)) {
  26. callbackData.setText( "STOPPED");
  27. }
  28. }
  29. };
  30. mLocalBroadcastManager.registerReceiver(mReceiver, filter);
  31. Button button = (Button) findViewById(R.id.start);
  32. button.setOnClickListener(mStartListener);
  33. button = (Button) findViewById(R.id.stop);
  34. button.setOnClickListener(mStopListener);
  35. }
  36. @Override
  37. protected void onDestroy() {
  38. super.onDestroy();
  39. mLocalBroadcastManager.unregisterReceiver(mReceiver);
  40. }
  41. private OnClickListener mStartListener =  new OnClickListener() {
  42. public void onClick(View v) {
  43. startService( new Intent(LocalServiceBroadcasterActivity. this, LocalService.class));
  44. }
  45. };
  46. private OnClickListener mStopListener =  new OnClickListener() {
  47. public void onClick(View v) {
  48. stopService( new Intent(LocalServiceBroadcasterActivity. this, LocalService.class));
  49. }
  50. };
  51. public  static  class LocalService extends Service {
  52. LocalBroadcastManager mLocalBroadcastManager;
  53. int mCurUpdate;
  54. static  final  int MSG_UPDATE =  1;
  55. Handler mHandler =  new Handler() {
  56. @Override
  57. public void handleMessage(Message msg) {
  58. switch (msg.what) {
  59. case MSG_UPDATE: {
  60. mCurUpdate++;
  61. Intent intent =  new Intent(ACTION_UPDATE);
  62. intent.putExtra( "value", mCurUpdate);
  63. mLocalBroadcastManager.sendBroadcast(intent);
  64. Message nmsg = mHandler.obtainMessage(MSG_UPDATE);
  65. mHandler.sendMessageDelayed(nmsg,  1000);
  66. }
  67. break;
  68. default:
  69. super.handleMessage(msg);
  70. }
  71. }
  72. };
  73. @Override
  74. public void onCreate() {
  75. super.onCreate();
  76. mLocalBroadcastManager = LocalBroadcastManager.getInstance( this);
  77. }
  78. public int onStartCommand(Intent intent, int flags, int startId) {
  79. // Tell any local interested parties about the start.
  80. mLocalBroadcastManager.sendBroadcast( new Intent(ACTION_STARTED));
  81. // Prepare to do update reports.
  82. mHandler.removeMessages(MSG_UPDATE);
  83. Message msg = mHandler.obtainMessage(MSG_UPDATE);
  84. mHandler.sendMessageDelayed(msg,  1000);
  85. return ServiceCompat.START_STICKY;
  86. }
  87. @Override
  88. public void onDestroy() {
  89. super.onDestroy();
  90. // Tell any local interested parties about the stop.
  91. mLocalBroadcastManager.sendBroadcast( new Intent(ACTION_STOPPED));
  92. // Stop doing updates.
  93. mHandler.removeMessages(MSG_UPDATE);
  94. }
  95. @Override
  96. public IBinder onBind(Intent intent) {
  97. return  null;
  98. }
  99. }
  100. }

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值