Broadcast组件简析

Android四大组件之Broadcast Receiver Android四大组件之Broadcast Receiver 作者:白璐 日期:2020/2/23 文章目录Android四大组件之Broadcast Receiver概述广播接收器(Broadcast Receiver)Broadcast Receiver简介Broadcast Receiver的注册一. 静态注册二. 动态注册三. 本地广播发送Broadcast Receiver广播的三种... 阅读详情

本文学习拜读自罗升阳老师的《Android系统源代码情景分析》

涉及Binder

一 概述

在Android系统中,广播(Broadcast)是一种在组件之间进行消息传递的方式。这些组件可以运行在同一个进程中,也可以运行在不同的进程中。当两个不在同一个进程中的组件通过广播机制来传递消息的时候,广播机制就有点类似Binder进程间通信机制。事实上,广播机制就是在Binder机制的基础上实现的。

既然如此,Android系统为什么还需要广播机制呢?我们知道,在Binder进程间通信机制中,Client组件在好Service组件通信之前,必须要先获得它的一个代理对象,即Client组件实现要知道Service组件的存在。然而,在广播机制中,广播发送者事先并不需要知道广播接收者的存在,这样就可以降低广播发送者和广播接收者之间的耦合度,进而提高系统的可扩展性。因此, Android系统需要提供广播机制。

广播机制是一种基于消息发布和订阅的事件驱动模型,即广播发送者负责发布消息,而广播接受者需要先订阅消息,然后才能接收到消息。Android系统将广播接收者抽象为一种Boradcast Receiver组件,它是Android应用程序的四大组件之一。同时,Android应用程序的另外两种组件,即Activity组件和Service组件被赋予了发送广播的能力。因此,在Android系统中,使用广播机制在组件之间传递消息是很方便的。

广播机制存在一个注册中心,它是由ActivityManagerService来担当的。广播接收者订阅消息的表现形式就是将自己注册到ActivityManagerService中,并且指定要接收的广播类型。当广播发送者向广播接收者发送一个广播时,这个广播首先发送到ActivityManagerService然后ActivityManagerService根据这个广播的类型找到相应的广播接收者,最后将这个广播发送给他们处理。

广播接收者的的注册方式分为静态注册和动态注册两种方式。在静态注册方式中,用来描述广播接收者的Boradcast Receiver组件必须要在配置文件 AndroidManifest.xml中注册他们所感兴趣的广播类型,以便ActivityManagerService可以找到他们。在动态注册方式中。我们需要在代码中手动的调用 Context接口的成员函数registerReceiver将Boradcast Receiver组件注册到 ActivityManagerService中,Activity组件和Service组件都实现了Context接口,因此,我们可以方便的在一个Activity组件或者Service组件中注册一个Boradcast Receiver组件。同等情况下,动态注册的广播接收者要比静态注册的广播接收者优先接收到广播。

广播的发送方式分为有序和无序两种。我们在注册广播接收者时,可以指定它们的优先级。当ActivityManagerService接收有序
广播时,它就会先将这个有序广播发送给符合条件的,优先级较高的广播接收者处理,然后再发送给符合条件的,优先级较低的广播接收者处理,而当 ActivityManagerService 接收无序广播时,他就会忽略广播接收者的优先级,并行的将无序广播发送给所有符合条件的广播接收者处理。

二 广播机制应用实例

在前面的 Service组件分析实例中,我们开发了一个应用程序 Counter,它由一个Activity组件Counter和一个Service组件
CounterService组成。Counter组件在启动CounterService组件的计数器时,需要指定一个计数器回调接口 ICounterCallback,
以便 CounterService组件可以将计数器的当前计数实时的更新到Counter组件的用户界面上。这种数据更新方式存在一定的缺陷,因为这会使得CounterService组件依赖于Counter组件提供的计数器回调接口ICounterCallback。

本文开发一个名称为 Broadcounter的应用程序,它实现的功能与应用程序Counter是一样的,不过它使用广播机制来代替计数器回调接口ICounterCallback,使得CounterService组件不必依赖于Counter组件

