ams

【8.0.0_r4】AMS架构与流程分析

旧巷老猫 提交于 2020-01-04 05:17:38
AMS主要用来管理应用程序的生命周期,以及其核心组件,包括Activity,Service,Provider,Broadcast,Task等 之前整体架构如下图(O上已经废弃) 新的架构比较直接,简化了很多,直接调用IApplicationThread和IActivityManger这两个接口就可以完成Client和Service端的binder通信 核心record是进程的,各个Record的关系如下图 AMS本身是system_server进程里的的一个服务,在类SystemServer里完成初始化,并为其所在的进程system_server创建Android运行时环境,即主线程ActivityThread和Context具体子类ContextImpl,来满足AMS的运行环境条件;完成AMS的初始化;并将其自身所在的system_server进程其纳入调度中;最后通知其他模块,AMS已经ready了 大体初始化流程如下: 1. 先是在SysemServer的run方法里,在启动任何服务之前,调用 createSystemContext 方法 1 270 private void run() { 2 ……………………………… 3 378 // Initialize the system context. 4 379 createSystemContext(); 5 380 6

Net学习日记_ADO.Net_2_练习(省市联动)

柔情痞子 提交于 2019-12-27 10:57:41
页面: 数据库(粘贴,建库就可以) CREATE TABLE [dbo].[Ams_Area]( [ar_id] [int] NOT NULL, [ar_name] [varchar](50) NOT NULL, [ar_uid] [int] IDENTITY(1,1) NOT NULL, [ar_sort] [int] NOT NULL, [ar_uniCount] [int] NOT NULL, [ar_addtime] [datetime] NOT NULL, [ar_delflag] [bit] NOT NULL, CONSTRAINT [PK_Ams_Area] PRIMARY KEY CLUSTERED ( [ar_id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'地区表id' , @level0type=N'SCHEMA',

Android ANR原理分析

◇◆丶佛笑我妖孽 提交于 2019-12-17 17:55:16
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 一、概述 ANR(Application Not responding),是指应用程序未响应,Android系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间能未能得到有效响应或者响应时间过长,都会造成ANR。一般地,这时往往会弹出一个提示框,告知用户当前xxx未响应,用户可选择继续等待或者Force Close。 那么哪些场景会造成ANR呢? Service Timeout:服务在20s内未执行完成; BroadcastQueue Timeout:比如前台广播在10s内执行完成 ContentProvider Timeout:内容提供者执行超时 inputDispatching Timeout: 输入事件分发超时5s,包括按键分发事件的超时。 二、ANR触发时机 2.1 Service Timeout Service Timeout触发时机,简单说就是AMS中的 mHandler 收到 SERVICE_TIMEOUT_MSG 消息时触发。 在前面文章 startService流程分析 详细介绍Service启动流程,在Service所在进程attach到system_server进程的过程中会调用 realStartServiceLocked() 方法 2.1.1

ActivityThread的理解和APP的启动过程

[亡魂溺海] 提交于 2019-12-06 15:01:31
ActivityThread的理解和APP的启动过程 ActivityThread ActivityThread的初始化 主线程Looper的初始化 主线程Handler的初始化 ApplicationThread及Activity的创建和启动 APP的启动 系统的启动过程 APP的启动过程 APP启动过程的部分代码思考 总结 ActivityThread ActivityThread就是我们常说的主线程或UI线程,ActivityThread的main方法是整个APP的入口,本篇深入学习下ActivityThread,顺便了解下APP和Activity的启动过程。 ActivityThread的初始化 ActivityThread即Android的主线程,也就是UI线程,ActivityThread的main方法是一个APP的真正入口,MainLooper在它的main方法中被创建。 //ActivityThread的main方法 public static void main(String[] args) { ... Looper.prepareMainLooper(); ActivityThread thread = new ActivityThread(); //在attach方法中会完成Application对象的初始化,然后调用Application的onCreate(

初始Android Framework(框架)方面的知识(一)

人盡茶涼 提交于 2019-12-05 23:55:09
初始Android Framework(框架)方面的知识 介绍Android Framework(框架)是什么? Android Framework(框架)有什么? 首先介绍一下服务端都有哪些重要的东西: 下面介绍一下客户端比较重要的东西: Linux驱动 Manager机制 介绍Android Framework(框架)是什么? Android的Framework是直接应用之下的一层,叫做应用程序框架层。这一层是核心应用程序所使用的API框架,为应用层提供各种API,提供各种组件和服务来支持我们的Android开发,包括ActivityManager,WindowManager,ViewSystem等。 如下比较常见的Android框架图: Android Framework(框架)有什么? Android Framework框架包含了3个主要部分:服务端、客户端、Linux驱动。 首先介绍一下服务端都有哪些重要的东西: ActivityManagerService(Ams):负责管理所有应用程序中的Activity,它掌握所有Activity的情况,具有所有调度Activity生命周期的能力,简单来说,ActivityManagerService是管理和掌控所有的Activity. (关于ActivityManagerService详情解释,请参考)

浅谈Android FrameWork框架和它在android的四层架构起到的作用

我们两清 提交于 2019-12-05 23:54:49
这里写一些关于Android Framework比较重要的知识点,这些东西对于之后理解和研究Android Framework有很大好处,就是让我们脑子里先有一个大概的模型,以及认识一点之后经常会碰见的角色。 首先贴一张图,刚学安卓的时候看书籍或者看视频教程的时候通常第一篇就会祭出这张图,但是当时你可能就是一瞥而过,毕竟初学时一般只关心应用层功能的实现啊,或者如何布局啊这些,现在来复习一下这张很重要的图: 图上分的很清楚,分为四层,分别为: 1.应用程序层 这一层一般我们最为熟悉了,我们平常开发安卓用java编写的app都属于这一层,当然系统自带的程序比如时钟啊,email等都是属于这一层 2.应用程序框架层(Framework) 这一层是核心应用程序所使用的API框架,为应用层提供各种接口API,包括各种组件和服务来支持我们的安卓开发,包括ActivityManager,WindowManager,ViewSystem等我们讲到AndroidFramework时很经常要提到的东西。 3.系统运行库层 从图上就可以看出,这一层有两部分: 一.程序库 Android 包含一些C/C++库,这些库能被Android系统中不同的组件使用。它们通过 Android 应用程序框架为开发者提供服务。以下是一些核心库: 系统 C 库 - 一个从 BSD 继承来的标准 C 系统函数库( libc

Android Activity启动流程(基于Android8.0系统)

∥☆過路亽.° 提交于 2019-12-04 16:14:10
主要对象介绍 ActivityManagerService:负责系统中所有Activity的生命周期; ActivityThread:App的真正入口,当App启动后,会调用其main方法开始执行,开启消息循环队列。是传说中的UI线程,即主线程。与ActivityManagerService配合,一起完成Activity的管理工作; ApplicationThread:用来实现ActivityManagerService与ActivityThread之间的交互。在ActivityManagerService需要管理相关Application中的Activity的生命周期,通过ApplicationThread的代理对象与ActivityThread通讯; ApplictationThreadProxy:是ApplicationThread在服务端的代理对象,负责和客户端的ApplicationThread通讯。AMS就是通过这个代理对象与ActivityThread进行通信的, Android 8.0上以删除该类,采用AIDL接口的方式来进行IPC,实现RPC操作 ; Instrumentation:每一个应用程序都只有一个Instrumentation对象,每个Activity内都有一个对该对象的引用。Instrumentation可以理解为应用进程的管家

Android中BroadcastReceiver详解

孤人 提交于 2019-12-04 05:38:10
BroadcastReceiver是什么? Android app可以发送广播也可以接收系统或者其它app发送的广播,是发送/订阅的设计模式。这些广播被发送当重要的事件发生的时候。例如,安卓系统发送广播当各种各样系统事件发生的时候,比如手机启动了或者手机开始充电了。应用也可以发送自定义广播,例如通知其它应用一些他们可能感兴趣的东西,比如一些新的内容被下载了。 系统广播会在系统事件发生的时候被发送出来,比如当手机进入或者退出开发者选项的时候,所有订阅了系统广播的人都可以收到这个广播。 广播它自身是被包裹在了一个Intent里面,它是有一个唯一的标识的(例如android.intent.action.AIRPLANE_MODE)。这个Intent对象同时包含了一些其它的信息,在它的字段里面,飞行模式这个intent里面就包含了一个boolean的字段来表示飞行模式是开启还是关闭的。 BroadcastReceiver能用来做什么? 接收系统发送出的重要的广播(网络变化,开机,充电) app之间相互通信,相互拉活的手段 app内部组建间通信的手段 BroadcastReceiver分为哪几类? 从不同的纬度区分,可能分为不同的类别。 系统广播/非系统广播 全局广播/本地广播 无序广播/有序广播/粘性广播 BroadcastReceiver怎么使用? 1. 注册广播 1.1 静态注册广播

亿级Web系统的容错性建设实践

半腔热情 提交于 2019-12-03 07:34:58
容错其实是系统健壮性的重要指标之一,而本文会主要聚焦于“容错”能力的实践,希望对做技术的同学有所启发和帮助。 (备注:QQ会员活动运营平台,后面统一简称AMS) 一、 重试机制 最容易也最简单被人想到的容错方式,当然就是“失败重试”,总而言之,简单粗暴!简单是指它的实现通常很简单,粗暴则是指使用不当,很可能会带来系统“雪崩”的风险,因为重试意味着对后端服务的双倍请求。 1. 简单重试 我们请求一个服务,如果服务请求失败,则重试一次。假设,这个服务在常规状态下是99.9%的成功率,因为某一次波动性的异常,成功率下跌到95%,那么如果有重试机制,那么成功率大概还能保持在99.75%。而简单重试的缺陷也很明显,如果服务真的出问题,很可能带来双倍流量,冲击服务系统,有可能直接将服务冲垮。而在实际的真实业务场景,往往更严重,一个功能不可用,往往更容易引起用户的“反复点击”,反而制造更大规模的流量冲击。比起服务的成功率比较低,系统直接被冲击到“挂掉”的后果明显更严重。 简单重试,要使用在恰当的场景。或者,主动计算服务成功率,成功率过低,就直接不做重试行为,避免带来过高的流量冲击。 2. 主备服务自动切换 既然单一服务的重试,可能会给该带来双倍的流量冲击,而最终导致更严重的后果,那么我们不如将场景变为主备服务的自动重试或者切换。例如,我们搭建了两套获取openid的服务,如果服务A获取失败

Mybatis-Generator的配置、使用

隐身守侯 提交于 2019-12-03 00:26:16
项目结构: 1.配置相关文件 ams\pom.xml ams\src\main\resources\generator\generatorConfig.xml 2.pom.xml 设置 2.1 下载mybatis-generator的jar包,添加如下依赖: <dependencies> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.7</version> </dependency> </dependencies> 2.2 配置mybatis-generator自动生成代码插件 <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <!-- mybatis generator 自动生成代码插件 --> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven