- 博客(117)
- 资源 (80)
- 收藏
- 关注

转载 Android新手入门思维导图
本文来自AndroidDeveloper的公众号,您可以搜索公众号:googdev,来获取AndroidDeveloper的技术干货。———-/////////////////////////——————–正文———-/////////////////////////——————–如何快速入门和进阶安卓开发,是很多技术小白的疑问。大家都知道,Android开发要学的技能非常多,技术更新速度还快,但是
2016-10-21 09:45:03
7624
原创 Android组件生命周期管理
每个Android应用启动时,都会先创建一个Application。通常在Application里我们会做一些应用初始化的操作,常见的有第三方SDK初始化。在应用组件化之后,组件与壳工程是隔离开来的,但是组件有时候也需要获取应用的Application,也需要在应用启动时进行初始化。这就涉及到组件的生命周期管理问题。最简单的实现方式如下:我们定义一个Application的代理接口IAppL...
2020-01-14 19:44:24
1238
原创 Android组件化开发
开发模式为了便于区分,在这里将开发模式分为2种:一种是项目组件化开发模式,一种是单一工程开发模式。单一工程开发模式顾名思义,就是一个代码工程(Project)对应一个APP了,这个APP的所有业务功能都是集中在同一个工程里实现的。捕获.PNG上图是目前比较普遍使用的Android APP技术架构,往往是在一个界面中存在大量的业务逻辑,而业务逻辑中充斥着各种网络请求、数据操作等行为,整个项...
2019-12-21 15:44:10
1159
原创 Android字节码插桩
什么是字节码插桩字节码插桩就是在构建的过程中,通过修改已经编译完成的字节码文件,也就是class文件,来实现功能的添加。简单来讲,我们要实现无埋点对客户端的全量统计。这里的统计概括的范围比较广泛,常见的场景有:页面(Activity、Fragment)的打开事件各种点击事件的统计,包括但不限于Click LongClick TouchEventDebug期需要统计各个方法的耗时。注意这里...
2019-12-11 18:49:20
3990
原创 Gradle自定义插件
Android GradleAndroid项目使用 Gradle 作为构建框架,Gradle 又是以Groovy为脚本语言。所以学习Gradle之前需要先熟悉Groovy脚本语言。Groovy是基于Java语言的脚本语言,所以它的语法和Java非常相似,但是具有比java更好的灵活性。Android Gradle 的 Project 和 Tasks这个是Gradle中最重要的两个概念。每次...
2019-12-11 18:20:35
771
原创 Java8新的异步编程方式CompletableFuture
Java并发编程(一)线程创建、生命周期、控制这篇文章我们提到过Future可以实现异步编程,但是Future模式有自己的缺点:Future虽然可以实现获取异步执行结果的需求,但是它没有提供通知的机制,我们无法得知Future什么时候完成。要么使用阻塞,在future.get()的地方等待future返回的结果,这时又变成同步操作。要么使用isDone()轮询地判断Future是否完成,这样...
2019-11-30 16:08:33
6719
原创 Android使用WindowManager实现悬浮窗
上一篇文章Framework学习(十一)WindowManager体系我们分析了WindowManager的用法及源码,这篇文章我们使用WindowManager实现一个简单的悬浮窗效果。类似与下面这种效果:项目目录项目目录结构很简单,一个MainActivity,一个WindowService。MainActivity只有两个按钮,用于启动和关闭WindowService。添加实现悬浮窗的逻辑全部
2017-10-27 17:09:31
3090
1
原创 Framework学习(十一)WindowManager体系
Window、WindowManager和WMSWindow是一个抽象类,具体的实现类为PhoneWindow,它是对View进行管理的。WindowManager是一个接口类,继承自父接口ViewManager,它是用来管理Window的,它的具体实现类为WindowManagerImpl。WMS是WindowManager进行窗口管理的具体实施者,如果我们想要对Window进行添加和删除就
2017-10-26 15:56:38
2023
1
原创 Java并发编程(四)未处理异常、线程池和ThreadLocal类
未处理异常以我们通常的经验,如果线程执行过程中抛出了未处理异常(没有用try-catch),那么我们的APP就会崩溃,并且我们可以从Error Log中看到出错的异常堆栈信息。那么我们有没有方法,在异常抛出之前对该异常进行处理呢?Thread.UncaughtExceptionHandler是Thread类的一个静态内部接口,该接口只有一个方法:void uncaughtException(Thre
2017-10-25 10:34:45
2495
原创 Android应用内跳转Scheme协议
之前一篇文章WebView使用解析(一)之基本用法我讲过了WebView与JS交互的方式,JS调用Java代码主要是通过对象注入的方式实现的,即使用addJavascriptInterface。而JAVA调用JS代码则是通过javascript:伪协议来实现的,即javascript:methodName(params……)。但是这种交互方式存在着不少问题: 1、Java 调用 js 里面的函数,
2017-10-18 16:38:14
7805
原创 Framework学习(十)Content Provider启动过程
关于Content Provider的使用请参考Android ContentProvider全面解析这篇文章。query方法到AMS的调用过程在上述文章中我用到了Content Provider查询数据库的例子如下:private void query() { Cursor cursor = this.getContentResolver().query(mCurrentURI,
2017-10-10 17:01:40
1333
原创 Framework学习(九)Broadcast的注册、发送和接收过程
广播的注册BroadcastReceiver的注册分为两种:静态注册和动态注册。静态注册在应用安装时由PackageManagerService来完成注册过程。这里只介绍BroadcastReceiver的动态注册。动态注册BroadcastReceiver,需要调用registerReceiver方法,它的实现在ContextWrapper中。frameworks/base/core/java/a
2017-10-10 10:41:50
2415
原创 Framework学习(八)Service的启动/绑定过程
之前的文章Framework学习(五)应用程序启动过程我们讲解过了应用程序(Activity)的启动过程,本篇我们来看看Service的启动/绑定过程。Service的启动过程ContextImpl请求AMS要启动Service,我们会调用startService方法,它的实现在ContextWrapper中。frameworks/base/core/java/android/content/Con
2017-10-09 14:30:18
1958
原创 Framework学习(七)AMS家族
相信绝大部分读者对ActivityManagerService(简称AMS)都有所耳闻。AMS是Android中最核心的服务,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块相类似,因此它在Android中非常重要。AMS启动流程在Framework学习(三)SystemServer进程启动过程这篇文章我们简单介绍过SystemServer
2017-10-07 14:04:11
3309
原创 Framework学习(六)应用程序进程启动过程
概述上篇文章Framework学习(五)应用程序启动过程我们讲解了应用程序启动过程,但是还有一个遗留知识点,那就是应用程序进程的启动。我们知道应用程序启动之前需要保证应用程序的进程先启动,本文我们就来看看应用程序进程的启动过程。AMS在启动应用程序时会检查这个应用程序需要的应用程序进程是否存在,不存在就会请求Zygote进程将需要的应用程序进程启动。在Framework学习(二)Zygote进程启动
2017-10-03 18:17:56
2112
原创 Framework学习(五)应用程序启动过程
在Android系统中,启动四大组件中的任何一个都可以启动应用程序。但绝大部分时候我们是通过点击Launcher图标来启动应用程序。本文依据Android7.0源码,从点击Launcher图标开始,分析应用程序的启动过程,其实就是分析根Activity的启动过程。Launcher请求AMS在Framework学习(四)Launcher启动过程 这篇文章我讲过Launcher启动后会将已安装应用程序的
2017-10-02 15:59:15
3632
原创 Framework学习(四)Launcher启动过程
Launcher概述上一篇文章Framework学习(三)SyetemServer进程启动过程中我们讲解了SystemServer进程的相关知识,我们知道SystemServer进程主要用于启动系统的各种服务,其中就包含了Launcher服务,LauncherAppService。Android系统默认第一个启动的应用程序是Home应用程序,这个应用程序用来显示系统中已经安装的应用程序,这个Home
2017-10-01 22:58:14
3442
原创 Framework学习(三)SystemServer进程启动过程
SyetemServer进程的启动在上一篇文章Framework学习(二)Zygote进程启动过程中,我们已经知道Zygote进程会启动SyetemServer进程,但具体启动流程还没有涉及,本文我们就来看看SyetemServer进程具体启动过程。首先回顾下ZygoteInit#startSystemServer()函数:frameworks/base/core/java/com/android/
2017-09-30 16:17:29
4757
原创 Framework学习(二)Zygote进程启动过程
android系统进程启动流程android系统的Zygote进程是所有android进程的父进程,包括SystemServer和各种应用进程都是通过Zygote进程fork出来的。Zygote(孵化)进程相当于是android系统的根进程,后面所有的进程都是通过这个进程fork出来的,而Zygote进程则是通过linux系统的init进程启动的,也就是说,android系统中各种进程的启动方式:i
2017-09-30 11:11:08
6566
原创 Framework学习(一)Android 系统架构
Android系统架构Android本质就是在标准的Linux系统上增加了Java虚拟机Dalvik/ART,并在Dalvik/ART虚拟机上搭建了一个JAVA的application framework,所有的应用程序都是基于JAVA的application framework之上。android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和Linux内核层。应用程序层
2017-09-29 16:59:41
22180
6
原创 Java Class对象与反射机制
Java Class对象RTTIRTTI(Run-Time Type Identification)运行时类型识别,其作用是在运行时识别一个对象的类型和类的信息。这里分两种:传统的”RRTI” — 它假定我们在编译期已知道了所有类型(在没有反射机制创建和使用类对象时,一般都是编译期已确定其类型,如new对象时该类必须已定义好)反射机制 — 它允许我们在运行时发现和使用类型的信息在
2017-09-15 14:58:28
997
原创 Java并发编程(三)Java内存模型及volatile
内存模型相关概念大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程则慢得多(不是一个数量级),因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。因此在CPU里面就有了高速缓存。也就是说,当程序在运行过程中,会将运算需要的数据从主内
2017-09-13 14:39:47
849
1
原创 Java并发编程(二)线程同步和等待唤醒机制
概述线程安全是并发编程中的重要关注点,应该注意到的是,造成线程安全问题的主要原因有两点,一是存在共享数据(也称临界资源),二是存在多条线程共同操作共享数据。 因此为了解决这个问题,我们可能需要这样一个方案,当存在多个线程操作共享数据时,需要保证同一时刻有且只有一个线程在操作共享数据,其他线程必须等到该线程处理完数据后再进行,这种方式有个名称叫互斥锁,即能达到互斥访问目的的锁。线程同步synchro
2017-09-12 10:38:56
7401
1
原创 Java并发编程(一)线程创建、生命周期、控制
进程和线程进程是处于运行中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单元。 特征:独立性:进程是系统中独立存在的实体,拥有自己的独立资源,没一个进程拥有自己私有的地址空间。没有经过允许的情况下,一个进程是不可以访问其他进程的地址空间。动态性:进程与程序区别,一个是静态指令集合,一个是正在系统中活动的指令集合,加入了事件的概念。进程具有自己的生命周期和状态,程序没有。
2017-09-08 16:40:51
761
原创 Android App Widget 开发
概述App Widget是应用程序窗口小部件(Widget),是微型的应用程序视图,它可以被嵌入到其它应用程序中(比如桌面)并接收周期性的更新。你可以通过一个App Widget Provider来发布一个Widget。Widget布局appwidget-provider标签这个东西是用来定义桌面widget的大小,初始状态等等信息的,它的位置应该放在res/xml文件夹下,具体的xml参数如下:a
2017-09-07 13:43:01
5654
原创 Java 八大排序算法
概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。我们这里说说八大排序就是内部排序。 插入排序思想:每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的子序列的合适位置,直到全部插入排序完为止。 关键问题:在前面已经排好序的序列中找到合适的插入位置。 方法:直接插入排序二分插入排序希
2017-09-05 10:00:33
8739
3
原创 Android开发之OAuth 2.0浅析
OAuth2.0OAuth 概念OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的最新版本是2.0版。2.0版不向后兼容OAuth 1.0,即完全废止了OAuth1.0。2012年10月,OAuth 2.0协议正式发布为RFC 6749。OAuth2.0是现在第三方授权主要采取的一种协议。简单的说就是:第三方应用在不知道用户的用户名、密码等认证ID的情
2017-08-31 14:40:42
3292
原创 Android 内存检测工具
所谓内存泄漏,是指本该被回收的内存由于某种原因绕开了GC回收算法,从而导致该内存无法被有效数据使用而使得总内存减小的情况。内存泄漏会导致内存消耗的增加,大量的消耗会使得APP OOM,特别是在一些内存比较小的机器上。下面我们看看有哪些工具可以用来分析内存泄漏。Heap DumpHeap Dump的主要功能就是查看不同的数据类型在内存中的使用情况。它可以帮助你找到大对象,也可以通过数据的变化发现内存泄
2017-08-28 17:02:58
12248
原创 Android 性能检测工具
trace文件trace.txt是系统用于保存ANR Log的文件,通过这个文件可以找到系统检测到的ANR的应用。ANR的定义在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框。用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”。所以一个流畅的合理的应用程
2017-08-28 10:26:08
1394
原创 详解Android注解 Annotation
概念及作用概念注解即元数据,就是源代码的元数据注解为在代码中添加信息提供了一种形式化的方法,可以在后续中更方便的 使用这些数据Annotation是一种应用于类、方法、参数、变量、构造器及包声明中的特殊修饰符。它是一种由JSR-175标准选择用来描述元数据的一种工具。作用生成文档跟踪代码依赖性,实现替代配置文件功能,减少配置。如一些注解在编译时进行格式检查,如@Override等每当你
2017-08-23 15:55:07
2348
1
原创 Android 热修复技术
介绍2015年以来,Android开发领域里对热修复技术的讨论和分享越来越多,同时也出现了一些不同的解决方案,如QQ空间超级补丁方案、阿里AndFix以及微信Tinker,它们在原理上各有不同,适用场合也各有差异。QQ空间超级补丁技术和微信Tinker是通过增加或替换整个DEX的方案,可参考QQ空间团队的 安卓App热补丁动态修复技术介绍 以及微信Tinker的一切都在这里,包括源码(一)。而阿里
2017-08-15 10:41:26
739
转载 《深入理解Java虚拟机》第7章 虚拟机类加载机制
代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步。7.1 概述上一章我们了解了Class文件存储格式的具体细节,在Class文件中描述的各种信息,最终都需要加载到虚拟机中之后才能运行和使用。而虚拟机如何加载这些Class文件?Class文件中的信息进入到虚拟机后会发生什么变化?这些都是本章将要讲解的内容。虚拟机把描述类的数据从Class文件加载到内存,并对数据
2017-08-11 10:44:28
1145
1
转载 《深入理解Java虚拟机》第6章 类文件结构
代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步。6.1 概述记得在第一节计算机程序课上我的老师就讲过:“计算机只认识0和1,所以我们写的程序需要经编译器翻译成由0和1构成的二进制格式才能由计算机执行”。10多年时间过去了,今天的计算机仍然只能识别0和1,但由于最近10年内虚拟机以及大量建立在虚拟机之上的程序语言如雨后春笋般出现并蓬勃发展,将我们编写的程序编译
2017-08-01 16:25:42
970
1
原创 Android 6.0 运行时权限处理
6.0之前的权限模型在AndroidManifest中声明可能用到的所有权限用户在安装时,系统展示所有权限,用户安装即授予所有权限,取消则拒绝安装6.0新的运行时权限将权限分为一般权限(Normal Permissions)和危险权限(Dangerous Permission)两种,一般权限跟以前一样在AndroidManifest声明,危险权限需要开发者在代码中手动的动态申请动态申请权限
2017-07-28 13:16:38
1068
原创 Android ViewPager用法解析
ViewPager简介ViewPager是android扩展包v4包中的类,这个类可以让用户左右切换当前的view:ViewPager类直接继承了ViewGroup类,所有它是一个容器类,可以在其中添加其他的view类。ViewPager类需要一个PagerAdapter适配器类给它提供数据。ViewPager经常和Fragment一起使用,并且提供了专门的FragmentPagerAdapt
2017-07-21 21:52:48
3157
原创 浅谈Android MVP模式
随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责。为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数据的展示以及与用户的交互,同时让Model只关心数据的处理,基于MVC概念的MVP(Model-View-Presenter)模式应运而生。MVC/MVP区别MVC模式MVC模式的结构分为三部分,实体层的Model,视图层的View,以及控制层的Control
2017-07-11 21:05:07
591
原创 SwipeRefreshLayout及其扩展使用
概述我们之前使用的比较多的下拉刷新、上拉加载框架有PullToRefreshListView,本文我们来说说SwipeRefreshLayout。SwipeRefreshLayout是Google官方更新的一个Widget,可以实现下拉刷新的效果。该控件继承自ViewGroup在support-v4兼容包下,不过我们需要升级supportlibrary的版本到19.1以上。官方SwipeRefres
2017-07-06 22:32:32
16691
原创 android Apk打包过程概述
使用ant命令行打包android应用程序首先我们来了解一下android打包到底做了哪些事? (1)打包资源文件,生成R.java文件 (2)处理aidl文件,生成相应java 文件 (3)编译所有java文件,生成相应class 文件 (4)打包class文件和jar包,生成classes.dex文件 (5)打包assets和res资源,生成资源压缩包(例如res.zip,名字可以自己
2017-07-03 16:27:49
1853
原创 RxJava的使用详解
介绍RxJava 在 GitHub 主页上的自我介绍是 “a library for composing asynchronous and event-based programs using observable sequences for the Java VM”(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库)。 其实, RxJava 的本质可以压缩为异步这一个词
2017-06-23 15:52:27
1142
Android MediaPlayer和VideoView的使用
2016-11-25
Android ContentProvider全面解析
2016-11-18
Android Camera开发(一)之基础知识
2016-11-10
Android Service IPC通信之Messenger机制
2016-10-30
Android-component-application-master.7z
2020-01-26
Android App Widget 开发
2017-09-08
Java 八大排序算法
2017-09-06
ShareSDK第三方登录
2017-09-01
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人