当前位置: 首页 > news >正文

做网站的哪家公司好局域网创建网站

做网站的哪家公司好,局域网创建网站,买了万网的域名跟定制网站还要买空间吗,有限公司注册要求Binder Binder框架概述服务端Binder驱动客户端 设计服务端和客户端设计服务端客户端设计 Binder与ServiceServiceAIDL 保证包裹内参数顺序IMusicPlayerServiceProxyStub 系统服务中的Binder对象ServiceManger管理的服务理解Manger功能快捷键合理的创建标题#xff0c;有助于目… Binder Binder框架概述服务端Binder驱动客户端 设计服务端和客户端设计服务端客户端设计 Binder与ServiceServiceAIDL 保证包裹内参数顺序IMusicPlayerServiceProxyStub 系统服务中的Binder对象ServiceManger管理的服务理解Manger功能快捷键合理的创建标题有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 Binder框架概述 Binder是一种架构这种架构提供了服务端接口、Binder驱动、客户端接口三个模块如图所示。 服务端 首先来看服务端。一个Binder服务端实际上就是一个Binder类的对象该对象一旦创建内部就启动一个隐藏线程。 该线程接下来会接收Binder驱动发送的消息收到消息后会执行到Binder对象中的onTransact()函数并按照该函数的参数执行不同的服务函数。因此要实现一个Binder服务就必须重载onTransact()方法。 重载onTransact()函数的主要内容是把onTransact()函数的参数转换为服务函数的参数而onTransact()函数的参数来源是客户端调用transact()函数时输入的因此如果transact()有固定格式的输入那么onTransact()就会有固定格式的输出。 Binder驱动 任意一个服务端Binder对象被创建时同时会在Binder驱动中创建一个mRemote对象该对象的类型也是Binder类。客户端要访问远程服务时都是通过mRemote对象。 客户端 客户端要想访问远程服务必须获取远程服务在Binder驱动中对应的mRemote引用。获得该mRemote对象后就可以调用其transact()方法而在Binder驱动中mRemote对象也重载了transact()方法重载的内容主要包括以下几项。 以线程间消息通信的模式向服务端发送客户端传递过来的参数。 挂起当前线程当前线程正是客户端线程并等待服务端线程执行完指定服务函数后通知(notify)。 接收到服务端线程的通知然后继续执行客户端线程并返回到客户端代码区。 从这里可以看出对应用程序开发员来讲客户端似乎是直接调用远程服务对应的Binder而事实上则是通过Binder驱动进行了中转。即存在两个Binder对象一个是服务端的Binder对象另一个则是Binder驱动中的Binder对象所不同的是Binder驱动中的对象不会再额外产生一个线程。 客户端如何获取到Binder驱动中对应的mRemote引用 Binder驱动如何发送消息到服务端 设计服务端和客户端 设计服务端 服务端是一个Binder类对象只要基于Binder类新建一个Server类即可。以下以设计一个MusicPlayerService类为例。 假设该Service仅提供两个方法start(String filePath)和stop()那么该类的代码可以如下 public class MusicPlayerService extends Binder {Overrideprotected boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException {switch (code) {case 1000:data.enforceInterface(MusicPlayerService);String filePath data.readString();start(filePath);// replay.writeXXX();break;}return super.onTransact(code, data, reply, flags);}public void start(String filePath) {}public void stop() {} }code变量是客户端和服务端约定好的用于标识客户端期望调用服务端的哪个函数 这里假定1000是双方约定要调用start()函数的值。 enforceInterface()是为了某种校验它与客户端的writeInterfaceToken()对应。 readString()用于从包裹中取出一个字符串。取出filePath变量后就可以调用服务端的start()函数了。 如果该客户端期望服务端返回一些结果则可以在返回包裹reply中调用Parcel提供的相关函数写入相应的结果。 当要启动该服务时只需要初始化一个MusicPlayerService对象即可。比如可以在主Activity里面初始化一个MusicPlayerService然后运行此时可以发现多运行了一个线程Binder-Thread3。 如果不创建MusicPlayerService则只有2个Binder对象对应的线程。即Binder-Thread1 和 Binder-Thread2。 这两个进程是怎么来的 客户端设计 要想使用服务端首先要获取服务端在Binder驱动中对应的mRemote变量的引用。获得该变量的引用后就可以调用该变量的transact()方法。该方法的函数原型如下 public final boolean transact(int code, Parcel data, Parcel reply,int flags) 其中data表示的是要传递给远程Binder服务的包裹(Parcel)远程服务函数所需要的参数必须放入这个包裹中。包裹中只能放入特定类型的变量这些类型包括常用的原子类型比如String、int、long等。除了一般的原子变量外Parcel还提供了一个writeParcel()方法可以在包裹中包含一个小包裹。因此要进行Binder远程服务调用时服务函数的参数要么是一个原子类要么必须继承于Parcel类否则是不能传递的。 因此对于MusicPlayerService的客户端而言可以如下调用transact()方法。 IBinder mRemote null;String filePath /sdcard/music/heal_the_world.mp3;int code 1000;Parcel data Parcel.obtain();Parcel reply Parcel.obtain();data.writeInterfaceToken(MusicPlayerService);data.writeString(filePath);mRemote.transact(code, data, reply, 0);IBinder binder reply.readStrongBinder();reply.recycle();data.recycle();首先包裹不是客户端自己创建的而是调用Parcel.obtain()申请的。 data和reply变量都由客户端提供reply变量用户服务端把返回的结果放入其中。 writeInterfaceToken()方法标注远程服务名称理论上讲这个名称不是必需的因为客户端既然已经获取指定远程服务的Binder引用那么就不会调用到其他远程服务。该名称将作为Binder驱动确保客户端的确想调用指定的服务端。 writeString()方法用于向包裹中添加一个String变量。注意包裹中添加的内容是有序的这个顺序必须是客户端和服务端事先约定好的在服务端的onTransact()方法中会按照约定的顺序取出变量。 接着调用transact()方法。调用该方法后 客户端线程进入Binder驱动Binder驱动就会挂起当前线程并向远程服务发送一个消息消息中包含了客户端传进来的包裹。服务端拿到包裹后会对包裹进行拆解然后执行指定的服务函数执行完毕后再把执行结果放入客户端提供的reply包裹中。然后服务端向Binder驱动发送一个notify的消息从而使得客户端线程从Binder驱动代码区返回到客户端代码区。 transact()的最后一个参数的含义是执行IPC调用的模式分为两种一种是双向用常量0表示其含义是服务端执行完指定服务后会返回一定的数据另一种是单向用常量1表示其含义是不返回任何数据。 最后客户端就可以从reply中解析返回的数据了同样返回包裹中包含的数据也必须是有序的而且这个顺序也必须是服务端和客户端事先约定好的。 Binder与Service 以上手工编写Binder服务端和客户端的过程存在两个重要问题。 第一客户端如何获得服务端的Binder对象引用。 第二客户端和服务端必须事先约定好两件事情 服务端函数的参数在包裹中的顺序。 服务端不同函数的int型标识。也就是transact方法中的code参数的值。 Service 那么Service类是如何解决本节开头所提出的两个重要问题的呢 首先AmS提供了startService()函数用于启动客户服务而对于客户端来讲可以使用以下两个函数来和一个服务建立连接其原型在android.app. ContextImpl类中。 Overridepublic ComponentName startService(Intent service) {try {ComponentName cn ActivityManagerNative.getDefault().startService(mMainThread.getApplicationThread(), service,service.resolveTypeIfNeeded(getContentResolver()));if (cn ! null cn.getPackageName().equals(!)) {throw new SecurityException(Not allowed to start service service without permission cn.getClassName());}return cn;} catch (RemoteException e) {return null;}}该函数用于启动intent指定的服务而启动后客户端暂时还没有服务端的Binder引用因此暂时还不能调用任何服务功能。 Overridepublic boolean bindService(Intent service, ServiceConnection conn,int flags) {IServiceConnection sd;if (mPackageInfo ! null) {sd mPackageInfo.getServiceDispatcher(conn, getOuterContext(),mMainThread.getHandler(), flags);} else {throw new RuntimeException(Not supported in system context);}try {int res ActivityManagerNative.getDefault().bindService(mMainThread.getApplicationThread(), getActivityToken(),service, service.resolveTypeIfNeeded(getContentResolver()),sd, flags);if (res 0) {throw new SecurityException(Not allowed to bind to service service);}return res ! 0;} catch (RemoteException e) {return false;}}该函数用于绑定一个服务这就是第一个重要问题的关键所在。其中第二个参数是一个interface类该interface的定义如以下代码所示 /*** Interface for monitoring the state of an application service. See* {link android.app.Service} and* {link Context#bindService Context.bindService()} for more information.* pLike many callbacks from the system, the methods on this class are called* from the main thread of your process.*/ public interface ServiceConnection {/*** Called when a connection to the Service has been established, with* the {link android.os.IBinder} of the communication channel to the* Service.** param name The concrete component name of the service that has* been connected.** param service The IBinder of the Services communication channel,* which you can now make calls on.*/public void onServiceConnected(ComponentName name, IBinder service);public void onServiceDisconnected(ComponentName name); }请注意该interface中的onServiceConnected()方法的第二个变量Service。当客户端请求AmS启动某个Service后该Service如果正常启动那么AmS就会远程调用ActivityThread类中的ApplicationThread对象调用的参数中会包含Service的Binder引用然后在ApplicationThread中会回调bindService中的conn接口。因此在客户端中可以在onServiceConnected()方法中将其参数Service保存为一个全局变量从而在客户端的任何地方都可以随时调用该远程服务。这就解决了第一个重要问题即客户端如何获取远程服务的Binder引用。 AIDL 保证包裹内参数顺序 关于第二个问题Android的SDK中提供了一个aidl工具该工具可以吧一个aidl文件转换为一个Java类文件在该Java类文件同时重载了transact和onTransact()方法统一了存入包裹和读取包裹参数从而使设计者可以把注意力放到服务代码本身上。 接下来看aidl工具都做了什么。如本章第一节示例此处依然假设要编写一个MusicPlayerService服务服务中包含两个服务函数分别是start()和stop()。那么可以首先编写一个IMusicPlayerService.aidl文件。如以下代码所示 package com.haiii.android.client; interface IMusicPlayerService{ boolean start(String filePath); void stop(); } 该文件的名称必须遵循一定的规范第一个字母I不是必需的但是为了程序风格的统一I的含义是IInterface类即这是一个可以提供访问远程服务的类。后面的命名–MusicPlayerService对应的是服务的类名可以是任意的但是aidl工具会以该名称命名输出的Java类。 aidl文件的语法基本类似于Javapackage指定输出后的Java文件对应的包名。如果该文件需要引用其他Java类则可以使用import关键字但需要注意的是包裹内只能写入以下三个类型的内容 Java原子类型如int、long、String等变量。Binder引用。实现了Parcelable的对象。 因此基本上来讲import所引用的Java类也只能是以上三个类型。 interface为关键字有时会在interface前面加一个oneway代表该service提供的方法都是没有返回值的即都是void类型。 下面看看该aidl生成的IMusicPlayerService.java文件的代码。如下所示 package com.haiii.client;public interface IMusicPlayerService extends android.os.IInterface {/*** Local-side IPC implementation stub class.*/public static abstract class Stub extends android.os.Binderimplements com.haiii.client.IMusicPlayerService {private static final java.lang.String DESCRIPTOR com.haiii.client.IMusicPlayerService;/*** Construct the stub at attach it to the interface.*/public Stub() {this.attachInterface(this, DESCRIPTOR);}/*** Cast an IBinder object into an com.haiii.client.IMusicPlayerService interface,* generating a proxy if needed.*/public static com.haiii.client.IMusicPlayerServiceasInterface(android.os.IBinder obj) {if ((obj null)) {return null;}android.os.IInterface iin (android.os.IInterface) obj.queryLocalInterface(DESCRIPTOR);if (((iin ! null) (iin instanceof com.haiii.client.IMusicPlayerService))) {return ((com.haiii.client.IMusicPlayerService) iin);}return new com.haiii.client.IMusicPlayerService.Stub.Proxy(obj);}public android.os.IBinder asBinder() {return this;}Overridepublic boolean onTransact(int code, android.os.Parcel data,android.os.Parcel reply, int flags) throws android.os.RemoteException {switch (code) {case INTERFACE_TRANSACTION: {reply.writeString(DESCRIPTOR);return true;}case TRANSACTION_start: {data.enforceInterface(DESCRIPTOR);java.lang.String _arg0;_arg0 data.readString();boolean _result this.start(_arg0);reply.writeNoException();reply.writeInt(((_result) ? (1) : (0)));return true;}case TRANSACTION_stop: {data.enforceInterface(DESCRIPTOR);this.stop();reply.writeNoException();return true;}}return super.onTransact(code, data, reply, flags);}private static class Proxy implements com.haiii.client.IMusicPlayerService {private android.os.IBinder mRemote;Proxy(android.os.IBinder remote) {mRemote remote;}public android.os.IBinder asBinder() {return mRemote;}public java.lang.String getInterfaceDescriptor() {return DESCRIPTOR;}public boolean start(java.lang.String filePath) throws android.os.RemoteException {android.os.Parcel _data android.os.Parcel.obtain();android.os.Parcel _reply android.os.Parcel.obtain();boolean _result;try {_data.writeInterfaceToken(DESCRIPTOR);_data.writeString(filePath);mRemote.transact(Stub.TRANSACTION_start, _data, _reply, 0);_reply.readException();_result (0 ! _reply.readInt());} finally {_reply.recycle();_data.recycle();}return _result;}public void stop() throws android.os.RemoteException {android.os.Parcel _data android.os.Parcel.obtain();android.os.Parcel _reply android.os.Parcel.obtain();try {_data.writeInterfaceToken(DESCRIPTOR);mRemote.transact(Stub.TRANSACTION_stop, _data, _reply, 0);_reply.readException();} finally {_reply.recycle();_data.recycle();}}}static final int TRANSACTION_start (android.os.IBinder.FIRST_CALL_TRANSACTION 0);static final int TRANSACTION_stop (android.os.IBinder.FIRST_CALL_TRANSACTION 1);}public boolean start(java.lang.String filePath) throws android.os.RemoteException;public void stop() throws android.os.RemoteException; } 这些代码主要完成以下三个任务。 IMusicPlayerService 定义一个Java interface内部包含aidl文件所声明的服务函数类名称为IMusicPlayerService并且该类基于IInterface接口即需要提供一个asBinder()函数。 Proxy 定义一个Proxy类该类将作为客户端程序访问服务端的代理。所谓的代理主要就是为了前面所提到的第二个重要问题–统一包裹内写入参数的顺序。 Stub 定义一个Stub类这是一个abstract类基于Binder类并且实现了IMusicPlayerService接口主要由服务端来使用。该类之所以要定义为一个abstract类是因为具体的服务函数必须由程序员实现因此IMusicPlayerService接口中定义的函数在Stub类中可以没有具体实现。同时在Stub类中重载了onTransact()方法由于transact()方法内部给包裹内写入参数的顺序是由aidl工具定义的因此在onTransact()方法中aidl工具自然知道应该按照何种顺序从包裹中取出相应参数。 在Stub类中还定义了一些int常量比如TRANSACTION_start这些常量与服务函数对应transact()和onTransact()方法的第一个参数code的值即来源于此。 在Stub类中除了以上所述的任务外Stub还提供了一个asInterface()函数。提供这个函数的作用是这样的 提供这个函数的原因是服务端提供的服务除了其他进程可以使用外在服务进程内部的其他类也可以使用该服务对于后者显然是不需要经过IPC调用而可以直接在进程内部调用的而Binder内部有一个queryLocalInterfaceString description函数该函数是根据输入的字符串判断该Binder对象是否是一个本地的Binder引用。 创建服务时服务端进程内部创建一个Binder对象Binder驱动中也会创建一个Binder对象。如果从客户端进程获取服务端进程的Binder则只会返回Binder驱动中的Binder对象而如果从服务端进程内部获取Binder对象则会获取服务端本身的Binder对象。 因此asInterface()函数正是利用了queryLocalInterface()方法提供了一个统一的接口。无论是远程客户端还是服务端内部进程当获取Binder对象后可以把获取的Binder对象作为asInterface()的参数从而返回一个IMusicPlayerService接口该接口要么使用Proxy类要么直接使用Stub所实现的相应服务函数。 系统服务中的Binder对象 在应用程序中经常使用getSystemServiceString serviceName方法获取一个系统服务那么这些系统服务的Binder引用是如何传递给客户端的呢 须知系统服务并不是通过startService()启动的。getSystemService()函数的实现是在ContextImpl类中该函数所返回的Service比较多具体可参照源码。这些Service一般都由ServiceManager管理。 ServiceManger管理的服务 ServiceManager是一个独立进程其作用如名称所示管理各种系统服务管理的逻辑如下 ServiceManager本身也是一个ServiceFramework提供了一个系统函数可以获取该Service对应的Binder引用那就是BinderInternal.getContextObject()。 该静态函数返回ServiceManager后就可以通过ServiceManager提供的方法获取其他系统Service的Binder引用。 其他系统服务在启动时首先把自己的Binder对象传递给ServiceManager即所谓的注册addService。 下面查看获取一个Service{IMPUT_METHOD_SERVICE} if (INPUT_METHOD_SERVICE.equals(name)) {return InputMethodManager.getInstance(this);static public InputMethodManager getInstance(Looper mainLooper) {synchronized (mInstanceSync) {if (mInstance ! null) {return mInstance;}IBinder b ServiceManager.getService(Context.INPUT_METHOD_SERVICE);IInputMethodManager service IInputMethodManager.Stub.asInterface(b);mInstance new InputMethodManager(service, mainLooper);}return mInstance;}即通过ServiceManager获取InputMethod Service对应的Binder对象b然后再将该Binder对象作为IInputMethodManager.Stub.asInterface()的参数返回一个IInputMethodManager的统一接口。 ServiceManager.getService()的代码如下 public static IBinder getService(String name) {try {IBinder service sCache.get(name);if (service ! null) {return service;} else {return getIServiceManager().getService(name);}} catch (RemoteException e) {Log.e(TAG, error in getService, e);}return null;}即首先从sCache 缓存中查看是否有对应的Binder 对象有则返回没有则调用getIServiceManager().getService(name)函数getIServiceManager()即用于返回系统中唯一的ServiceManager对应的Binder其代码如下 private static IServiceManager getIServiceManager() {if (sServiceManager ! null) {return sServiceManager;}// Find the service managersServiceManager ServiceManagerNative.asInterface(BinderInternal.getContextObject());return sServiceManager;}BinderInternal.getContextObject()静态函数即用于返回ServiceManager对应的全局Binder对象该函数不需要任何参数因为它的作用是固定的。其他所有通过ServiceManager获取的系统服务的过程与以上基本类似所不同的就是传递给ServiceManager的服务名称不同因为ServiceManager正是按照服务的名称String类型来保存不同的Binder对象的。 使用addService()向ServiceManager中添加一个服务一般是在SystemService进程启动时完成的。 理解Manger ServiceManager所管理的所有Service都是以相应的Manager返回给客户端因此这里简述一下Framework中关于Manager的语义。 在Android中Manager的含义更应该翻译为经纪人Manager所manage的对象是服务本身因为每个具体的服务一般都会提供多个API接口 而Manager所manage的正是这些API。 客户端一般不能直接通过Binder引用去访问具体的服务它需要先通过ServiceManager获取远程服务的Binder引用然后使用这个Binder引用构造一个客户端本地可以访问的经纪人比如前面的IInputMethodManager然后客户端就可以通过该经纪人访问远程的服务。 通过本地Manger访问远程服务的模型图如下 全新的界面设计 将会带来全新的写作体验在创作中心设置你喜爱的代码高亮样式Markdown 将代码片显示选择的高亮样式 进行展示增加了 图片拖拽 功能你可以将本地的图片直接拖拽到编辑区域直接展示全新的 KaTeX数学公式 语法增加了支持甘特图的mermaid语法1 功能增加了 多屏幕编辑 Markdown文章功能增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能功能按钮位于编辑区域与预览区域中间增加了 检查列表 功能。 功能快捷键 撤销Ctrl/Command Z 重做Ctrl/Command Y 加粗Ctrl/Command B 斜体Ctrl/Command I 标题Ctrl/Command Shift H 无序列表Ctrl/Command Shift U 有序列表Ctrl/Command Shift O 检查列表Ctrl/Command Shift C 插入代码Ctrl/Command Shift K 插入链接Ctrl/Command Shift L 插入图片Ctrl/Command Shift G 查找Ctrl/Command F 替换Ctrl/Command G 合理的创建标题有助于目录的生成 直接输入1次#并按下space后将生成1级标题。 输入2次#并按下space后将生成2级标题。 以此类推我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。 如何改变文本的样式 强调文本 强调文本 加粗文本 加粗文本 标记文本 删除文本 引用文本 H2O is是液体。 210 运算结果是 1024. 插入链接与图片 链接: link. 图片: 带尺寸的图片: 居中的图片: 居中并且带尺寸的图片: 当然我们为了让用户更加便捷我们增加了图片拖拽功能。 如何插入一段漂亮的代码片 去博客设置页面选择一款你喜欢的代码片高亮样式下面展示同样高亮的 代码片. // An highlighted block var foo bar;生成一个适合你的列表 项目 项目 项目 项目1项目2项目3 计划任务 完成任务 创建一个表格 一个简单的表格是这么创建的 项目Value电脑$1600手机$12导管$1 设定内容居中、居左、居右 使用:---------:居中 使用:----------居左 使用----------:居右 第一列第二列第三列第一列文本居中第二列文本居右第三列文本居左 SmartyPants SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如 TYPEASCIIHTMLSingle backticksIsnt this fun?‘Isn’t this fun?’QuotesIsnt this fun?“Isn’t this fun?”Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash 创建一个自定义列表 Markdown Text-to- HTML conversion tool Authors John Luke 如何创建一个注脚 一个具有注脚的文本。2 注释也是必不可少的 Markdown将文本转换为 HTML。 KaTeX数学公式 您可以使用渲染LaTeX数学表达式 KaTeX: Gamma公式展示 Γ ( n ) ( n − 1 ) ! ∀ n ∈ N \Gamma(n) (n-1)!\quad\forall n\in\mathbb N Γ(n)(n−1)!∀n∈N 是通过欧拉积分 Γ ( z ) ∫ 0 ∞ t z − 1 e − t d t . \Gamma(z) \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)∫0∞​tz−1e−tdt. 你可以找到更多关于的信息 LaTeX 数学表达式here. 新的甘特图功能丰富你的文章 #mermaid-svg-2HGaSBPV9dMyHeb8 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-2HGaSBPV9dMyHeb8 .error-icon{fill:#552222;}#mermaid-svg-2HGaSBPV9dMyHeb8 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-2HGaSBPV9dMyHeb8 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-2HGaSBPV9dMyHeb8 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-2HGaSBPV9dMyHeb8 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-2HGaSBPV9dMyHeb8 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-2HGaSBPV9dMyHeb8 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-2HGaSBPV9dMyHeb8 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-2HGaSBPV9dMyHeb8 .marker.cross{stroke:#333333;}#mermaid-svg-2HGaSBPV9dMyHeb8 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-2HGaSBPV9dMyHeb8 .mermaid-main-font{font-family:"trebuchet ms",verdana,arial,sans-serif;font-family:var(--mermaid-font-family);}#mermaid-svg-2HGaSBPV9dMyHeb8 .exclude-range{fill:#eeeeee;}#mermaid-svg-2HGaSBPV9dMyHeb8 .section{stroke:none;opacity:0.2;}#mermaid-svg-2HGaSBPV9dMyHeb8 .section0{fill:rgba(102, 102, 255, 0.49);}#mermaid-svg-2HGaSBPV9dMyHeb8 .section2{fill:#fff400;}#mermaid-svg-2HGaSBPV9dMyHeb8 .section1,#mermaid-svg-2HGaSBPV9dMyHeb8 .section3{fill:white;opacity:0.2;}#mermaid-svg-2HGaSBPV9dMyHeb8 .sectionTitle0{fill:#333;}#mermaid-svg-2HGaSBPV9dMyHeb8 .sectionTitle1{fill:#333;}#mermaid-svg-2HGaSBPV9dMyHeb8 .sectionTitle2{fill:#333;}#mermaid-svg-2HGaSBPV9dMyHeb8 .sectionTitle3{fill:#333;}#mermaid-svg-2HGaSBPV9dMyHeb8 .sectionTitle{text-anchor:start;font-family:'trebuchet ms',verdana,arial,sans-serif;font-family:var(--mermaid-font-family);}#mermaid-svg-2HGaSBPV9dMyHeb8 .grid .tick{stroke:lightgrey;opacity:0.8;shape-rendering:crispEdges;}#mermaid-svg-2HGaSBPV9dMyHeb8 .grid .tick text{font-family:"trebuchet ms",verdana,arial,sans-serif;fill:#333;}#mermaid-svg-2HGaSBPV9dMyHeb8 .grid path{stroke-width:0;}#mermaid-svg-2HGaSBPV9dMyHeb8 .today{fill:none;stroke:red;stroke-width:2px;}#mermaid-svg-2HGaSBPV9dMyHeb8 .task{stroke-width:2;}#mermaid-svg-2HGaSBPV9dMyHeb8 .taskText{text-anchor:middle;font-family:'trebuchet ms',verdana,arial,sans-serif;font-family:var(--mermaid-font-family);}#mermaid-svg-2HGaSBPV9dMyHeb8 .taskTextOutsideRight{fill:black;text-anchor:start;font-family:'trebuchet ms',verdana,arial,sans-serif;font-family:var(--mermaid-font-family);}#mermaid-svg-2HGaSBPV9dMyHeb8 .taskTextOutsideLeft{fill:black;text-anchor:end;}#mermaid-svg-2HGaSBPV9dMyHeb8 .task.clickable{cursor:pointer;}#mermaid-svg-2HGaSBPV9dMyHeb8 .taskText.clickable{cursor:pointer;fill:#003163!important;font-weight:bold;}#mermaid-svg-2HGaSBPV9dMyHeb8 .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163!important;font-weight:bold;}#mermaid-svg-2HGaSBPV9dMyHeb8 .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163!important;font-weight:bold;}#mermaid-svg-2HGaSBPV9dMyHeb8 .taskText0,#mermaid-svg-2HGaSBPV9dMyHeb8 .taskText1,#mermaid-svg-2HGaSBPV9dMyHeb8 .taskText2,#mermaid-svg-2HGaSBPV9dMyHeb8 .taskText3{fill:white;}#mermaid-svg-2HGaSBPV9dMyHeb8 .task0,#mermaid-svg-2HGaSBPV9dMyHeb8 .task1,#mermaid-svg-2HGaSBPV9dMyHeb8 .task2,#mermaid-svg-2HGaSBPV9dMyHeb8 .task3{fill:#8a90dd;stroke:#534fbc;}#mermaid-svg-2HGaSBPV9dMyHeb8 .taskTextOutside0,#mermaid-svg-2HGaSBPV9dMyHeb8 .taskTextOutside2{fill:black;}#mermaid-svg-2HGaSBPV9dMyHeb8 .taskTextOutside1,#mermaid-svg-2HGaSBPV9dMyHeb8 .taskTextOutside3{fill:black;}#mermaid-svg-2HGaSBPV9dMyHeb8 .active0,#mermaid-svg-2HGaSBPV9dMyHeb8 .active1,#mermaid-svg-2HGaSBPV9dMyHeb8 .active2,#mermaid-svg-2HGaSBPV9dMyHeb8 .active3{fill:#bfc7ff;stroke:#534fbc;}#mermaid-svg-2HGaSBPV9dMyHeb8 .activeText0,#mermaid-svg-2HGaSBPV9dMyHeb8 .activeText1,#mermaid-svg-2HGaSBPV9dMyHeb8 .activeText2,#mermaid-svg-2HGaSBPV9dMyHeb8 .activeText3{fill:black!important;}#mermaid-svg-2HGaSBPV9dMyHeb8 .done0,#mermaid-svg-2HGaSBPV9dMyHeb8 .done1,#mermaid-svg-2HGaSBPV9dMyHeb8 .done2,#mermaid-svg-2HGaSBPV9dMyHeb8 .done3{stroke:grey;fill:lightgrey;stroke-width:2;}#mermaid-svg-2HGaSBPV9dMyHeb8 .doneText0,#mermaid-svg-2HGaSBPV9dMyHeb8 .doneText1,#mermaid-svg-2HGaSBPV9dMyHeb8 .doneText2,#mermaid-svg-2HGaSBPV9dMyHeb8 .doneText3{fill:black!important;}#mermaid-svg-2HGaSBPV9dMyHeb8 .crit0,#mermaid-svg-2HGaSBPV9dMyHeb8 .crit1,#mermaid-svg-2HGaSBPV9dMyHeb8 .crit2,#mermaid-svg-2HGaSBPV9dMyHeb8 .crit3{stroke:#ff8888;fill:red;stroke-width:2;}#mermaid-svg-2HGaSBPV9dMyHeb8 .activeCrit0,#mermaid-svg-2HGaSBPV9dMyHeb8 .activeCrit1,#mermaid-svg-2HGaSBPV9dMyHeb8 .activeCrit2,#mermaid-svg-2HGaSBPV9dMyHeb8 .activeCrit3{stroke:#ff8888;fill:#bfc7ff;stroke-width:2;}#mermaid-svg-2HGaSBPV9dMyHeb8 .doneCrit0,#mermaid-svg-2HGaSBPV9dMyHeb8 .doneCrit1,#mermaid-svg-2HGaSBPV9dMyHeb8 .doneCrit2,#mermaid-svg-2HGaSBPV9dMyHeb8 .doneCrit3{stroke:#ff8888;fill:lightgrey;stroke-width:2;cursor:pointer;shape-rendering:crispEdges;}#mermaid-svg-2HGaSBPV9dMyHeb8 .milestone{transform:rotate(45deg) scale(0.8,0.8);}#mermaid-svg-2HGaSBPV9dMyHeb8 .milestoneText{font-style:italic;}#mermaid-svg-2HGaSBPV9dMyHeb8 .doneCritText0,#mermaid-svg-2HGaSBPV9dMyHeb8 .doneCritText1,#mermaid-svg-2HGaSBPV9dMyHeb8 .doneCritText2,#mermaid-svg-2HGaSBPV9dMyHeb8 .doneCritText3{fill:black!important;}#mermaid-svg-2HGaSBPV9dMyHeb8 .activeCritText0,#mermaid-svg-2HGaSBPV9dMyHeb8 .activeCritText1,#mermaid-svg-2HGaSBPV9dMyHeb8 .activeCritText2,#mermaid-svg-2HGaSBPV9dMyHeb8 .activeCritText3{fill:black!important;}#mermaid-svg-2HGaSBPV9dMyHeb8 .titleText{text-anchor:middle;font-size:18px;fill:#333;font-family:'trebuchet ms',verdana,arial,sans-serif;font-family:var(--mermaid-font-family);}#mermaid-svg-2HGaSBPV9dMyHeb8 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 2014-01-07 2014-01-09 2014-01-11 2014-01-13 2014-01-15 2014-01-17 2014-01-19 2014-01-21 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid 关于 甘特图 语法参考 这儿, UML 图表 可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图 #mermaid-svg-PeJCsWWDu4fP2IC1 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-PeJCsWWDu4fP2IC1 .error-icon{fill:#552222;}#mermaid-svg-PeJCsWWDu4fP2IC1 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-PeJCsWWDu4fP2IC1 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-PeJCsWWDu4fP2IC1 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-PeJCsWWDu4fP2IC1 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-PeJCsWWDu4fP2IC1 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-PeJCsWWDu4fP2IC1 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-PeJCsWWDu4fP2IC1 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-PeJCsWWDu4fP2IC1 .marker.cross{stroke:#333333;}#mermaid-svg-PeJCsWWDu4fP2IC1 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-PeJCsWWDu4fP2IC1 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-PeJCsWWDu4fP2IC1 text.actortspan{fill:black;stroke:none;}#mermaid-svg-PeJCsWWDu4fP2IC1 .actor-line{stroke:grey;}#mermaid-svg-PeJCsWWDu4fP2IC1 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-PeJCsWWDu4fP2IC1 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-PeJCsWWDu4fP2IC1 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-PeJCsWWDu4fP2IC1 .sequenceNumber{fill:white;}#mermaid-svg-PeJCsWWDu4fP2IC1 #sequencenumber{fill:#333;}#mermaid-svg-PeJCsWWDu4fP2IC1 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-PeJCsWWDu4fP2IC1 .messageText{fill:#333;stroke:#333;}#mermaid-svg-PeJCsWWDu4fP2IC1 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-PeJCsWWDu4fP2IC1 .labelText,#mermaid-svg-PeJCsWWDu4fP2IC1 .labelTexttspan{fill:black;stroke:none;}#mermaid-svg-PeJCsWWDu4fP2IC1 .loopText,#mermaid-svg-PeJCsWWDu4fP2IC1 .loopTexttspan{fill:black;stroke:none;}#mermaid-svg-PeJCsWWDu4fP2IC1 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-PeJCsWWDu4fP2IC1 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-PeJCsWWDu4fP2IC1 .noteText,#mermaid-svg-PeJCsWWDu4fP2IC1 .noteTexttspan{fill:black;stroke:none;}#mermaid-svg-PeJCsWWDu4fP2IC1 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-PeJCsWWDu4fP2IC1 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-PeJCsWWDu4fP2IC1 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-PeJCsWWDu4fP2IC1 .actorPopupMenu{position:absolute;}#mermaid-svg-PeJCsWWDu4fP2IC1 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-PeJCsWWDu4fP2IC1 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-PeJCsWWDu4fP2IC1 .actor-man circle,#mermaid-svg-PeJCsWWDu4fP2IC1 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-PeJCsWWDu4fP2IC1 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 张三 李四 王五 你好李四, 最近怎么样? 你最近怎么样王五 我很好谢谢! 我很好谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五 这将产生一个流程图。: #mermaid-svg-PLt35R4aTOaB7dBP {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-PLt35R4aTOaB7dBP .error-icon{fill:#552222;}#mermaid-svg-PLt35R4aTOaB7dBP .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-PLt35R4aTOaB7dBP .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-PLt35R4aTOaB7dBP .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-PLt35R4aTOaB7dBP .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-PLt35R4aTOaB7dBP .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-PLt35R4aTOaB7dBP .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-PLt35R4aTOaB7dBP .marker{fill:#333333;stroke:#333333;}#mermaid-svg-PLt35R4aTOaB7dBP .marker.cross{stroke:#333333;}#mermaid-svg-PLt35R4aTOaB7dBP svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-PLt35R4aTOaB7dBP .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-PLt35R4aTOaB7dBP .cluster-label text{fill:#333;}#mermaid-svg-PLt35R4aTOaB7dBP .cluster-label span{color:#333;}#mermaid-svg-PLt35R4aTOaB7dBP .label text,#mermaid-svg-PLt35R4aTOaB7dBP span{fill:#333;color:#333;}#mermaid-svg-PLt35R4aTOaB7dBP .node rect,#mermaid-svg-PLt35R4aTOaB7dBP .node circle,#mermaid-svg-PLt35R4aTOaB7dBP .node ellipse,#mermaid-svg-PLt35R4aTOaB7dBP .node polygon,#mermaid-svg-PLt35R4aTOaB7dBP .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-PLt35R4aTOaB7dBP .node .label{text-align:center;}#mermaid-svg-PLt35R4aTOaB7dBP .node.clickable{cursor:pointer;}#mermaid-svg-PLt35R4aTOaB7dBP .arrowheadPath{fill:#333333;}#mermaid-svg-PLt35R4aTOaB7dBP .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-PLt35R4aTOaB7dBP .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-PLt35R4aTOaB7dBP .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-PLt35R4aTOaB7dBP .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-PLt35R4aTOaB7dBP .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-PLt35R4aTOaB7dBP .cluster text{fill:#333;}#mermaid-svg-PLt35R4aTOaB7dBP .cluster span{color:#333;}#mermaid-svg-PLt35R4aTOaB7dBP div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-PLt35R4aTOaB7dBP :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 链接 长方形 圆 圆角长方形 菱形 关于 Mermaid 语法参考 这儿, FLowchart流程图 我们依旧会支持flowchart的流程图 Created with Raphaël 2.3.0 开始 我的操作 确认 结束 yes no 关于 Flowchart流程图 语法参考 这儿. 导出与导入 导出 如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 生成一个.md文件或者.html文件进行本地保存。 导入 如果你想加载一篇你写过的.md文件在上方工具栏可以选择导入功能进行对应扩展名的文件导入 继续你的创作。 mermaid语法说明 ↩︎ 注脚的解释 ↩︎
http://www.w-s-a.com/news/971057/

