关于activity:Activity从零开始到掌握工作流开发业务代码

【Activity】从零开始到把握工作流开发业务代码Activity #工作流 引言本文算是本人从零边钻研边实际捣鼓到业务上线后全方位补充的一个笔记,对于技术人员举荐间接从第七章技术选型开始浏览,后面的实践局部根本是集体收集的一些网络材料和集体了解笔记,对于应用工作流实现性能没有任何影响。 再次强调,本文十分十分长,请读者按需观看。 一、工作流术语定义1.1 根本定义Georgakopoulos(乔治亚 * 科普洛斯) 给出的工作流定义是:工作流是将一组工作组织起来以实现某个经营过程,定义了工作的触发程序和触发条件,每个工作能够由一个或多个软件系统实现, 也能够由一个或一组人实现,还能够由一个或多集体与软件系统合作实现。 工作流实现了一整套流程外部主动实现的技术,能够屏蔽掉一些繁琐流程的业务进行简化。如果你的业务中没有工作流技术利用,那么齐全能够敞开本文而后去刷刷视频干点别的。 1.2 相干术语上面工作流程的术语定义。 术语含意不失当比喻工作流工作从开始到实现的过程。蕴含流程逻辑和路线规定,流程逻辑蕴含工作的执行程序,路线规定代表工作执行过程中必须恪守的路线,一项工作或者工作整体过程流程定义图形的流程定义。代表工作流的流程逻辑元素和它们元素关系。相似快递的传输路线流程实例也叫工作。流程定义的运行实例。相似正在运行的汽车工作流零碎存储流程定义,通过工作流引擎组件驱动流程定义进行工作。相似汽车发动机流程定义工具创立和更改流程定义的工具。能够是一个软件的组件,也能够是独立的应用程序。流程定义的工具具备复用性。绘制汽车设计图的工具或者软件,能够批改产品设计参与者参与者能够是形象或者具体的,比方资源集、特定资源、组织单元、角色(一个人在组织外部的作用)、人或零碎(主动代理)。路线上每一个节点的行为流动组成流程定义中的一个逻辑步骤的工作。能够是主动的或人工的。常见的主动流动就是截止期限治理,如果到期未实现就主动发送揭示音讯。手动则是须要人力驱动零碎执行业务规定,比方咱们日常生活的报销申请审批。形容某一项工作的解决细节流动所有者有权发表流动完结或者把工作流程推动到下一个流动参与者快递运输过程中的每一个站点如何解决快递工作所有者有权参加实例执行过程的参与者。相似会议的参加人员,有权加入然而不肯定有执行权工作项流程实例中流动的参与者将要执行的工作比方送货的最初一步须要快递员派送快递到用户手里1.3 为什么被叫做流?各个节点通过内外部驱动触发引起节点的推动,造成一个流式的状态达到业务起点。比方一次用户查看淘宝商品的费用、一次领取胜利后的权利开明、一次用户注册、一次调度工作的运行等,都是能够是一个工作流。 1.4 艰深了解艰深了解:工作流 抽取了流程(例如:销假、报销、岗位调整等流程)运行过程的共性,将业务解决和流程流转剥离,缩小编码过程中的重复性(审批、驳回、转办、挂起、停止等管理工作)操作,并且实现流程流转去纸质化和可视化的技术。 1.5 生命周期一个残缺的工作流生命周期次要有5步: 1、定义:即流程的定义,所有的流程总是从定义开始。次要工作是收集需要并将其转化为流程定义。 2、公布:开发人员将资源打包后在零碎平台中公布流程定义,次要工作流程定义文件/自定义表单/工作监听类等。 3、执行:具体的流程引擎依照下面定义的流程解决路线来执行业务。 4、监控:收集每个工作的后果,将依据不同后果来做解决。 5、优化:此时业务流程曾经实现,须要的就是优化流程或从新设计等。 二、为什么须要工作流2.1 工作流管理系统劣势1、疾速、高效、稳固的流程引擎,引擎反对大并发拜访。2、兼具人工和主动流程,具备显著的“中国流程”特色的柔性。3、灵便的部署形式,反对集中部署、分布式部署。4、高效的流程集成、整合框架;同时反对流程开发。5、国内数十个行业,领有近千个胜利的客户案例。 2.2 业务可视化举个例子,退款自身非常复杂,经营、产品、技术、财务可能都无奈从繁多的角色来解释分明到底退款的整个链路和关键环节,然而通过工作流的形式来出现,则所有人能疾速看到退款到底是个什么样的业务。 通过流程图,咱们能够清晰的看到节点之间的变动。 2.3 业务可编排业务流程的编排在理论的运作过程中可能随时变动,工作流流程具备编排性,能够通过节点疾速变动业务流程,能够灵便的增减节点,并且不会对于整个流程产生影响。 另一方面代码的可编排意味着代码复用性能够显著进步,比方下面的减少一个【敞开用户权利】的节点,或者删除【用户音讯】,咱们只须要批改流程而不须要调整业务代码。 2.4 主动重试局部工作流反对长久化和主动重试能力。比方有时候须要在流程外面动静增删节点,然而动静增删节点可能会呈现失败的状况,呈现这种问题的时候能够通过局部节点重试解决问题。 三、常见开源工作流的比照(国外报告)数据起源:Java Workflow Engines ComparisonFeatureWorkflow ServerActivitijBPMCamundaCopperWorkflow types(工作流类型)State machineState machineState machineState machineState machineSupported databases(反对数据库)MS SQL Server, PostgreSQL, Oracle, MySQL, MongoDBMS SQL, PostgreSQL, Oracle, MySQL, H2, DB2db2, derby, h2, hsqldb, mysql, oracle, postgresql, sqlserverMS SQL, PostgreSQL, Oracle, MySQL, H2, DB2, MariaDBPostgreSQL, Oracle, MySQL, H2, Apache CassandraLong-running operations(是否反对长期运作)YesYesYesYesYesState persistence(状态长久化)Serialization type is defined by Persistence Provider. You can easily control and change the settings saving process.Activiti supports recovery in case of error, and will restart as a transactional state machine at the lowest level.The runtime state of an executing process can be made persistent, for example, in a database. This allows to restore execution states of all running processes in case of unexpected failure.Persistence Strategy based on the following concepts - Compact Tables, Deadlock Avoidance, Control Savepoints, Intelligent Caching, True Concurrency.Not declaredVersioning & upgrading(版本治理和降级)The processes that were created before the schema change, work under the old scheme, whereas the scheme of the specific process is updated after calling the appropriate command.Versioning onlyBothWith the use of additional convertersYes, you can dynamically modify workflows at runtime. As soon as you save the changed code, Copper compiles it automatically and loads it.Scheme format(底层存储格局)The proprietary format based on XML. Import and export to BPMN2 starting with version 2.1.BPMN2BPMN2BPMN2Process scheme is declared as Java-codeInstalling the process in an arbitrary state(是否反对任意状态兼容工作流)Yes, by calling a single methodYesYesYesYesObtaining a list of available states for the current process(是否反对取得以后过程的可用状态列表)Yes, by calling a single methodYes, by calling a single methodNoNoUnknownBuilt-in authorization of access to external actions (commands) for the workflow(是否容许内部拜访外部流程)YesNoNoNoNoTimers and delays(是否反对计时和提早)YesYesYesYesYesObtaining a list of available external actions for the current process(取得以后过程的可用内部口头的列表)Yes, by calling a single methodNoNoNoNoSimulated process execution(是否反对流程单元测试)Yes, this mode is called Pre-Execution.NoNoNoNoModifying schemes at runtime(是否反对在运行时扭转流程)Yes, built in.NoNoNoYesObtaining process lists for Inbox and Outbox folders(获取收件箱和发件箱文件夹的过程列表)YesNoNoNoNo四、工作流应用场景4.1 畛域业务高复杂度比方进销存、CRM、订单治理等具备肯定的畛域复杂度的业务,能够用工作流模式,来实现业务的可视化。 ...

