自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(149)
  • 资源 (2)
  • 收藏
  • 关注

原创 计算机及相关专业的同学如何规划大学四年?

前言:本文是前段时间给大学学弟学妹们的分享,之前写在「大学生成长之路」这个公众号上,现发布在博客上,希望能给更多需要的人一些建议和启发。这几日在小区门口看到了儿童编程的广告,去年教育部将Python纳入全国计算机等级考试科目,甚至山东省的小学信息技术教材中也加入了Python内容。由此可见国家对计算机科学的重视,也能看到全民学习编程的热情。显然部分原因是市场推动,计算机相关专业毕业生的薪...

2019-05-02 21:21:45 4448 2

原创 Flutter技术概览

前几天Google宣布发布Flutter第一个beta版本,Flutter是一个全新的(其实Flutter很早就有了,前身叫Sky)移动UI框架,用来帮助开发者在iOS和Android平台上开发高质量的原生应用。Flutter是跨平台的免费开源UI框架,iOS和Android可以共用一套代码。Flutter官网地址为https://flutter.io/。Flutter的主要优点如下:...

2018-03-04 11:15:51 23346

翻译 使WebAssembly更快:Firefox最新的流式分层编译器

很多人认为WebAssembly是一种可能改变游戏规则的技术,因为它可以使代码在Web上运行得更快。目前已经有了一些 WebAssembly加速技术,还有一些加速方案即将出现。其中一种加速技术就是流式编译,即允许代码一边下载,浏览器一边编译。直到现在(原作者写此文时,Firxfox 58还未发布),流式编译还是一种潜在的加速技术,随着Firefox 58版本的发布,这种技术变成了现实。Fi

2018-01-26 23:10:44 1802

原创 Java反射基础指南

概述本文是一篇入门级别的教程,旨在探索Java反射机制,反射允许在运行时操作类、接口、属性以及方法。在编译时如果不知其名称,使用反射则非常方便。另外,还可以通过反射机制实例化类、调用方法、修改和读取属性字段值。导包使用反射不需要额外的库或Jar,JDK在java.lang.reflect包下提供了一系列的类来支持反射,只需要导入这个包即可,如下: import java.la

2018-01-25 13:34:55 632

原创 Android性能优化思维导图

Android性能优化思维导图

2017-12-06 16:23:29 1173

原创 Android架构组件之LiveData

基本概念LiveData是一个可以被观察的数据持有类,它可以感知并遵循Activity、Fragment或Service等组件的生命周期。正是由于LiveData对组件生命周期可感知特点,因此可以做到仅在组件处于生命周期的激活状态时才更新UI数据。LiveData需要一个观察者对象,一般是Observer类的具体实现。当观察者的生命周期处于STARTED或RESUMED状态时,LiveData会通知

2017-11-29 18:14:26 6567

原创 Android架构组件之ViewModel