相关文章:

  • 橙色在网站中的应用淘宝客绑定网站备案号
  • 杭州视频网站建设成都设计院排行
  • 慈溪建设网站盘丝洞app破解无限盘币
  • 关于服装店网站建设的策划方案seo关键词优化软件官网
  • 丰台高端网站建设土巴兔装修贵吗
  • 宽屏网站mysqli pdo wordpress
  • 2022年没封网站直接进入赣州网吧
  • 河南省建设厅证件证件查询网站硬件开发是什么意思
  • tp5做企业网站宿迁房产网租房信息
  • php高级网站开发wordpress不能添加文章
  • 小学校园网站建设付费阅读下载网站开发
  • 如何做招聘网站网站建设中 敬请期待
  • 雅安工程交易建设网站做vip电影网站
  • 网站建设方维网站标题title为什么不能频繁的改
  • 网站建设如何上传文件wordpress列表自定义数据表
  • 摄影课程自学网站科技项目的类型有
  • 未来最紧缺的十大专业长春seo顾问
  • 为什么点不开网站公关公司是做什么的
  • wordpress主要菜单如何对网站页面进行优化
  • 建设银行深分行圳招聘网站建立互联网公司网站
  • 湖南做旅游网站哪家最好html5手机网站免费模板
  • 云服务器上放多个网站wordpress ping大全
  • 以下属于网站的管理 更新 维护如何才能做好品牌网站建设
  • 国家工业和信息化部网站备案系统网站建设设计费用
  • 网站建设利弊宁波高端网站建设联系方式
  • 网站订票策划方案郑州代做网站
  • 免费的网站加速器注册公司邮箱
  • 千助网站建设网站整站程序
  • 自学建网站做网站优化访问网站出现目录
  • 济南网站建设是什么百度官网登录入口手机版