June 17, 2023 · 15 min · jiezi

关于activity:明修栈道越过Android启动栈陷阱

作者:vivo 互联网大前端团队- Zhao Kaiping本文从一例业务中遇到的问题登程,以FLAG_ACTIVITY_NEW_TASK这一flag作为切入点,带大家探索Activity启动前的一项重要的工作——栈校验。 文中列举一系列业务中可能遇到的异样情况,详细描述了应用FLAG_ACTIVITY_NEW_TASK时可能遇到的“坑”,并从源码中探究其根源。只有正当应用flag、launchMode,能力防止因为栈机制的特殊性,导致一系列与预期不符的启动问题。 一、问题及背景利用间互相联动、互相跳转,是实现零碎整体性、体验一致性的重要伎俩,也是最简略的一种办法。 当咱们用最罕用的办法去startActivity时,竟也会遇到失败的状况。在实在业务中,就遇到了这样一例异样:用户点击某个按钮时,想要“简简单单”跳转另一个利用,却没有任何反馈。 经验丰富的你,脑海中是否涌现出了各种猜测:是不是指标Activity甚至指标App不存在?是不是指标Activty没有对外开放?是不是有权限的限度或者跳转的action/uri错了…… 实在的起因被flag、launchMode、Intent等个性层层隐匿,可能超出你此时的思考。 本文将从源码登程,探索前因后果,开展讲讲在startActivity()真正筹备启动一个Activity前,须要通过哪些“磨难”,怎么有据可依地解决由栈问题导致的启动异样。 1.1 业务中遇到的问题业务中的场景是这样的,存在A、B、C三个利用。 (1)从利用A-Activity1跳转至利用B-Activity2; (2)利用B-Activity2持续跳转到利用C-Activity3; (3)C内某个按钮,会再次跳转B-Activity2,但点击后没有任何反馈。如果不通过后面A到B的跳转,C间接跳到B是能够的。 1.2 问题代码3个Activity的Androidmanifest配置如下,均可通过各自的action拉起,launchMode均为规范模式。 <!--利用A--> <activity android:name=".Activity1" android:exported="true"> <intent-filter> <action android:name="com.zkp.task.ACTION_TO_A_PAGE1" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <!--利用B--> <activity android:name=".Activity2" android:exported="true"> <intent-filter> <action android:name="com.zkp.task.ACTION_TO_B_PAGE2" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <!--利用C--> <activity android:name=".Activity3" android:exported="true"> <intent-filter> <action android:name="com.zkp.task.ACTION_TO_C_PAGE3" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>A-1到B-2的代码,指定flag为FLAG_ACTIVITY_NEW_TASK private void jumpTo_B_Activity2_ByAction_NewTask() { Intent intent = new Intent(); intent.setAction("com.zkp.task.ACTION_TO_B_PAGE2"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);}B-2到C-3的代码,未指定flag ...