应用程序Broadcounter的目录结构如下:

Android/packages/apps/Broadcounter

------AndroidManifest.xml
------Android.mk
------src
	------com/android/broadcounter
			------ICounterService.java
			------CounterService.java
			------Broadcounter.java
------res
	------layout
			------main.xml
	------values
			------strings.xml
	------drawable
			------icon.png

ICounterService

定义一个计数器接口ICounterService,用来启动和停止计数器。在启动计数器的时候,我们只需要指定计数器的初始值即可
而不必指定计数器回调接口。

package com.android.broadcounter;

public interface ICounterService {
	
	public void startCounter(int initVal);
	public void stopCounter();
}

CounterService.java

package com.android.broadcounter;
	 
import android.app.Service;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;

public class CounterService extends Service implements ICounterService {
	
private final static String LOG_TAG = "com.android.broadcounter.CounterService";

public final static String BROADCAST_COUNTER_ACTION = "com.android.broadcounter.COUNTER_ACTION";
public final static String COUNTER_VALUE = "com.android.broadcounter.counter.value";

private boolean stop = false;
private final IBinder binder = new CounterBinder();

public class CounterBinder extends Binder {
		public CounterService getService() {
				return CounterService.this;
			}
	}
	
public IBinder onBind(Intent intent) {
		return binder;
	}
	
@Override
public void onCreate() {
		super.onCreate();
		Log.i(LOG_TAG, "Counter Service Created");
	}
	
public void startCounter(int initVal) {
		
		AsyncTask<Integer, Integer, Integer> task = new AsyncTask<Integer, Integer, Integer> (){
				@Override
				protected Integer doInBackground(Integer... vals) {
						Integer initCounter = vals[0];
						
						stop = false;
						while(!stop){
								publishProgress(initCounter);
								
								try{
										Thread.sleep(1000);
									}catch(InterruptedException e) {
											e.printStackTrace();
									}
										
									initCounter++;	
							}
							
							return initCounter;
					}
					
				@Override	
				protected void onProgressUpdate(Integer... values){
						super.onProgressUpdate(values);
						
						int counter = values[0];
						Intent intent = new Intent(BROADCAST_COUNTER_ACTION);
						intent.putExtra(COUNTER_VALUE, counter);
						sendBroadcast(intent);
					}
				
				@Override	
				protected void onPostExecute(Integer val){
						int counter = val;
						Intent intent = new Intent(BROADCAST_COUNTER_ACTION);
						intent.putExtra(COUNTER_VALUE, counter);
						
						sendBroadcast(intent);
					}
				
			};
			
			task.execute(initVal);
}	
	
	public void stopCounter() {
			stop = true;
		}
}

该部分实现了一个CounterService组件,他也是通过异步任务(AsyncTask)来提供计数功能,并且该CounterService组件是通过
广播的形式将计数器的当前计数实时的更新打到Counter组件的用户界面上的。

在计数器的执行过程中,即在异步任务task的成员函数onProgressUpdate()函数中,CounterService组件会先将计数器的当前
计数值写入到一个类型为 BROADCAST_COUNTER_ACTION 的广播中,接着再调用其父类ContextWrapper的成员函数sendBroadcast()将这个广播发送出去,以便Counter组件可以接收到这个广播,并且获得里面的计数值。

同样,在计数器停止执行时,即在异步任务task的成员函数onPostExecute()中,CounterService组件也会先将计数器的最后计数值写入到一个类型为BROADCAST_COUNTER_ACTION 的广播中,接着再调用其父类ContextWrapper的成员函数sendBroadcast()将这个广播发送出去,以便Counter组件可以接收到这个广播,并且获得里面的计数值。

Broadcounter.java

