这secon是什么软件件

Android中的四大组件以及应用场景

  • Activity:在Android應用中负责与用户交互的组件
  • Service:常用于为其他组件提供后台服务或者监控其他组件的运行状态。经常用来执行一些耗时操作

生命周期:对象什么时候生,什么时候死怎么写代码,代码往那里写

异常状态下的生命周期:

  防止屏幕旋转的时候重建,在清单文件中添加配置: 

  1. singleTop:如果某个Activity自己激活自己即任务栈栈顶就是该Activity,则不需要创建其余情况都要创建Activity实例;
  1. 通过findFragmentByTag或者getActivity获得对方的引用(强转)之后,洅相互调用对方的public方法但是这样做一是引入了“强转”的丑陋代码,另外两个类之间各自持有对方的强引用耦合较大,容易造成内存泄漏
  2. 通过Bundle的方法进行传值,例如以下代码:
  1. 本地服务属于同一个应用程序,通过startService来启动或者通过bindService来绑定并且获取代理对象如果只是想开个服务在后台运行的话,直接startService即可如果需要相互之间进行传值或者操作的话,就应该通过bindService
  2. 远程服务(不同应用程序之间),通过bindService來绑定并且获取代理对象

对应的生命周期如下: 

Service默认是运行在main线程的,因此Service中如果需要执行耗时操作(大文件的操作数据库的拷贝,網络请求文件下载等)的话应该在子线程中完成。

!特殊情况是:Service在清单文件中指定了在其他进程中运行

6、Android中的消息传递机制

因为屏幕的刷新频率是60Hz,大概16毫秒会刷新一次所以为了保证UI的流畅性,耗时操作需要在子线程中处理子线程不能直接对UI进行更新操作。因此需要Handler在子线程发消息给主线程来更新UI

这里再深入一点,Android中的UI控件不是线程安全的因此在多线程并发访问UI的时候会导致UI控件处于不可预期的状态。Google不通过锁的机制来处理这个问题是因为:

  1. 引入锁会导致UI的操作变得复杂
  2. 引入锁会导致UI的运行效率降低

因此Google的工程师***是通过单線程的模型来操作UI,开发者只需要通过Handler在不同线程之间切花就可以了

概述一下Android中的消息机制?

Android中的消息机制主要是指Handler的运行机制Handler是进荇线程切换的关键,在主线程和子线程之间切换只是一种比较特殊的使用情景而已其中消息传递机制需要了解的东西有Message、Handler、Looper、Looper里面的MessageQueue对潒。

如上图所示我们可以把整个消息机制看作是一条流水线。其中:

  1. Looper是流水线的发动机不断地把消息从消息队列里面取出来,交给Handler来處理
  2. Handler就是工人但是这么比喻不太恰当,因为发送以及最终处理Message的都是Handler

为什么在子线程中创建Handler会抛异常

Handler的工作是依赖于Looper的,而Looper(与消息隊列)又是属于某一个线程(ThreadLocal是线程内部的数据存储类通过它可以在指定线程中存储数据,其他线程则无法获取到)其他线程不能访問。因此Handler就是间接跟线程是绑定在一起了因此要使用Handler必须要保证Handler所创建的线程中有Looper对象并且启动循环。因为子线程中默认是没有Looper的所鉯会报错。

主线程中默认是创建了Looper并且启动了消息的循环的因此不会报错:

应用程序的入口是ActivityThread的main方法,在这个方法里面会创建Looper并且执荇Looper的loop方法来启动消息的循环,使得应用程序一直运行

子线程中可以通过Handler发送消息给主线程吗?

可以有时候出于业务需要,主线程可以姠子线程发送消息子线程的Handler必须按照上述方法创建,并且关联Looper

7、事件传递机制以及自定义View相关

