Android埋点方案的简单实现-AOP之AspectJ
个人博客
http://www.milovetingting.cn
Android埋点方案的简单实现-AOP之AspectJAOP的定义
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。
以上关于AOP的定义引用自百度百科。
AOP的运用场景
日志记录、性能统计、权限控制、埋点等
AOP的具体实现方案有很多,这里选用AspectJ来简单实现
监听View的点击、页面打开、关闭
为方法添加开始、结束的日志
统计方法运行时间
AspectJ的使用AspectJ的引入这里引用AspectJX,AspectJX是基于AspectJ的一个AOP框架
新建Android工程,在项目根目录下的build.gradle文件中添加依赖
12345dependencies { //... classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.8' ...
单例模式
个人博客
http://www.milovetingting.cn
单例模式模式介绍整个系统只需要拥有一个全局对象,这样有利于我们协调系统整体的行为。
定义确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
实现单例模式主要有如下几个关键点:
构造函数不对外开放,一般为private
通过一个静态方法或者枚举返回单例类对象
确保单例类的对象有且只有一个,尤其是在多线程环境下
确保单例类对象在反序列化时不会重新构建对象
单例模式的写法
饿汉式
在声明静态对象时已经初始化。
12345678910111213public class Singleton { private static final Singleton mInstance = new Singleton(); private Singleton() { } public static Singleton getInstance() { return mInstance; }}
懒汉式
懒汉模式是声明一个静态对象,并且在用户第 ...
面向对象的六大原则
个人博客
http://www.milovetingting.cn
面向对象的六大原则单一职责原则就一个类而言,应该仅有一个引起它变化的原因。
开闭原则软件中的对象(类、模块、函数等)应该对于扩展是开放的,对于修改是封闭的。
遵循开闭原则的重要手段是通过抽象。
里氏替换原则所有引用基类的地方必须能透明地使用其子类的对象。
依赖倒置原则
高层模块不应该依赖低层模块,两者都应该依赖其抽象
抽象不应该依赖细节
细节应该依赖抽象
接口隔离原则类之间的依赖应该建立在最小的接口上。
迪米特原则一个类应该对其他对象有最少的了解。
四大组件的工作过程
个人博客
http://www.milovetingting.cn
四大组件的工作过程
四大组件:Activity、Service、BroadcastReceiver、ContentProvider
四大组件的运行状态Android的四大组件中除了BroadcastReceiver,其它三种组件必须在AndroidManifest中注册。对于BroadcastReceiver,既可以在AndroidManifest中注册,也可以通过代码注册。调用方式上,Activity、Service和BroadcastReceiver都需要借助Intent,而ContentProvider则不需要。
Activity是一种展示型组件。Activity的启动由Intent触发,Intent可以分为显示Intent和隐式Intent。
Service是一种计算型组件,它有两种状态:启动状态和绑定状态。Service虽然是运行在后台,但它本身是运行在主线程中。
BroadcastReceiver是一种消息型组件。它的注册有两种:静态注册和动态注册。
ContentProvider是一种数据共享型组 ...
理解Window和WindowManager
个人博客:http://www.milovetingting.cn
理解Window和WindowManager
1Window表示一个窗口的概念,是一个抽象类,具体实现是PhoneWindow,可以通过WindowManager创建一个Window。WindowManager是外界访问Window的入口,Window具体实现位于WindowManagerService中,WindowManager和WindowManagerService的交互是一个IPC过程。
Window和WindowManagerWindowManager.LayoutParams
关注flags和type两个参数:
Flags参数表示Window的属性,可以控制Window的显示特性。
** FLAG_NOT_FOCUSABLE **
表示Window不需要获取焦点,也不需要接收各种输入事件,此标记会同时启用FLAG_NOT_TOUCH_MODAL,最终事件会直接传递给下层的具有焦点的Window。
** FLAG_NOT_TOUCH_MODAL **
系统会将当前Window区域以外的单击事件传递 ...
Android Gradle 多渠道构建
个人博客:http://www.milovetingting.cn
Android Gradle 多渠道构建多渠道构建的基本原理在Android Gradle中,定义了一个叫Build Variant的概念,一个Build Variant=Build TYpe+Product Flavor,Build Type就是我们构建的类型,比如release和debug;Product Flavor就是我们构建的渠道,比如Baidu,Google等,它们加起来就是baiduRelease,baiduDebug,googleRelease,googleDebug,共有这几种组合的构件产出。Product Flavor也就是我们多渠道构建的基础。以下是新增一个ProductFlavor:
123456android{ productFlavors{ google{} baidu{} }}
以上的发布渠道配置后,Android Gradle就会生成很多Task。其中, ...
Android Gradle 多项目构建
个人博客:http://www.milovetingting.cn
Android Gradle 多项目构建Android 项目区别Android项目一般分为库项目,应用项目,测试项目,Android Gradle 根据这些项目分别对应3种插件:com.android.library,com.android.application,com.android.test。
Android多项目设置定义一个工程,包含很多项目,在Gradle中,项目的结构没有那么多限制,只要在settings.gradle里配置好这些项目就可以了。
库项目引用的配置Android库项目的引用,通过dependencies实现:
123dependencies{ implements project(':plugin')}
库项目单独发布Maven私服搭建搭建自己的Maven私服,推荐使用Nexus Repositories Manager。
具体的搭建如下:
1、下载。在https://www.sonatype.com/ 选择对应的软件类型,我这里选择的是OS ...
Android Gradle 高级自定义
个人博客:http://www.milovetingting.cn
Android Gradle 高级自定义使用共享库Android的包,如android.app,android.content,android.view,android.widget等,是默认包含在Android SDK库里的,所有应用都可以直接使用它们。还有一些库,如com.google.android.maps,android.test.runner等,这些库是独立的,并不会被系统自动链接,所以如果要使用的话,就需要单独进行生成使用,这类库我们称为共享库。
在AndroidManifest.xml中,我们可以指定要使用的库:
1234<uses-library android:name="com.google.android.maps"android:required="true"/>
这样我们就声明了需要使用maps这个共享库。声明之后,在安装生成的apk包的时候,系统会根据我们的定义,帮助检测手机系统是否有我们需要的共享库。因为我们设置的android: ...
自定义Android Gradle工程
个人博客:http://www.milovetingting.cn
自定义Android Gradle工程defaultConfig默认配置defaultConfig是Android对象中的一个配置项,负责定义所有的默认配置。一个基本的defaultConfig配置如下:
12345678910111213android{ compileSdkVersion 23 buildToolsVersion "23.0.1" defaultConfig{ applicationId "com.wangyz.app" minSdkVersion 14 targetSdkVersion 23 versionCode 1 versionName "1.0" //... }}
applicationIdapplicationId是ProductFlavor的一个属性,用于指定生成的App的包 ...
Android动画
个人博客:http://www.milovetingting.cn
Android动画Android的动画可以分为三种:View动画、帧动画和属性动画,帧动画也属于View动画的一种,只不过它和平移、旋转等常见的View动画在表现形式上略有不同而已。
1、View动画
平移动画:TranslateAnimation
缩放动画:ScaleAnimation
旋转动画:RotateAnimation
透明度动画:AlphaAnimation
用XML来定义属性动画需要定义在res/anim目录下。
2、View动画的特殊使用场景2.1、LayoutAnimationLayoutAnimation使用于ViewGroup,为ViewGroup指定一个动画,它的子元素出场时都会具有这种动画效果。这种效果常用在ListView上。
2.2、Activity的切换效果主要用到overridePendingTransition(int enterAnim,int exitAnim)这个方法,必须在startActivity(intent)或者finish()之后被调用才能生效 ...