package com.android.broadcounter;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class Broadcounter extends Activity implements OnClickListener {
	private final static String LOG_TAG = "com.android.broadcounter.Broadcounter";

private Button startButton = null;
private Button stopButton = null;
private TextView counterText = null;

private ICounterService counterService = null;

@Override	
public void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.main);
	
	startButton = (Button)findViewById(R.id.button_start);	
	stopButton = (Button)findViewById(R.id.button_stop);	
	counterText = (TextView)findViewById(R.id.textview_counter);
	
	startButton.setOnClickListener(this);
	stopButton.setOnClickListener(this);
	
	startButton.setEnabled(true);
	stopButton.setEnabled(false);
	
	Intent bindIntent = new Intent(Broadcounter.this, CounterService.class);
	bindService(bindIntent,ServiceConnection , Context.BIND_AUTO_CREATE);
	
	Log.i(LOG_TAG, "Broadcounter Activity Created");
		
	}
	
@Override		
public void onResume(){
	super.onResume();
	IntentFilter counterActionFilter = new IntentFilter(CounterService.BROADCAST_COUNTER_ACTION);
	registerReceiver(counterActionReceiver, counterActionFilter);
}	

@Override		
public void onPause(){
	super.onPause();
	unregisterReceiver(counterActionReceiver);
}	
	
	
@Override	
public void onClick(View v) {
	
	if(v.equals(startButton)) {
			if(counterService != null) {
					counterService.startCounter(0);
					startButton.setEnabled(false);
					stopButton.setEnabled(true);
				}
		}else if(v.equals(stopButton)) {
			if(counterService != null) {
					counterService.stopCounter();
					startButton.setEnabled(true);
					stopButton.setEnabled(false);
					
				}
			}
	}	
	
private ServiceConnection ServiceConnection  = new ServiceConnection() {
	
		public void onServiceConnected(ComponentName className, IBinder service) {
				counterService = ((CounterService.CounterBinder)service).getService();
				
				Log.i(LOG_TAG, "Counter Service Connected");
			}
			
		public void onServiceDisconnected(ComponentName className) {
			counterService = null;
			Log.i(LOG_TAG, "Counter Service Disconnected");
			}
	};
	
	
private BroadcastReceiver counterActionReceiver = new BroadcastReceiver() {
	public void onReceive(Context context, Intent intent) {
			int counter = intent.getIntExtra(CounterService.COUNTER_VALUE, 0);
			String text = String.valueOf(counter);
			counterText.setText(text);
		}
		
	};

}

此处代码实现了一个 Broadcounter组件,它在启动时,回调用bindService()来绑定 CounterService组件,以便可以获得它的
一个访问接口。并且这个Broadcounter组件是通过一个广播接收者来获得 CounterService组件内部的计数器的当前计数值。

Broadcounter组件在内部定义了一个广播接收者 counterActionReceiver,它是用来接收类型为 BROADCAST_COUNTER_ACTION 的广播的,以便可以获得CounterService组件的计数器的当前计数值,并且将它显示在用户界面上。

当 Broadcounter组件被激活时,即在它的成员函数onResume()中,它会调用其父类 ContextWrappe的成员函数registerReceiver()将广播接收者 counterActionReceiver 注册到 ActivityManagerService中,并且指定要接收的广播类型为 BROADCAST_COUNTER_ACTION

当Boradcounter组件被中止时,即在他的成员函数 onPause() 中,他会调用其父类 ContextWrappe的成员函数unregisterReceiver()来注销前面所注册的广播接收者counterActionReceiver,这亚航他就不会再接收到类型为 BROADCAST_COUNTER_ACTION的广播了。

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center">

<LinearLayout 
	android:layout_width ="fill_parent"
	android:layout_height="wrap_content"
	android:layout_marginBottom="10px"
	android:orientation="horizontal"
	android:gravity="center">

		    <TextView
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:layout_marginRight="4px"
			android:text="@string/counter"
			android:gravity="center">
			</TextView>
			
			<TextView
			android:id="@+id/textview_counter"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:gravity="center"
			android:text="@string/init_counter">
			</TextView>
</LinearLayout>			
						