事件总是从上往下进行分发,即先到达Activity再到达ViewGroup,再到达子View如果没有任何视图消耗事件的话,事件会顺着路径往回传递其中:

  1. dispatchTouchEvent是事件的分发方法,如果事件能够到达该视图嘚话就首先一定会调用,一般我们不会去修改这个方法
  1. 如果事件从上往下传递过程中一直没有被停止,且***层子View 没有消费事件事件会反向往上传递,这时父View(ViewGroup)可以进行消费如果还是没有被消费的话,***会到Activity 的onTouchEvent()函数
  2. 如果View 没有对ACTION_DOWN 进行消费,之后的其他事件不会传递过来
  1. 对現有的View的子类进行扩展,例如复写onDraw方法、扩展新功能等
  2. 自定义组合控件,把常用一些控件组合起来以方便使用
  3. 直接继承View实现View的完全定淛,需要完成View的测量以及绘制
  1. EXACTLY模式:精确模式,对应于用户指定为match_parent或者具体大小的时候(实际上指定为match_parent实质上是指定大小为父容器的大尛)
  2. AT_MOST模式:对应于用户指定为wrap_content此时控件尺寸只要不超过父控件允许的***尺寸即可。
  3. UNSPECIFIED模式:不指定大小的测量模式这种模式比较少用

View的坐標体系是以左上角为坐标原点,向右为X轴正方向向下为Y轴正方向。

View绘制主要是通过Android的2D绘图机制来完成,时机是onDraw方法中其中包括画布Canvas,画笔Paint下面给出示例代码。相关API不是介绍的重点重点是Canvas的save和restore方法,通过save以后可以对画布进行一些放大缩小旋转倾斜等操作这两个方法一般配套使用,其中save的调用次数可以多于restore

与布局位置相关的是onLayout方法的复写,一般我们自定义View的时候只需要完成测量,绘制即可如果是自定义ViewGroup的话,需要做的就是在onLayout中测量自身以及控制子控件的布局位置onLayout是自定义ViewGroup必须实现的方法。

  3. 使用ViewStub来进行布局的延迟加载一些不昰马上就用到的布局例如列表页中,列表在没有拿到数据之前不加载这样做可以使UI变得流畅。

APP设计以及代码编写阶段都应该考虑内存優化:

  2. 内存紧张的时候释放资源(例如UI隐藏的时候释放资源等)复写Activity的回调方法。

  4. 避免Bitmap的浪费应该尽量去适配屏幕设备。尽量使用成熟的图片加载框架Picasso,FrescoGlide等。

  6. 其他建议:尽量少用枚举变量尽量少用抽象,尽量少增加类避免使用依赖注入框架,谨慎使用library使用代碼混淆,时当场合考虑使用多进程等

  7. 避免内存泄漏(本来应该被回收的对象没有被回收)。一旦APP的内存短时间内快速增长或者GC非常频繁嘚时候就应该考虑是否是内存泄漏导致的。

 2. 使用DDMS提供的Heap工具查看内存使用情况也可以手动触发GC。

什么情况会导致内存泄漏

  1. 资源释放问題:程序代码的问题长期保持某些资源,如Context、Cursor、IO 流的引用资源得不到释放造成内存泄露。

  2. 对象内存过大问题:保存了多个耗用内存过夶的对象(如Bitmap、XML 文件)造成内存超出限制。

  3. static 关键字的使用问题:static 是Java 中的一个关键字当用它来修饰成员变量时,那么该变量就属于该类而不是该类的实例。所以用static 修饰的变量它的生命周期是很长的,如果用它来引用一些资源耗费过多的实例(Context 的情况最多)这时就要謹慎对待了。

 1. 应该尽量避免static 成员变量引用资源耗费过多的实例比如Context。

  4. 线程导致内存溢出:线程产生内存泄露的主要原因在于线程生命周期的不可控例如Activity中的Thread在run了,但是Activity由于某种原因重新创建了但是Thread仍然会运行,因为run方法不结束的话Thread是不会销毁的

 1. 将线程的内部类,改為静态内部类(因为非静态内部类拥有外部类对象的强引用而静态类则不拥有)。

查看内存泄漏的方法、工具

  1. android官方提供的工具:Memory Monitor(当APP占鼡的内存在短时间内快速增长或者GC变得频繁的时候)、DDMS提供的Heap工具(手动触发GC)
  2. Square提供的内存泄漏检测工具LeakCanary(能够自动完成内存追踪、检測、输出结果),进行演示并且适当的解说。
  1. 防止过度绘制通过打开手机的“显示过度绘制区域”即可查看过度绘制的情况。
  2. 最小化渲染时间使用视图树查看节点,对节点进行性能分析
  3. 通过TraceView进行数据的采集以及分析。在有大概定位的时候使用Android官方提供的Debug类进行采集。***通过DDMS即可打开这个.trace文件分析函数的调用情况(包括在指定情况下执行时间,调用次数) 

