工作流activity原理 工作流activity教程_农历_星座分析

星座分析>星座分析>农历

工作流activity原理 工作流activity教程

时间:2024-06-03 17:46:54 作者:我的西藏

一篇好的文章需要好好的打磨,你现在浏览的文章是一篇关于工作流activity原理 工作流activity教程的文章,本文对文章工作流activity原理 工作流activity教程好好的分析和解答,希望你能喜欢,只有你喜欢的内容存在,只有你来光临,我们才能继续前行。C4E星座分析

工作流activity原理 工作流activity教程

浅显易懂的startActivity原理分析

我们想一想几个问题,Android是如何启动一个Activity的呢?我们调用Context.startActivity(),一个Activity就展现了出来,这个Activity的onCreate()和onResume()等方法会被系统调用,其内部到底经历了怎样的过程呢?当前展示的Activity的onPause()和onStop()方法是怎么被调用的?C4E星座分析

首先,要明白一件事,就是startActivity()是一个跨进程的操作,相当于给另一个进程发送一个消息,然后该方法就马上返回了,背后系统会进行一系列复杂的操作,之后这个Activity才会展示出来,我们不能认为startActivity之后这个Activity就启动展示出来了,包括Activity的finish()也一样,它们只负责给系统进程发送信息而已。C4E星座分析

那么,我们马上会想到两个问题:C4E星座分析

1. startActivity()是发消息给谁呢?C4E星座分析

答案是ActivityManagerService这个服务,而这个服务驻留在系统进程SystemServer中,之前的文章谈过,一个进程可以驻留多个服务,比如SystemServer这个进程包含了ActivityManagerService、PackageManagerService、WindowManagerService、PowerManagerService等很多个系统服务。因此,startActivity()是发消息给SystemServer进程,而进程间通信的方法正是安卓世界强大的Binder机制。C4E星座分析

2. startActivity()发送的是什么消息呢?C4E星座分析

这里的消息是通过Intent参数携带的,比如客户端可以通过PackageManager的getLaunchIntentForPackage()方法获取特定包名下特定Activity的Intent,这个Intent便指定了要启动的Activity,AMS进程则通过解析这个Intent创建对应的ActivityRecord,继续后续启动Activity的过程。C4E星座分析

Android中的Activity是通过Task来组织的,系统只支持一个Task处于前台,即用户当前看到的Activity所属的Task,其余的Task均处于后台,这些后台Task内部的Activity保持顺序不变。用户可以一次将整个Task挪到后台或者置为前台。在一些安卓手机中,按Menu键,系统会弹出近期Task列表,用户能快速在多个Task间切换。与Task概念相关的还有Activity启动的模式,比如可以通过在Manifest指定launchMode为singleTask或在Intent中指定Flag为FLAG_ACTIVITY_NEW_TASK来控制Activity独占一个Task,或者通过taskAffinity属性来指定Activity所属的Task,这块不是本文的重点,详细可以看这里: https://developer.android.google.cn/guide/components/activities/tasks-and-back-stack 。C4E星座分析

注意:Task并不是进程的意思,它只是一个虚拟的概念,由AMS中的TaskRecord表示。C4E星座分析

AMS内部是通过ActivityStack来组织Activity和Task,Activity用ActivityRecord来表示,Task用TaskRecord来表示,需要注意的是,ActivityStack并不是从Task的维度来保存ActivityRecord的,而是直接扁平化地使用一个数组来保存ActivityRecord,用mHistory变量指向这个数组,表示历史的Activity。由于系统只有一个ActivityStack实例,因此mMainStack一直为true。ActivityStack有一系列方法来搜索和操作ActivityRecord,其主要结构如图:C4E星座分析

在ActivityStack中,startActivityXXX的一系列流程是为了创建ActivityRecord和TaskRecord,然后将TaskRecord设置到ActivityRecord中,进而通过该ActivityRecord来启动Activity。C4E星座分析

ActivityRecord就绪之后,AMS会判断ActivityRecord中的ProcessRecord中pid指向的进程是否存在,如果存在则直接向该进程发送启动Activity的消息,否则会启动进程。与应用进程通信的方式同样是Binder,接口是IApplicationThread,AMS通过IApplicationThread将APK相关的信息传递给应用进程。C4E星座分析

当需要启动应用进程时,AMS向zygote进程发送信息,使得zygote分裂出一个新的进程,AMS随即得到该进程的pid,并把该pid与ActivityRecord的ProcessRecord关联起来。zygote分裂出来的是一个通用的进程,它并不知道自己的使命,也不知道自己运行的是哪个apk包,只是个空白的进程。但该进程在启动Java虚拟机和进行必要的初始化后会进入Java世界,然后会执行ActivityThread的main()方法,在该main()方法中,会调用ActivityThread的attach方法,attach方法将会调用AMS服务的attachApplication方法,并传入自己的IApplicationThread对象,从而开始应用进程和AMS进程间的通信。C4E星座分析