<LinearLayout 
	android:layout_width ="fill_parent"
	android:layout_height="wrap_content"
	android:orientation="horizontal"
	android:gravity="center">		
				
		<Button
			android:id="@+id/button_start"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:gravity="center"
			android:text="@string/start" />

		<Button
			android:id="@+id/button_stop"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:gravity="center"
			android:text="@string/stop" />
</LinearLayout>

strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
	<string name="app_name">Broadcounter</string>
	<string name="counter">Counter:</string>
	<string name="init_counter">0</string>
	<string name="start">Start Counter</string>
	<string name="stop">Stop Counter</string>
</resources>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	package="com.android.broadcounter">
	
	<application 
			android:icon="@mipmap/icon"
			android:label="@string/app_name">
			
		<activity 
			android:name=".Broadcounter"
			android:label="@string/app_name">
			<intent-filter>
				<action android:name="android.intent.action.MAIN" />
				<category android:name="android.intent.category.LAUNCHER" />
			</intent-filter>
		</activity>
		
		<service
			android:name=".CounterService"
			android:enabled="true"
			android:exported="true">
		</service>
		
	</application>

Android.mk

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := My_Broadcounter
LOCAL_CERTIFICATE := platform
include $(BUILD_PACKAGE)
# Use the folloing include to make our test apk.
include $(call all-makefiles-under,$(LOCAL_PATH))

build/target/product/core.mk 中添加 My_Broadcounter

mmm packages/apps/Broadcounter/

在这里插入图片描述

Android组件--触发器组件Broadcast Receiver Android组件--触发器组件Broadcast Receiver 引言:第一次写专栏,就从Android四大组件的Broadcast Receiver开始,本人菜鸟水平,由于读了一本《Android开发精要》,号称高手修炼的书,所以想来分享一下,希望对那些真正的高手有帮助,并且一同学习; 本人目前还没完全使用到本书的知识,所以有些地方可能理解比较片面,甚至理解有误,还请大牛指教; 此文的 阅读详情

相关推荐

【Android】四大组件(Activity、Service、Broadcast Receiver、Content Provider)、结构目录

当 Activity 的启动模式为 singleTask 的时候,每次启动该 Activity 的时候系统会首先在返回栈中检查是否存在该 Activity 的实例,如果发现已经存在则直接使用该实例。假设你在当前的Activity中又要启动同类型的Activity,此时建议将此类型Activity的启动模式指定为SingleTop,能够降低Activity的创建,节省内存!standard 模式是 Activity 的默认启动模式,在不进行显示指定的情况下,所有 Activity 都会自动使用这种启动模式。

xzzteach的博客 2111

Android广播-个人总结

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34077371的博客 132

broadcast功能大集合

broadcast; 通过broadcast开机启动service; sendorderedbroadcast; broadcast生命周期; 权限控制启动;

有序广播和无序广播

在Android系统中,根据广播的执行顺序不同,可将其分为有序广播和无序广播。 1.无序广播 无序广播是一种完全异步执行的广播,在广播发出去之后,所有监听这个广播事件的广播接收器几乎都会在同一时刻接收到这条广播,它们之间没有先后顺序可言,这种广播的效率会比较高,但同时也意味着它是无法被截断的。 2.有序广播 有序广播是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够接

qq_37739720的博客 3646

Android四大组件简述

Android四大组件简述demo用例。

群晖NAS搭建Git Server避坑指南:从SSH配置到权限管理的完整流程

本文提供了一份详尽的群晖NAS搭建Git Server实战指南。文章从启用并安全配置SSH服务入手,深入解析了用户权限体系设计、SSH连接与仓库初始化、客户端SSH密钥配置等核心步骤,并提供了常见错误排查与生产环境加固方案,帮助开发者成功构建私有、安全的代码托管平台。

rock5的博客 420

Android 四大组件 -- BroadcastReceiver(广播)

Android 四大组件 -- BroadcastReceiver(广播)

afufufufu的博客 899

别再让地图加载慢吞吞!GeoServer + GeoWebCache 缓存配置实战(附性能对比)