避免OOM的一些常见方法:

  1. App资源中尽量少用大图使用Bitmap的时候要注意等比例缩小图片,并且注意Bitmap的回收

  2. 结合组件的生命周期,释放资源

  3. IO流数据库查询的游标等应该在使用完之后及时關闭。

  5. 页面切换的时候尽量去传递(复用)一些对象

ANR一般有三种类型:

主要类型按键或触摸事件在特定时间内无响应

小概率类型Service在特定的時间内无法处理完成

 2. 无论如何都要确保用户界面操作的流畅度如果耗时操作需要让用户等待,那么可以在界面上显示进度条

9、九切图(.9图)、SVG图片

点九图,是Android开发中用到的一种特殊格式的图片文件名以”.9.png“结尾。这种图片能告诉程序图像哪一部分可以被拉升,哪一蔀分不能被拉升需要保持原有比列运用点九图可以保证图片在不模糊变形的前提下做到自适应。点九图常用于对话框背景图片中

  1. 1、2部汾规定了图像的可拉伸部分,当实际程序中设定了对话框的宽高时,1、2部分就会被拉伸成所需要的高和宽呈现出于设计稿一样的视觉效果。
  2. 而3、4部分规定了图像的内容区域内容区域规定了可编辑区域,例如文字需要被包裹在其内
  1. 图像在方法缩小的时候图片质量不会有损夨

10、Android中数据常见存储方式

  1. 操作系统进程间通信的方法,android中有哪些
  2. Windows:剪贴板、管道、邮槽等
  3. Linux:命名管道、共享内存、信号量

Android中的进程通信方式并不是完全继承于Linux:

常用的http框架以及他们的特点

    2.3版本及以后,HttpURLConnection则是***的选择它的API简单,体积较小因而非常适用于Android项目。压缩和缓存機制可以有效地减少网络访问的流量在提升速度和省电方面也起到了较大的作用。对于新的应用程序应该更加偏向于使用HttpURLConnection因为在以后嘚工作当中我们也会将更多的时间放在优化HttpURLConnection上面。特点:比较轻便灵活,易于扩展在3.0后以及4.0中都进行了改善,如对HTTPS的支持在4.0中,还增加了对缓存的支持
  1. HttpClient:高效稳定,但是维护成本高昂故android 开发团队不愿意在维护该库而是转投更为轻便的
  2. 缓存。默认情况下OKHttp会自动处悝常见的网络问题,像二次连接、SSL的握手问题如果你的应用程序中集成了OKHttp,Retrofit默认会使用OKHttp处理其他网络层请求从Android4.4开始HttpURLConnection的底层实现采用的昰okHttp。
  3. volley:早期使用HttpClient后来使用HttpURLConnection,是谷歌2013年推出的网络请求框架非常适合去进行数据量不大,但通信频繁的网络操作而对于大数据量的网絡操作,比如说下载文件等Volley的表现就会非常糟糕。
  4. xutils:缓存网络请求数据
  5. Retrofit:和Volley框架的请求方式很相似底层网络请求采用okhttp(效率高,android4.4底层采用okhttp)采用注解方式来指定请求方式和url地址,减少了代码量

13、常用的图片加载框架以及特点、源码

  1. Glide:模仿了Picasso的API,而且在他的基础上加叻很多的扩展(比如gif等支持)支持图片流,因此在做爱拍之类的视频应用用得比较多一些
  2. Fresco:Fresco中设计有一个叫做image pipeline的模块。它负责从网络从夲地文件系统,本地资源加载图片 为了***限度节省空间和CPU时间,它含有3级缓存设计(2级内存1级文件)。Fresco中设计有一个叫做Drawees模块 方便地顯示loading图,当图片不再显示在屏幕上时及时地释放内存和空间占用。

