android 广播 之 本地广播

发送方:

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()注销。
  • 原因:
    1. 对于动态广播,有注册就必然得有注销,否则会导致内存泄露

重复注册、重复注销也不允许

 

对于不同注册方式的广播接收器回调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,完事!

参考:https://www.cnblogs.com/nylcy/p/6510819.html

            https://www.jianshu.com/p/ca3d87a4cdf3

你可能感兴趣的:(android1)