本文详细介绍了如何通过GeoServer和GeoWebCache优化地图服务性能,实现地图加载速度的显著提升。从缓存机制解析到实战配置流程,再到高级性能调优技巧,帮助开发者构建高效地图缓存系统,解决地图加载慢的问题。

weixin_42525369的博客 407

Broadcast组件研究

Broadcast组件研究注册简介广播分为三种: 普通广播:这种广播可以依次传递给各个处理器去处理 有序广播:这种广播在处理器端的处理顺序是按照处理器的不同优先级来区分的,高优先级的处理器会优先截获这个消息,并且可以将这个消息删除 粘性广播:粘性消息在发送后就一直存在于系统的消息容器里面,等待对应的处理器去处理,如果暂时没有处理器处理这个消息则一直在消息容器里面处于等待状态,粘性广播的Rece

大象杂货 4511

3D Slicer:从入门到精通(二)——入门指南

本篇文章包含开始使用3D Slicer所需的信息,包括如何安装和快速开始使用基本功能,以及在哪里找到更多信息。

walt3433的博客 2万+

一文吃透 BMS:动力电池与储能共用的电池管控全架构详解

BMS作为电池系统的核心控制器,其技术深度和系统复杂性不容小觑。动力电池与储能系统虽然应用场景不同,但在核心架构上共享大量基础技术。成功的BMS设计需要在精度、可靠性、成本、功耗之间找到最佳平衡点。未来,随着电池技术的进步和智能化需求的提升,BMS将向着更高集成度、更强智能化、更优经济性的方向发展。无论是汽车工程师还是储能系统设计师,深入理解BMS的全栈架构,掌握其核心技术原理,都将是应对未来能源存储挑战的关键能力。核心要点回顾BMS采用分层分布式架构,硬件是基础,算法是灵魂。

小帽子的博客 339

四大组件——广播

全局大喇叭,可以启动本机其他应用中的activity。应用不需要打开就可以接受的通知。

刚好的博客 311

DBT关键切片重建算法

DBT通过有限角度(通常15°~50°)扫描,获取一系列低剂量投影图,重建出三维断层图像。传统FBP在稀疏角度下会产生严重的“伪影拖尾”和层间干扰。临床诊断中,放射科医生往往只关注几层关键切片(即病灶所在层),其余层仅作参考。

AI的内部世界的博客 89

Android四大组件:Broadcast

Android广播机制分为标准广播和有序广播。标准广播完全异步,所有接收器同时接收,效率高但不可截断;有序广播同步执行,按优先级顺序传递,可被前序接收器截断。系统广播可通过动态或静态注册监听,动态注册需在代码中创建接收器并关联IntentFilter,静态注册则在Manifest文件中声明,可实现开机启动等功能。自定义广播接收器需继承BroadcastReceiver并重写onReceive()方法。标准广播的发送和接收示例展示了基本的实现流程,而有序广播允许优先级控制和广播截断。

giaoho的博客 2142

Qt Quick (QML) 老年人健康管理

通过 **Qt SQL** 模块将所有健康数据(用药记录、体检数据等)安全地存储在本地 **SQLite** 数据库中。你想用 **Qt C++** 结合 **Qt Quick** (QML) 来开发一个老年人健康管理软件,主要功能包含 **用药提醒** 和 **健康记录** (使用 `Qt SQL` 存储数据)。* **UI 框架**: Qt Quick (QML) - 用于构建流畅、动态的用户界面。**数据模型类 (models/MedicationReminder.h / .cpp)**

寒寒豆豆软件公司的博客 193

【SpringBoot 3.x 第43节】你还敢说 Spring 启动慢是“宿命”?Spring AOT 把启动剧本都提前写死了,你服不服?

🏆本文收录于《滚雪球学SpringBoot 3》,专门攻坚指数提升,本年度国内最系统+最专业+最详细(永久更新)。

**My Coding Family** 540

第9章 广播组件Broadcast