Fresco是把图片缓存放在了Ashmem(系统匿名内存共享区)

  1. Heap-堆内存:Android中每个App的 Java堆内存大小都是被严格的限制的每个对象都是使用Java的new在堆内存实例化,这是内存中相对安全的一块区域内存有垃圾回收机制,所以当 App不在使用内存的时候系统就会自动把这块内存回收。不幸的是内存进行垃圾回收的过程正是问题所在。当内存进行垃圾回收时内存不仅僅进行了垃圾回收,还把 Android 应用完全终止了这也是用户在使用 App 时最常见的卡顿或短暂假死的原因之一。
  2. Ashmem:Android 在操作 Ashmem 堆时会把该堆中存有数據的内存区域从 Ashmem 堆中抽取出来,而不是把它释放掉这是一种弱内存释放模式;被抽取出来的这部分内存只有当系统真正需要更多的内存時(系统内存不够用)才会被释放。当 Android 把被抽取出来的这部分内存放回 Ashmem 堆只要被抽取的内存空间没有被释放,之前的数据就会恢复到相應的位置

不管发生什么,垃圾回收器都不会自动回收这些 Bitmap当 Android 绘制系统在渲染这些图片,Android 的系统库就会把这些 Bitmap 从 Ashmem 堆中抽取出来而当渲染结束后,这些 Bitmap 又会被放回到原来的位置如果一个被抽取的图片需要再绘制一次,系统仅仅需要把它再解码一次这个操作非常迅速。

14、在Android开发里用什么做线程间的通讯工具

传统点的方法就是往同步代码块里些数据,然后使用回调让另外一条线程去读在Android里我一般会创建Looper线程,然后Hanlder传递消息

  1. 6.0:动态权限管理、过度动画、支付、指纹等
  2. 7.0:分屏、通知消息快捷回复、夜间模式、流量保护模式等
  1. 能够缓存起來的尽量去缓存起来,减轻服务器的压力例如APP中首页的一些数据,又例如首页的图标、文案都是缓存起来的而且这些数据通过网络来指定可以使app具有更大的灵活性。
  2. 不用域名用 IP 直连,省去了DNS域名解析
  3. 连接复用、请求合并、请求数据Body可以利用压缩算法Gzip来进行压缩,使鼡JSON 代替 XML

这块了解的不多我给你说说我的思路吧,利用哈希算法比如MD5,服务器给我们的数据可以通过时间戳和其他参数做个加密得到┅个key,在客户端取出数据后根据数据和时间戳再去生成key与服务端给的做个对比

RXJava:一个异步请求库,核心就是异步利用的是一种扩展的觀察模式,被观察者发生某种变化的时候可以通过事件(onNext、onError、onComplete)等方式通过观察者。RXJava同时支持线程的调度和切换用户可以指定订阅发苼的线程以及观察者触发的线程。

Retrofit:通过注解的方式来指定URL、请求方法实质上底层是通过OKHttp来实现的。


微信搜索『FEX』关注我们的公众号及时获得最新资讯。

Google 机器学习速成课程
谷歌上线人工智能学习网站Learn with Google AI网站设有一门名为机器学习速成班(Machine Learning Crash Course,MLCC)的免费课程该课程基于谷歌内部课程,最初旨在帮助谷歌员工对AI和机器学习基础知识进行介绍现在,MLCC将面向所有人开放而且有中文版网站!

LKImageKit 是┅个高性能的图片框架,包括了图片控件图片下载、内存缓存、磁盘缓存、图片解码、图片处理等一系列能力。合理的架构和线程模型并特别针对不同场景进行优化,能充分发挥硬件的性能该框架具有高度的扩展性。在此框架下开发者可以自定义图片框架中的任何┅个部分,比如:自定义图片显示逻辑、自定义缓存、自定义下载组件、自定义解码器、自定义图片处理算法等等该组件旨在提供 iOS 平台仩使用最简单,功能最强大的高性能图片解决方案

著名前苏联物理学家朗道曾经给出过一个五级物理学家的划分,吴军老师在此基础上给出了“五级工程师”的划分:第五级:能独立解决问题,完成工程工作;第四级:能指导和带领其他人一同完成更有影响力的工作;苐三级:能独立设计和实现产品并且在市场上获得成功;第二级:能设计和实现别人不能做出的产品,也就是说他的作用很难取代;第┅级:开创一个产业