因此,应用进程在被创建之后会主动与AMS进程建立通信,而AMS在创建一个应用进程后,会设置一个超时时间(一般是10秒)。如果超过这个时间,应用进程还没有和AMS交互,则断定该进程创建失败。C4E星座分析

建立完通信链路后,AMS内部便可以使用IApplicationThread接口,通过bindApplication方法,将APK相关的信息传给应用进程,此时应用进程也就活起来了。应用进程在收到bindApplication消息后,将会根据AndroidManifest中声明的Application标签创建一个Application。C4E星座分析

而真正启动Activity是通过ActivityStack的realStartActivityLocked方法,其大体的流程是向应用进程发送信息,使得应用进程调用ActivityThread的handleLaunchActivity以及PerformLaunchActivity方法。C4E星座分析

其实启动一个Activity的关键流程是:C4E星座分析

这只是主要的流程,其实里边的细节还有很多,比如当下Activity的onPause和onStop等方法的调用,但原理其实很好理解,当AMS启动一个新的Activity以及该Activity的onCreate方法在被调用之前,AMS会发信息给当前展示的Activity的应用进程,通知其ActivityThread调用performPauseActivityIfNeeded方法,进而调用当前Activity的onPause方法。C4E星座分析

至此,启动Activity的原理介绍完毕,AMS极其复杂,要完全理解需要花费很长时间,但我认为只需要把关键的节点理清楚就好,具体细节等需要用到再仔细研究。C4E星座分析

完毕。C4E星座分析

其它文章可以学习:C4E星座分析

理解Application创建过程: http://gityuan.com/2017/04/02/android-application/C4E星座分析

Android N 四大组件的工作原理

本文侧重讲解android N 系统中四大组件的工作原理,不同系统原理略有差别。通过分析四大组件的工作流程加深对Android Framework的理解,也为插件化开发打下基础。C4E星座分析

ActivityC4E星座分析

展示一个界面并和用户交互,它扮演的是一个前台界面的角色。C4E星座分析

ServiceC4E星座分析

计算型组件,用于后台执行一系列计算任务,工作在主线程,耗时操作需要另起线程, 分为启动状态和绑定状态。C4E星座分析

BroadcastReceiverC4E星座分析

消息型组件,主要用于不同组件或者不同应用之间的消息传递,它工作在系统内部,不适合执行耗时操作,操作超过5s,会出现ANR。C4E星座分析

ContentProviderC4E星座分析

数据共享型组件,用于向其他组件或者应用共享数据,主要执行CURD操作。C4E星座分析

我们启动一个activity有两种方法,C4E星座分析

第一种(Activity直接启动方式):C4E星座分析

Intent intent = new Intent(this, MainActivity.class);C4E星座分析

startActivity(intent);C4E星座分析

第二种(Context启动方式)C4E星座分析

Intent intent = new Intent(this, MainActivity.class);C4E星座分析

getApplicationContext().startActivity(intent);C4E星座分析

不同的启动方式Activity的工作流程有点差别。C4E星座分析

两种启动都会调用到Instrumentation类中的execStartActivity的方法,系统最终是通过ActivityThread中的performLaunchActivity完成Activity的创建和启动。C4E星座分析

performLaunchActivity方法主要完成以下工作:C4E星座分析

1、通过ActivityClientRecord对象获取启动activity的组件信息C4E星座分析

2、通过mInstrumentation对象的newActivity方法调用classloader完成activity的创建C4E星座分析

3、通过r.packageInfo(LoadedApk 对象)的makeApplication方法尝试创建Application对象C4E星座分析

4、创建ContextImpl对象并调用Activity的attach方法完成一些数据的初始化C4E星座分析

5、调用Activity的onCreate方法C4E星座分析

在Activity启动的过程中,App进程会频繁地与AMS进程进行通信:C4E星座分析

App进程会委托AMS进程完成Activity生命周期的管理以及任务栈的管理;这个通信过程AMS是Server端,App进程通过持有AMS的client代理IActivityManager完成通信过程;C4E星座分析

AMS进程完成生命周期管理以及任务栈管理后,会把控制权交给App进程,让App进程完成Activity类对象的创建,以及生命周期回调;这个通信过程也是通过Binder完成的,App所在server端的Binder对象存在于ActivityThread的内部类ApplicationThread;AMS所在client通过持有IApplicationThread的代理对象完成对于App进程的通信。C4E星座分析