April 18, 2023 · 3 min · jiezi

关于activity:Android-四大组件之-Activity

读前思考学习一门技术或者看一篇文章最好的形式就是带着问题去学习,这样能力在过程中有茅塞顿开、灯火阑珊的感觉,记忆也会更粗浅。 说下 Activity 的生命周期?Activity A 启动另一个 Activity B 会回调哪些办法?如果 Activity B 是齐全通明呢?如果启动的是一个 Dialog 呢?谈谈 onSaveInstanceState() 办法?何时会调用?如何防止配置扭转时 Activity 重建?优先级低的 Activity 在内存不足被回收后怎么做能够复原到销毁前状态?说下 Activity 的四种启动模式?别离会在什么时候应用?onNewIntent()调用机会?如何启动其余利用的Activity?Activity 生命周期onCreate() -> onStart() - > onResume() -> onPause() -> onStop() -> onDestroy() onCreate(): 在流动第一次被创立时会调用,能够在这个办法中实现初始化操作,如:布局加载、绑定事件等。onStart(): 在流动由不可见变为可见时候调用。onResume(): 在返回栈顶端,取得焦点,能够和用户进行交互。onPause: 失去焦点,零碎去启动另一个流动时候会调用,能够在这里做一些数据保留,资源开释,但不能做耗时操作。onStop: 流动齐全不可见时调用。onDestroy: 流动被销毁时调用。onRestart: 流动由后盾不可见变为前台可见时候调用。启动 ActivityA 启动 B重写 A 和 B 的生命周期办法 A 启动 B com.keven.jianshu E/TAG: A 的 onPause()com.keven.jianshu E/TAG: B 的 onCreate()com.keven.jianshu E/TAG: B 的 onStart()com.keven.jianshu E/TAG: B 的 onResume()com.keven.jianshu E/TAG: A 的 onStop()从 B 返回 A ...

March 31, 2022 · 2 min · jiezi