Android架构组件之ViewModelViewModel概念及用途ViewModel用来存储和管理UI相关的数据,可于将一个Activity或Fragment组件相关的数据逻辑抽象出来,并能适配组件的生命周期,如当屏幕旋转Activity重建后,ViewModel中的数据依然有效。引入ViewModel之前,存在如下几个问题:通常Android系统来管理UI controllers(如Acti

2017-11-27 15:17:09 6249 3

原创 理解Java动态代理

概念理解动态代理类就是在运行时创建的实现了一系列特定接口的类。为了更好行文,还需要先明确三个概念:代理类——在本文中指动态代理类代理接口——在本文中指动态代理类实现的接口代理实例——在本文中指动态代理类的一个实例动态代理的一些特性:代理类是public或final的,不能是abstract代理类均继承自java.lang.reflect.Proxy类代理类在创建时按顺序实现了所指定的接

2017-11-15 12:38:57 23846

原创 Javac编译过程笔记

Javac前端编译简述这里不讨论JIT编译、AOT编译,本文提到的编译过程仅仅指把.java文件转变为.class文件的过程,这个过程是我们最常见的,通常由Javac编译器来完成。Javac编译器对代码的运行效率几乎没做什么优化,虚拟机设计者把对代码性能的优化集中到了后端的JIT编译器中。之所以这样设计,因为Class文件拥有虚拟机规范严格定义的通用格式,只要符合Class文件格式,就可以被虚拟机正

2017-11-10 14:15:04 868

原创 Android Choreographer

引言之前其实并未关注过Choreographer,在一次调试App demo的过程中,偶然发现出现了一条这样的日志: I/Choreographer: Skipped 1201 frames! The application may be doing too much work on its main thread.这是一条系统日志,意思很明确:主线程的工作可能过多,导致了掉帧。突然发现Ch

2017-11-01 18:42:06 3501

原创 LocalBroadcastManager原理分析及应用

引言Android页面或模块之间通信的方法有很多,如Intent传值、startActivityForResult、EventBus(RxBus)等,大家追求的无非是解耦以及高灵活性;我们自己的应用中使用了基于Android消息机制封装的一套通信体系,且不谈这些,今天的主角是本地广播。本地广播是系统提供的一种应用内通信方式,它跟全局广播相比,其运行机制是不同的。全局广播是系统级别的,需要跨进程调用,

2017-10-12 11:10:45 1437

原创 基础回顾——Java对象创建、内存分配、访问定位概述

对象创建于内存分配Java中创建对象并为其分配内存的过程如下:Java语言层面执行new关键字在Java中,通常使用new关键字来创建一个对象(还没有对象的可以试试^_^),对应在虚拟机中会触发一条new指令。虚拟机处理new指令当虚拟机触发一条new指令时,首先根据指令参数去常量池中检查是否有相关类的符号引用,进一步检查它是否已经被加载、解析和初始化,如果没有,则需要先加载类。对类加载相关的信

2017-09-15 17:19:59 2653

原创 Hybrid框架之交互通信篇

前言虽然有些应用在使用React Native或Weex开发,但综合来看,业内还是以混合开发模式为主,从我们自家的App来看,H5业务所占比重越来越高,目前大概占到35%左右,因此一套好的Hybrid开发框架必不可少。混合开发的一般原则为交互较少、上线周期短、展示性质的页面使用H5开发,如节日活动页、商品秒杀页面等。Hybrid框架要考虑的事情非常多,如页面加载速度、预加载及缓存机制、与原生交互通信

2017-09-08 17:09:04 2454

原创 Android应用快捷方式

有的App会给用户提供快捷方式,8.0之前我们多是通过发送com.android.launcher.action.INSTALL_SHORTCUT 广播的方式来实现。但在8.0的系统行为变更中指出,该广播变为私有的隐式广播,因此原来创建快捷方式的方法在8.0的系统上将不再有效,官方推荐我们使用ShortcutManager来创建应用快捷方式。快捷方式应用场景及类型快捷方式应用场景Android 7.

2017-09-06 17:18:55 3969 2

翻译 Android架构组件

这篇架构指南面向有一定Android开发基础并想了解高质量、高稳定性App最佳实践及推荐架构的开发者。 注意:这篇指南假设读者熟悉Android Framework,如果你是Android开发新手,建议先去学习入门系列课程,这些课程也是作为学习本指南的基础。App开发者面临的常见问题移动开发不同于传统的桌面程序开发,桌面程序一般都有唯一的快捷方式入口,并且常作为单进程存在;而Android A

2017-08-15 10:30:57 4688 2

原创 业内移动App架构参考

业内移动App架构参考近一两年,业内一些移动应用都分享了各自的架构,Android官方也给出过一些架构示例,如MVP、Android Architecture Components等。以下是一些不错的移动架构分享的汇总,方便大家学习查看(排名不分先后)。此列表只是部分,其中也有两个并非移动应用架构,但同样值得学习,另外读者有补充的可以评论留言,我后续会补充该列表。人人车Android客户端架构演进

2017-08-10 16:37:58 3735

原创 Android全面屏适配

什么是全面屏概念很多人可能把全面屏跟曲面屏混淆,其实这是两个不同的概念。一般手机的屏幕纵横比为16:9,如1080x1920、1440x2560等,其比值为1.777777……,全面屏手机出现之前,Android中默认的最大屏幕纵横比(maximum aspect ratio)为1.86,即能够兼容16:9的屏幕。一些手机厂商为了追求更大的屏幕空间以及更极致的用户体验,于是提高了屏幕纵横比,17:9

2017-08-08 15:06:24 25524 7

翻译 Android应用架构

最近整理Android架构的一些东西,想到了此文,虽然是两年前的一篇文章了,却依然很有参考价值,对文中的架构演进过程深有同感,现在也有相当一部分App采用的是类似架构。——by 译者Android应用架构 从传统的Activity+AsyncTask到RxJava驱动的MVP架构。一个软件代码的不同部分应该是相互独立的,但可以在一起完成工作,就像一个运转良好的机器 。Android开发生态发展

2017-08-07 16:30:13 2753 6

原创 一种Android分包策略推荐

分包的重要性在架构一个App时,大家往往都在关注新潮的技术,却忽略了一点,那就是分包。很多人可能没有一套分包的原则,凭感觉甚至随心所欲地创建package或将代码放到任意的package中。虽然最终不会影响App功能,但这个问题其实非常严重。一种不好的分包策略带来的影响将会一直持续在App的开发迭代周期中,主要表现为以下几点:代码混乱,功能模块界限模糊不易阅读与维护,尤其对新人来说功能扩展与重

2017-07-13 19:11:17 3752

翻译 如何加快Gradle的构建速度

Google I/O 2017已经过去几周了,相信大家都参与了这次会议的许多专场。本届I/O的一个具有实际意义的话题是How to speed up your slow Gradle builds。在该专场会议上,Android Studio的工具团队向大家推荐了10条非常有用的建议用来加快gradle的构建速度。个人决定把这些建议整理成一个方便使用的列表,分享如下: 免责声明:这些建议并非个人

2017-06-22 13:31:11 5715

原创 Android开发的二十条经验

我们可以通过自己的摸索实践学到知识,还可以通过学习他人的经验来提升自己,显然第二种是更快的方式。下面是日常Android开发过程中总结出来的一些经验,分享如下:IDE首选Android Studio,并善用优秀的Android Studio插件,如ADB Idea、GsonFormat等熟练使用常用的ADB命令,可以提高开发效率遵循Android特性与设计规范根据功能模块而不是类型来分包调

2017-06-21 13:11:12 753

原创 Java内存模型与线程

前言本文由PPT整理而来。Page1目录进程与线程Java内存模型Java线程Page2进程一般一个应用程序对应一个进程进程有自己的资源和内存地址空间各个进程之间互不干扰进程会保存程序的运行状态,支持切换及恢复进程使操作系统看起来同一时刻有多个任务在执行Page3线程一个进程可以有多个线程多个线程共享同一进程的资源和内存空间线程创建、调度、切换及线程间通信的开销小于进程U

2017-05-12 16:16:02 765

原创 libxxx.so- text relocations问题的终极解决方案

问题表现形式错误或警告日志当targetSdkVersion>=23且使用debug签名时,在6.0+的Android设备上运行App会输出以下错误Log: E/linker: /data/app/packagename/lib/arm/libxxx.so: has text relocations W/System.err: java.lang.UnsatisfiedLinkError:

2017-04-02 20:34:42 42885 17

原创 RemoteViews原理分析及应用

转载请注明出处:http://blog.csdn.net/ahence/article/details/62418926RemoteViews基本概念RemoteViews乍一看名字似乎也是一种View,实则不然,它并不是View。来看RemoteViews的定义及官方说明:/** * A class that describes a view hierarchy that can be dis

2017-03-16 11:17:51 3702

原创 Java类加载器及Android类加载器基础

引子Android插件化与热更新技术日渐成熟,当你研究这些技术时会发现类加载器在其中占据重要地位。Java语言天生就有灵活性、动态性,支持运行期间动态组装程序,而这一切的基础就是类加载器。Java中的类加载器Java灵活性和动态性的原因Java源代码被编译器编译成字节码,即从.java文件编译为.class文件,而.class文件就是通过类加载器加载到虚拟机内存中的。虚拟机的类加载(Class Lo

2017-03-07 11:29:24 2830 1

原创 一种Android客户端架构设计分享

技术发展日新月异,业界各种Android客户端架构设计,五花八门,但我们不能简单地说哪种架构更好,因为脱离业务谈架构是没有任何意义的,适合业务的才是好架构。而架构也不是一成不变的,随着业务的发展,也许当初设计的架构已不足以支撑目前的业务,那么就需要改变之前的架构。接下来将分享下我们Android客户端的架构设计,在App的某个业务发展阶段或许有一些参考意义。分层化与模块化分层化与模块化应该是任何软件

2017-02-23 19:00:37 10428 13

原创 Android Instrumentation源码分析(附Activity启动流程)

Instrumentation概念官方说明Instrumentation类位于android.app包中,继承自java.lang.Object,一些测试用类如InstrumentationTestRunner或MultiDexTestRunner直接或间接继承自该类。官方对于该类的解释如下: Base class for implementing application instrumenta

2017-02-09 22:48:27 6471 1

原创 Android Window纪要

Window概念理解在Andriod开发中经常提到Activity和View,而位于它们之间的Window却较少涉及。Window所表示的是一个抽象的概念,实际上所有View都是依附于Window之上的,包括Activity中的视图、Dialog中的视图以及Toast中的视图。另外View的事件分发也是由Window传递给View的。Window的管理Window是一个抽象类,其具体实现为Phone

2017-01-19 09:40:12 777

原创 面对五花八门的新技术,如何看待与学习

A:最近VR很火啊,大家都在争夺这片蓝海,要学习VR了! B:Google开源TensorFlow了,看来人工智能(AI)是发展方向啊! C:微信推出小程序了,是不是Android、iOS程序员要失业了?赶紧学一番! D:大数据时代来了,是不是要学一下Python呢? E:React、Vue都不知道还好意思说是做前端的!学起来! F:……现在的程序

2017-01-17 16:40:46 2461 2

翻译 App内存占用优化

RAM(Random-access memory)在任何软件开发中都是非常宝贵的资源,移动操作系统由于其物理内存的局限性更是如此。尽管ART(Android Runtime)与Dalvik虚拟机会执行常规的垃圾回收,但这并不意味着可以忽略App中的内存分配与释放。我们应当避免引起内存泄露,如持有静态成员变量而导致无法释放,应当在应用的生命周期回调中释放掉所有的引用。本文主要介绍如何减少App中的内存

2017-01-12 18:47:04 3146

翻译 Android高性能编码最佳实践

本文主要讲一些代码级别的细微优化,但别小看这些,当它们组合起来的时候就能提高App的整体性能。这类的优化不同于算法与数据结构优化所能达到的显著效果,但我们应该把它作为自己的编码习惯从而写出高效的代码。写出高效代码的两个基本原则:不要做不必要的事情不要分配不必要的内存优化一个App时最棘手的问题在于它可能运行于不同的硬件设备上,不同的虚拟机版本、不同的处理器从而导致不同的运行速度;设备有无JIT

2017-01-02 22:26:42 952

原创 Android布局性能优化指南

Android布局是应用的重要组成部分,它直接影响到用户的体验。如果布局不合理则会导致内存占用过多且UI卡顿。Android SDK提供了一些工具可以帮助我们快速定位到影响性能的布局问题,一般可从以下几个方面来进行布局优化。优化布局层次结构众所周知,复杂的网页加载速度很慢,Android应用也一样,复杂的布局结构也将引起性能问题。下面来说明如何使用工具来检查布局并发现性能瓶颈。我们知道,应用中的每个

2016-12-19 21:51:23 1150

翻译 APK瘦身指南

用户一般会不会在应用市场上下载那些看起来很大的App,尤其是当他们使用2G或3G网络或者是按流量付费的时候。因此这篇文章将讲述如何减小APK的大小,从而让更多的用户来下载你的应用。了解APK文件的结构在探讨如何减小App大小之前,有必要先弄清楚APK文件的结构。APK实质上是一个ZIP压缩文件,它包含了构成App的所有文件,如Java类文件,资源文件,以及编译后的资源文件等。一个APK包含以下几个文

2016-12-15 21:47:44 738

翻译 如何配置方法数超过64K的应用

如何配置方法数超过64K的应用随着Android平台的继续成长,Android应用的大小也在变大。当一个应用及其引用的库到达一定的规模,在编译应用时就会遇到构建错误,这表示此App已经达到了Android构建系统的某个限制。在早期的构建系统版本中,此错误表现如下:Conversion to Dalvik format failed:Unable to execute dex: method ID

2016-11-27 14:09:26 1929

原创 关于日益泛滥的Android第三方框架

前言目前Android开发依然很火,如果你关注GitHub,可能会发现越来越多的第三方库与框架(一些简单的库可能称不上框架,为了行文方便,后文统一称之为框架)如雨后春笋般出现。这在一定程度上反映了Android开发的繁荣,但任何事情都有其另一面,第三方框架在方便了App开发的同时,也带来了一些不利影响。最近我们在招聘2~3年工作经验的Android工程师,应聘者简历上的项目介绍无一例外都用到了大量第

2016-10-26 00:04:49 1899

原创 Messenger进程间通信及其原理

前言之前分析Android消息机制的源码时,曾遇到过replyTo、IMessenger等属性字段,当时只是说这些字段用于进程间通信,并未作深入分析。今天这篇文字就来演示一下使用Messenger如何进行进程间通信并分析其源码实现。Messenger进程间通信的流程Messenger顾名思义,即信使,那么它的作用就是满足不同进程两边的通信需要了。通常我们会写AIDL来实现进程间通信,其实简单的IPC

2016-09-30 16:14:54 1270

原创 Java内存分配策略——《深入理解Java虚拟机》笔记

概述Java自动内存管理包含两方面的含义:给对象分配内存以及回收分配给对象的内存。Java对象的内存分配主要是指在堆上分配(也有经过JIT编译后被拆散为标量类型并间接地在栈上分配的情况),对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,则将按线程优先在TLAB(Thread Local Allocation Buffer)上分配。少数情况下也可能会直接分配在老年代中,分配的规则并非百

2016-09-08 10:29:47 1648

原创 常用垃圾收集算法——《深入理解Java虚拟机》笔记

概述垃圾收集器(Garbage Collection, GC)的历史要比Java久远,且并非Java独有,GC主要完成以下三件事情:哪些内存需要回收什么时候回收如何回收对于Java内存运行时区域的各个部分,程序计数器、虚拟机栈、本地方法栈3个线程私有区域是随线程而生,又随线程而灭,因此这几个区域的内存分配和回收都具备确定性,不需要考虑垃圾回收的问题。而Java堆和方法区这两个线程共享区的内存

2016-08-28 22:17:42 1031

原创 理解Java对象克隆

简单的对象拷贝在应用开发中,有时候需要得到一个对象的副本,然后对该副本做一些修改而不影响原始对象,可能大家会想到像下面示例中这样做。假设定义一个Person对象,只有name和age两个字段。public class Person { public String name; public int age; public Person(String name, int age)

2016-08-25 22:40:07 1421

原创 Java内存模型——《深入理解Java虚拟机》笔记

Java内存模型概述Java运行在JVM上,通常说的Java内存模型是指在Java虚拟机上的内存分配模型。Java虚拟机在执行Java程序时会把它管理的内存划分为几个不同的数据区域。这些区域有各自的用途以及创建、销毁时间,有的区域随着虚拟机进程的启动而存在,有的区域则随着用户线程的启动而建立,随着用户线程的结束而销毁。根据《Java虚拟机规范(Java SE 7版)》,Java虚拟机中存在的几块内存

2016-08-25 09:10:14 1074

Animation-Banner源代码

利用属性动画原理实现的Android Banner,不同于传统Banner使用ViewPager的实现

2015-06-26

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除