广播发出来之后,还得有设备去接收广播,也就是需要广播接收器。接收器主要规定两个事情,一个是接收什么样的广播,另一个是收到广播以后要做什么。由于接收器的处理逻辑大同小异,因此Android提供了抽象之后的接收器基类BroadcastReceiver,开发者自定义的接收器都从BroadcastReceiver派生而来。新定义的接收器需要重写onReceive方法,方法内部先判断当前广播是否符合待接收的广播名称,校验通过再开展后续的业务逻辑。

L念安dd的博客 1059

【Go语言实战】(2) Gin+Vue 电子商城

618来!!不用纠结去哪里剁手了!直接自己安排一个商场不香吗??

面向生活编程 4827

Android四大组件--Broadcast介绍

Android中所讲的广播(Broadcast)和生活中的广播一样,比如地铁每到一站就会播报当前的站信息,地铁上的乘客都可以听到,但乘客一般只关心广播播报的是不是与自己目的地相同(选择性接收广播信息),这就是Android中的标准广播;另一种为有序广播,与标准广播的一次发送,所有人同时收到不同,有序广播的接收者具有优先级,然找优先级由高到低的顺序依次接收广播,高优先级的接收者可以阻断广播继续传播。

qq_39708261的博客 1512

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Android-Broadcast组件及demo

"com.example.broadcastapp":创建的包名;"CUSTOM_BROADCAST_ACTION":自定义广播动作,用于Intent和IntentFilter匹配对应动作。// 自定义广播接收器// Note:定义和注册是两回事,这里单独定义接收器,再在主活动中注册@Override当Intent获得的Action与自定义的广播动作(MyConstants.CUSTOM_BROADCAST_ACTION)匹配时(equals。

ArthurZQJ的博客 977

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

说说element组件库broadcast与dispatch

周所周知,Vue在2.0版本中去除了broadcast方法以及broadcast方法以及dispatch方法,最近在学习饿了么的Element时重新实现了这两种方法,并以minix的方式引入。看一下源代码function broadcast(componentName, eventName, params) { /*遍历当前节点下的所有子组件*/ this.$children.forEach

心暖未晴 2370

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

父组件向子组件广播事件broadcast(vue2.0)

应用场景:当父组件需要触发子组件的事件时,可以使用broadcast。(父组件中有头部搜索条件,子组件渲染搜索结果,当父组件点击了搜索按钮,那么父组件所有的子组件需要请求后台,重新渲染搜索结果) 父组件: <template> <div class="search-item"> <Button type="primary" size="large" @click.stop="searchevent">查询</Button> </

Yetian_2000的博客 1309

Android四大组件基础学习之Broadcast Receiver

Android四大组件基础学习之Broadcast Receiver

Y3036359510的博客 977

android四大组件之Broadcast(广播)使用详解

一 概述 Broadcast作为android中的四大组件,其重要性可想而知, 在android系统中,广播(Broadcast)是在组件之间传播数据(Intent)的一种机制;这些组件甚至是可以位于不同的进程中,这样它就像Binder机制一样,起到进程间通信的作用。android广播机制,本质上它就是一种组件间的通信方式,如果是两个组件位于不同的进程当中,那么可以用Binder机制来实现,如果

码猿同学 6703

vue2组件通信-使用dispatch和broadcast

vue2组件通信-使用dispatch和broadcast 最近在使用Element过程中发现组件通信大量使用dispatch和broadcast两个方法,之前在vue2 组件通信也提到过 vue2 中取消了$dispatch和$broadcast两个重要的事件,而 Element 重新实现了这两个函数。 代码地址放在element-ui/lib/mixins/emi...

zhangx 1728

Vue2组件通信 - dispatch 和 broadcast

Vue2组件通信之dispatch 和 broadcast 的原理和举例。

qq_40147756的博客 998
上一篇: Service组件简析
下一篇: 串口,com口,ttl,max232
Ma浩然
博客等级 码龄9年 1万+粉丝 462原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ma浩然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值