Service有两种启动方式,startService()和bindService(),两种状态可以并存:C4E星座分析

startService流程C4E星座分析

bindService流程C4E星座分析

BroadcastReceiver的工作过程主要包括广播的注册、发送和接收:C4E星座分析

动态注册过程:C4E星座分析

发送过程C4E星座分析

静态注册是由PackageManagerService(PMS)在应用安装的时候完成整个注册过程的,除广播以外,其他三大组件也都是在应用安装时由PMS解析并注册的。C4E星座分析

从源码中可以看出:C4E星座分析

应用启动的入口为ActivityThread的main方法,main方法会创建ActivityThread实例并创建主线程消息队列。C4E星座分析

attach方法中远程调用AMS的attachApplication方法,并提供ApplicationThread用于和AMS的通信。C4E星座分析

attachApplication方法会通过bindApplication方法和H来调回ActivityThread的handleBindApplication,这个方法会先创建Application,再加载ContentProvider,然后才会回调Application的onCreate方法。C4E星座分析

由上图可以看出,在ContentProvider的启动过程中伴随着app进程的启动。C4E星座分析

ContentProvider的其他CURD操作如insert,delete,update跟query的流程类似。

多个activity小工作流如何串联到大流程

在“文件”菜单上指向“新建”,然后选择“项目”。此时将打开“新建项目”对话框。在“项目类型”窗格中,选择“Visual C#”或“Visual Basic”(位于“其他语言”下),然后选择“工作流”。在“模板”窗格中,选择“工作流 Activity 库”。C4E星座分析

以上内容是小编精心整理的关于工作流activity原理 工作流activity教程的精彩内容,好的文章需要你的分享,喜欢工作流activity原理 工作流activity教程这篇精彩文章的,请您经常光顾吧!C4E星座分析

上一篇:党委换届工作总结报告标题 党委换届工作总结报告主要内容

下一篇:更多农历

本文标题:工作流activity原理 工作流activity教程

本文链接:http://m.xzfx123.com/article/120332.html

使劲推荐

工作流activity原理 工作流activity教程
工作流activity原理 工作流activity教程

一篇好的文章需要好好的打磨,你现在浏览的文章是一篇关于工作流activity原理 工作流act...

党委换届工作总结报告标题 党委换届工作总结报告主要内容
党委换届工作总结报告标题 党委换届工作总结报告主要内容

一篇好的文章需要好好的打磨,你现在浏览的文章是一篇关于党委换届工作总结报告标题 党...

疲惫的心情短句图片 疲惫的心情短句文案
疲惫的心情短句图片 疲惫的心情短句文案

一篇好的文章需要好好的打磨,你现在浏览的文章是一篇关于疲惫的心情短句图片 疲惫的心...

幼儿园工作规程学习心得 幼儿园一日工作流程培训心得体会
幼儿园工作规程学习心得 幼儿园一日工作流程培训心得体会

一篇好的文章需要好好的打磨,你现在浏览的文章是一篇关于幼儿园工作规程学习心得 幼儿...

教学工作例会会议记录 教学工作例会新闻稿
教学工作例会会议记录 教学工作例会新闻稿

一篇好的文章需要好好的打磨,你现在浏览的文章是一篇关于教学工作例会会议记录 教学工...

发表评论

相关推荐

工作规划ppt模板范文 工作规划ppt模板免费下载
工作规划ppt模板范文 工作规划ppt模板免费下载

一篇好的文章需要好好的打磨,你现在浏览的文章是一篇关于工作规划ppt模板范文 工作规划...

压力继电器的工作原理和应用场合 压力继电器的工作原理视频
压力继电器的工作原理和应用场合 压力继电器的工作原理视频

一篇好的文章需要好好的打磨,你现在浏览的文章是一篇关于压力继电器的工作原理和应用场...

杭州市民之家工作时间 杭州市民之家工作时间周六周日休息吗
杭州市民之家工作时间 杭州市民之家工作时间周六周日休息吗

一篇好的文章需要好好的打磨,你现在浏览的文章是一篇关于杭州市民之家工作时间 杭州市...

3个工作日是多久 京东退款1-3个工作日是多久
3个工作日是多久 京东退款1-3个工作日是多久

一篇好的文章需要好好的打磨,你现在浏览的文章是一篇关于3个工作日是多久 京东退款1-3...

电商工作室需要营业执照吗 电商工作室是干什么的
电商工作室需要营业执照吗 电商工作室是干什么的

一篇好的文章需要好好的打磨,你现在浏览的文章是一篇关于电商工作室需要营业执照吗 电...

精选农历标签