发送方:
1、定义变量:
private LocalBroadcastManager localBroadcastManager;
2、获取 LocalBroadcastManager 对象:
localBroadcastManager = LocalBroadcastManager.getInstance(context);
3、发送消息:
Intent mIntent = new Intent(USBService.ACTION_INTENT_RECEIVER);
mIntent.putExtra("message", "false");
localBroadcastManager.sendBroadcast(mIntent);
接收方:
1、声明对象:
private LocalBroadcastManager localBroadcastManager;
private LocalReceiver receiver;
2、注册接收:
localBroadcastManager = LocalBroadcastManager.getInstance(this);
receiver = new LocalReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_INTENT_RECEIVER);
localBroadcastManager.registerReceiver(receiver, filter);
return super.onStartCommand(intent, flags, startId);
3、销毁的时候解除注册:
@Override
public void onDestroy() {
super.onDestroy();
localBroadcastManager.unregisterReceiver(receiver);
}
4、写个继承BroadcastReceiver 的类:
private class LocalReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//Toast.makeText(context, "收到本地广播", Toast.LENGTH_SHORT).show();
Log.d(TAG, "收到本地广播");
if (intent.getAction().equals(ACTION_INTENT_RECEIVER)) {
...
}
}
}
注:对于LocalBroadcastManager方式发送的应用内广播,只能通过LocalBroadcastManager动态注册,不能静态注册
- 动态广播最好在
Activity
的onResume()
注册、onPause()
注销。 - 原因:
- 对于动态广播,有注册就必然得有注销,否则会导致内存泄露
重复注册、重复注销也不允许
对于不同注册方式的广播接收器回调OnReceive(Context context,Intent intent)中的context返回值是不一样的:
- 对于静态注册(全局+应用内广播),回调onReceive(context, intent)中的context返回值是:ReceiverRestrictedContext;
- 对于全局广播的动态注册,回调onReceive(context, intent)中的context返回值是:Activity Context;
- 对于应用内广播的动态注册(LocalBroadcastManager方式),回调onReceive(context, intent)中的context返回值是:Application Context。
- 对于应用内广播的动态注册(非LocalBroadcastManager方式),回调onReceive(context, intent)中的context返回值是:Activity Context;
默认情况下,广播接收器运行在 UI
线程,因此,onReceive()
方法不能执行耗时操作,否则将导致ANR
ok,完事!