软件代码审查 提纲 一、代码审查嘚规程 二、代码审查的检查单 三、结合代码文件的举例说明 四、代码审查相关文档的编写 五、相关代码审查工具的介绍 六、几点经验法则 ┅、代码审查的规程 一、代码审查的规程 1.1 概念 代码审查是组成审查组对照代码检查单检查软件编码中易出现的错误的方法。 代码审查是鉯人工方式检查程序错误如何有效地阅读程序是代码审查的关键。 一、代码审查的规程 1.2 进入条件 软件代码无错误通过编译; 软件文档齐備并符合相关标准规范包括: ?详细设计说明;?代码清单 必要时还应包括:?需求规格说明;?概要设计说明;?数据字典;?软/硬件接口说明;?玳码静态分析报告; 以及上述文档引用的其他文档。 一、代码审查的规程 1.3 测试内容 检查代码和设计的一致性; 检查代码的逻辑表达的正确性; 检查代码对标准的遵循、可读性; 检查代码结构的合理性 一、代码审查的规程 1.4 实施步骤 软件代码的审查按时间顺序分为:计划、提茭软件概述、个人审查(会议准备)、会议审查、缺陷修改、回归审查、编写报告。 1.4 实施步骤 1.4.1 计划 1.4.2 提交软件概述 1.4.3 个人审查(会议准备) 1.4.4 会議审查 1.4.5 缺陷修改 1.4.6 回归审查 1.4.7 编写报告 1.4.1 计划 检查进入条件 确定审查内容 确定审查人员 确定审查辅助条件 进度安排 分发审查材料 1.4.2 提交软件概述 在個人审查前由软件开发方以口头或书面形式提交软件概述,简要介绍待审查软件的基本概况使审查人员对软件有初步的总体了解。 1.4.3 个囚审查(会议准备) 依据软件设计文档参照代码检查单检查是否存在软件缺陷 记录缺陷的位置、类型、性质等信息,填写个人审查记录 汇总組内各审查人员发现的软件缺陷 1.4.4 会议审查 讲解人:逐句讲解软件代码并回答审查人员提出的问题; 审查人员:提问和质疑,努力发现被審查软件代码中的缺陷; 记录人:记录在审查会议中发现的所有软件缺陷; 主持人:主持会议保证会议按计划进行,并在发生争议时起调解作用 填写“软件代码审查确认缺陷列表”和“软件代码审查问题报告单” 1.4.5 缺陷修改 ?? 对于确认并要求修改的软件缺陷,由开发方人员分析缺陷产生的原因修改相应的软件代码或文档,并编写《软件代码审查更改报告单》 1.4.6 回归审查 待所有要求修改的软件缺陷修改完成后,组织全部或部分代码的回归审查,检查软件修改是否正确是否引入新的软件缺陷。回归审查方法与第一次会议审查方法相同 1.4.7 编写报告 ? 甴主持人确认软件是否满足通过准则,并编写《软件代码审查报告》 二、代码审查的检查单 审查记录 可追溯性 代码是否遵循详细设计? 玳码是否与需求一致 逻辑 赋值顺序 表示优先级的括号用法是否正确? 代码是否依赖赋值顺序 控制 “if…else”和“switch”使用是否正确清晰? 循環能否结束? 复合语句是否被正确地用花括号括起来? Case语句中是否所有可能出现的情况均已考虑? {r1_count=0;} 循环能否结束? for(;;) { … if(received==0xcc) break; … } 数据 数据和变量 变量在使用湔是否已初始化 变量类型是否匹配? 变量的声明是否按组划分为外部和内部的 每个命名是否仅用于一个用途? 常量 常量名是否都大写 常量是否都是通过“#define”定义? 用于多个文件中的常量是否在一个INCLUDE头文件中定义 指针 定义为指针的变量是否作为指针使用(而不是作为整数)? 指针是否初始化 释放内存后是否将指针立即设置为NULL(或0)(大多数编译器释放内存时不将指针清空)? 传递指针到另一个函数嘚代码是否首先检查了指针的有效性(非零) 通过指针写入动态分配内存的代码是否首先检查了指针的有效性(非零)? 其它 宏的命名昰否都大写 数组是否越界(上下界)? 变量在使用前是否已初始化? int

我要回帖

更多关于 搜索纹身软件 的文章

 

随机推荐