自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

明天的增加的博客

一切都是最好的安排

  • 博客(71)
  • 资源 (16)
  • 收藏
  • 关注

原创 使用opencv人脸识别对比两张人脸图片

先上效果图: 最近在做opencv进行人脸识别的项目,一直有一个问题没有解决,如图这里就是采用 每次提示都是这里出错,后来去google了,说是javacv环境没有搭建。 接下来就是开发的步骤: 1、就搭建javacv环境,在android studio中的导入jar包如下: tips:这里安装之后还需要给手机安装opencvmanager,之后我会慢慢更新如何不需要安装openc

2017-08-02 09:31:10 20313 7

原创 Android 埋点解决方案

Android埋点存在两种方案,一种是全埋点方案,就是埋点全部自动收集数据,无需开发者写代码,实现方案会很复杂,单模块的开发者控制不了逻辑;二是自埋点方案,大部分的埋点数据都是通过开发者自己埋入信息,自由度很高。具体方案应该说适合的才是最好的。一、全埋点方案无需Android应用程序开发工程师写代码或者只写少量的代码,就能预先自动收集用户的所有行为数据,然后根据实际的业务分析需求从中筛选出所需行为数据并进行分析。全埋点采集事件分为4中:(事件名称前面的$符号,指事件是预置事件,与之对应的是自定义事件)

2020-12-09 16:48:18 3143

原创 EventBus2和EventBus3的使用和原理介绍

EventBus已经发展到第三版了,对于它的使用和原理相对于之前也有了很大的改进。下面就介绍一下EventBus2和EventBus3的使用和原理说明:方法上面的参数设置threadMode:线程工作状态,表示方法在哪个线程执行ThreadMode.POSTING:默认的设置,表示发送消息在哪个线程,就在哪个线程执行方法ThreadMode.MAIN:主线程执行该方法ThreadMode.MAIN_ORDERED:也是在主线程执行,只是不会阻塞主线程ThreadMode.BACKGROUND:后

2020-12-09 15:31:25 300

原创 Android View分析(五)—— 动画介绍

动画分为三种1、传统的平移类动画只是改变控件的视觉效果,但是实际位置没有变动,主要使用的类是TranslateAnimation(平移)、ScaleAnimation(缩放)、RotateAnimation(旋转)、AlphaAnimation(透明度)2、帧动画多张图片播放,这种需要控制图片的大小,不然容易oom3、属性动画3.1 ObjectAnimator动画改变整体控件的位置,类似于传统的平移动画效果,继承ValueAnimator类,对他的封装,主要使用ObjectAnimator类

2020-12-08 15:33:47 169

原创 Android View分析(四)—— 自定义View

自定义控件实现画圆从0到360度的动画效果public class SelfView extends View { private final String TAG = "SelfView"; private Paint mPaint; private int startX = 0; private int startY = 0; /** * 控制动画只执行一次,否则动画会无限制执行下去 */ private boolean anima

2020-12-08 14:27:48 125

原创 Android 一键退出app

1、使用eventbus实现一键退出APPpublic abstract class BaseActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getNeedEventBus()) { EventBus.getDefault(

2020-12-08 14:25:35 331

原创 Android 虚拟机存储结构和垃圾回收机制介绍

虚拟机的存储结构分为5个部分,分别是程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区,下面就 介绍各部分的内容。程序计数器:较小的内存空间,指定当前线程执行字节码的行数Java虚拟机栈:线程私有的,生命周期与线程同步,每个方法执行的时候,都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出入口等信息,每个方法的调用都是栈帧入栈到出栈的过程。局部变量表用于存储方法相关的局部变量,包括基本数据、对象引用和返回地址等。栈深度大于虚拟机允许的深度,会抛出StackOverFlowErro

2020-12-03 14:22:42 314

原创 Android 线程介绍(二)—— 常用线程池介绍

线程池创建参数介绍:public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue,

2020-12-03 14:09:12 91

原创 Android线程介绍(一)—— Java线程优先级和Android线程优先级对比

android开发过程中,线程优先级存在两种设置方法,一是Java的设置方法,二是android提供的设置方法。一、Java线程优先级设置方法Thread thread1 = new Thread();thread1.setPriority(10);内部调用的也是底层的方法public final void setPriority(int newPriority) { ThreadGroup g; checkAccess(); if (newPri

2020-11-30 11:40:16 369

原创 Android ANR出现原因和解决方法

ANR:Application Not Responding,应用无响应,在一定时间内,用户的操作没有给出回应,就会导致ANR。首先要明确一个概念:ANR只会出现在主线程中,也就是说Activity、Service、BroadcastReceiver、ContentProvider的生命周期方法都是在主线程中执行的,系统通过AMS和WMS对操作时间进行检测,超出时间就会报ANR,并且弹出对话框提示用户。以下代码都是基于 Android 10.0(29),其他版本的代码位置需要自己去查找了Activit

2020-11-25 17:20:19 2707 1

原创 Android 框架系列(一)—— 框架概要篇

android开发避免不了的就是框架的搭建,我们熟知的MVC、MVP、MVVM,都是我们熟知的框架结构,开发中使用哪种结构,结构如何搭建,这种结构使用过程中存在的优缺点,这些都是我们需要考虑的。下面就讲解一下这些框架的知识。1、MVC1.1 MVC结构图1.2 MVC各部分的功能View:布局展示部分,这部分是和用户直接交互的,展示各种控件效果,包括动画、布局中展示的数据等部分。Android中布局都是定义在xml文件中的,但是如果需要对数据进行展示就需要在Activity中对布局中的控件进行操作

2020-11-25 14:52:44 251 1

原创 Android WorkManager让app保活

使用WorkManager保活,即使应用被杀掉,也是可以继续执行代码的,目前运行环境是模拟器,具体国内各厂商能否执行,未经过实际测试,就不说了。我们首先定义Worker类,用来发送通知,然后点击通知可以打开Activity,当然我们也可以做其他的操作。public class UploadWorker extends Worker { public UploadWorker(@NonNull Context context, @NonNull WorkerParameters workerPar

2020-11-25 11:31:54 5089

原创 Android Retrofit实现原理解析

整个解析过程以下代码都是基于implementation 'com.squareup.retrofit2:retrofit:2.3.0'implementation 'com.squareup.retrofit2:converter-gson:2.3.0'implementation "com.squareup.retrofit2:adapter-rxjava3:2.9.0"动态代理就是通过以下代码:public <T> T create(final Class<T>

2020-11-19 17:33:24 456

原创 Android JetPack介绍

2017年,google开发者大会介绍了JetPack,表示google要开始统一开发规范,推荐开发者都使用JetPack内部的各项功能,之前的都会逐渐的depreated,下面就介绍一下JetPack内容:分为四个部分:基础 - Foundation提供最基础的底层功能,如向后兼容性、测试、开发语言kotlin支持等架构 - Architecture帮助开发者设计稳健、可测试且易维护的应用google推荐的架构是这个架构在我们创建project或者module的时候,就会推荐创建

2020-11-18 16:59:07 408 1

原创 Android packageManager.setComponentEnabledSetting()和setApplicationEnabledSetting()方法介绍

1、setComponentEnabledSetting()方法PackageManager提供了一个方法,setComponentEnabledSetting(),这个方法的作用是启用或者禁用四大组件,比如我们想禁用一个服务,就可以使用下面的方法,传入的参数就是服务的名称。/** * 禁用组件 * @param context 上下文 * @param className 组件类名 */private fun disableComponent(context: Context, classN

2020-11-13 17:30:34 4077

原创 Android 序列化原理介绍

无论是android中还是Java中,远程传递数据都是需要序列化的,android中不同组件之间传递数据也是需要序列化的。1、序列化和反序列化序列化和反序列化是一个过程,这个过程其实就是我们给数据加一层标识,告诉虚拟机序列化的时候该怎么给数据加壳,反序列化的时候该怎么将数据的壳去掉,取出其中的数据。实现序列化的方式有两种:Serializable接口和Parcelable接口2、Serializable接口Java提供的接口,主要用于文件读写和网络传输数据,也可以用于android组件之间传递数据

2020-11-12 10:49:04 268

原创 Android 进程间通信IPC(二)—— Broadcast广播

从3个方面来讲解广播1、注册方式广播的注册方式分为两种,一是动态注册,二是静态注册,注册时候都需要设置action,需要和发送广播时候设置的action对应,否则接收不到发送的广播动态注册:BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) {

2020-11-11 16:22:17 514

原创 Android 进程间通信IPC(一) —— 概要篇

android IPC(进程间通信),因为在Linux系统中,每一个应用都是一个进程,所以不同的应用之间通信就需要采用IPC,android系统是基于Linux系统开发的,所以每个app也是一个进程,不同app之间通信也是要用到IPC的,android系统大部分IPC都是基于binder的,很多都是封装好的基于不同场景的应用。在android系统中存在几种方式:Bundle(通过Intent传递)、AIDL、ContentProvider、Broadcast、文件、socketbundle:是实现Par

2020-11-11 14:37:35 154

原创 Android 性能分析(一)—— 概要篇

最近需要对app进行性能分析,一开始的时候,都是根据网上的各种文章参考,但是很多都是只是介绍概念,没有介绍使用什么工具以及什么样效果需要进行优化,因为我们对app优化肯定是要达到什么样的效果,必须给出一篇优化文档的,我们目前是什么样的效果,经过优化过后达到什么样的预期效果,这样领导才会同意你去安排开发和测试抽出时间去进行优化,并且各个模块能达到什么样的效果都是需要进行统计的,这都是需要时间去安排的,这种就很可能导致产品提的需求和优化时间冲突了,需求就要延期,开发领导去和产品领导扯皮,一堆麻烦事,因此我们必须

2020-11-06 15:50:18 796

原创 Android 性能优化(二)—— 通过工具检测内存分析情况

app性能优化包括很多方面,其中重要的部分就是内存分析,主要是分析是否存在内存泄露,下面就是通过几种工具进行分析:1、Lint:android studio自带分析工具,可以进行检测,常见的内存泄露可以检测出来2、LeakCanary:内存泄露检测工具,只要app集成了LeakCanary,当app启动时候,出现内存泄露就会在通知栏发送通知,开发者就可以点进去查看具体的内存泄露详细信息,包括具体问题在哪一行3、Memory Profile:Android studio自带的分析工具,可以查看当前a

2020-11-05 17:02:26 298

原创 android binder入门(三)——设计原理和模型介绍

1、优势android是在Linux基础上进行开发出的一套系统,Linux进程间通信包括几种方式:共享内存、管道、socket、消息队列、binder。共享内存:优点就是无需进行拷贝数据,客户端和服务端都可以直接对内存中的数据进行操作,这样操作读取速度很快,但是需要很大的内存,并且安全性无法保证,任何app都可以操作这部分数据,导致数据很乱管道、socket、消息队列:操作过程都是,服务端先将数据copy到内核缓存区,客户端需要数据操作的时候,也要将内核缓存区的数据copy到自己的内存空间内,这就进行

2020-11-04 17:51:32 128

原创 android binder入门(二)——手动实现

最近在学习binder原理,先从手动实现binder通信开始学习代码实现参考:https://www.jianshu.com/p/37368fab05bf几个概念:Person:实体类,要序列化,否则传递数据过程中会异常PersonManager:接口,需要继承IInterface,才能具备进程间通信的能力内部提供具体的客户端操作方法PersonManagerProxy:PersonManager方法实现类,实现具体的方法操作,具体的操作需要通过binder.transat实现Perso

2020-11-03 17:46:27 303

原创 android-skin-support使用和原理分析

1、使用环境:Android studio 4.1gradle:3.4.0+5.4.1使用的androidx,所以导入的库是//换肤框架implementation 'skin.support:skin-support:4.0.5' // skin-supportimplementation 'skin.support:skin-support-appcompat:4.0.5' // skin-support 基础控件支持implemen

2020-11-02 11:51:23 1212

原创 Android 热修复Bugly和Sophix介绍

最近在学习热修复技术,主流的就是阿里的AndFix基础上开发的商业级框架Sophix和腾讯在tinker基础上开发的商业级框架Bugly,当然热修复都只是两者其中的一部分功能,还有一些其他的功能一、Sophix特点:1、从底层native直接替换原有方法,在原来类的基础上进行修改。核心在于replaceMethod函数,所以只支持方法的替换,对于方法的增删、资源更新、so文件更新、类的属性替换都不支持。2、可以立即生效,消耗很低,实测上传官网之后可以立即进行修改3、补丁包很小,下面的就是之前实际

2020-10-27 10:31:11 500

原创 Android 各种图片格式

目前android支持的5种图片格式,就是svg、png、webp、jpeg、gif、bmp。使用最多的还是png格式,因为支持RGB三色和透明度设置,可以设置很好的logo效果。google开发的SVG格式,则是因为体积小,这个对于压缩包大小很有利,而且实现的效果和png差不多,所以目前使用的也是越来越多。GIF一般是作为动画展示的,但是由于图片太大,所以一般不建议使用,可以使用Lottie动画库代替。

2020-10-16 14:03:07 3834

原创 Android ArrayMap和SparseArray系列存储对象分析

Android为了提高开发效率,提供了一些了Sparse类用于取代Java原生的Map,主要是包括SparseArray、SparseBooleanArray、SparseIntArray、SparseLongArraySparseArray:特点1、有序数组2、代替HashMap,优点是避免自动装箱、数据结构不依赖与额外的结构体存储结构是数组数据结构3、查找使用二分查找4、不能用于存储大量的数据5、速度比hashmap慢,因为查找要求二分查找,添加删除要求在数组中插入和删除,要移动数组6

2020-09-29 11:59:30 280

原创 Android androidx下的fragment懒加载

androidx下的fragment中onHiddenChanged方法不会被调用,这就导致了懒加载实现方式要变更前置条件:BottomNavigationView+ViewPager+fragmentFragmentPagerAdapter pagerAdapter = new FragmentPagerAdapter(getSupportFragmentManager(),FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) 创

2020-09-28 16:01:28 975

原创 Android fragment使用时生命周期分析

最近在学习Fragment,顺便记录一下Fragment的生命周期,方便以后的使用1、add和replace的区别add:只在第一次加载的时候新建对象,后续都是复用之前的对象,只会回调onHiddenChanged方法,判断是否是当前展示的fragmentreplace:每次替换的时候都是将之前的fragment关闭,调用onStop、onDestroy方法,然后新展示的fragment开始初始化方法2、TabLayout+ViewPager+fragment使用TabLayout+ViewP

2020-09-28 14:43:14 431 1

原创 Android TabLayout和ViewPager关联原理分析

我们现在常用的底部或者顶部导航栏很多都是使用TabLayout+ViewPager+Fragment实现的,最近有空分析一下TabLayout和ViewPager两者之间关联的原理主要就是一行代码实现两者之间的关联:tabLayout.setupWithViewPager(viewPager);现在来看下实现的原理:经过两次重载走到下面的方法内部 private void setupWithViewPager(@Nullable ViewPager viewPager, boolean auto

2020-09-25 14:57:55 642

原创 Android TabLayout首次未选中状态分析

最近在学习TabLayout的时候,发现个问题,刚进入的时候,第一个tab并没有变成我们想要的选中状态。设置选中的状态如下:tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { View customView = ta

2020-09-25 11:08:39 991

原创 Android TabLayout中tab无法点击问题

最近在使用TabLayout+ViewPager+fragment时,发现个问题,TabLayout中Tab始终无法点击,最后网上查找半天才发现是布局问题,原来布局是<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app=

2020-09-25 10:29:38 1460 3

原创 android RxJava(二)--实现原理分析

最近在学习RxJava,对RxJava的原理也学习了一下,这里做一下记录。自己理解,有误欢迎指出。就以最简单的为例:Observable.create(new ObservableOnSubscribe<String>() { @Override public void subscribe(@NonNull ObservableEmitter<String> emitter) throws Throwable {

2020-09-24 16:10:40 171

原创 android RxJava(一)-----内容介绍及使用

最近在使用RxJava,简单记录下RxJava的相关使用方法1、相关概念被观察者:Observable观察者:Observer发射器:ObservableEmitter简化版观察者:Consumer背压模式下被观察者:Flowable背压模式下观察者:Subscriber2、操作符2.1 创建型操作符:创建被观察者create:使用者自己发射事件just:内部自己发射事件,单一对象fromArray:内部自己发射事件,集合对象empty:内部自己发射事件,下游默认是Object,无

2020-09-24 13:51:04 231

原创 Android view分析(三)---事件分发流程

android的事件分发机制应该是使用最常见的,但是也是比较乱的部分了,只要是和用户交互的部分都是涉及事件分发机制的。主要涉及的方法:dispatchTouchEvent():分发onTouchEvent:处理事件onInterceptTouchEvent:拦截事件View只有dispatchTouchEvent、onTouchEvent两个方法ViewGroup有dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent三个方法Activity

2020-09-22 17:14:53 144

原创 Android View分析(二) -----生命周期

之前写过一篇view生命周期分析,当初只是简单的针对自定义View的各个方法进行了分析,这篇文章就是详细分析一下各个方法下图就是view从创建到销毁的一个过程:下面详细说一个各个方法的作用:Construct:构造方法,在这里可以获取自定义的属性,或者初始化画笔onFinishInflate():在Activity布局文件所有子控件被加载完之后调用的方法onAttachedToWindow():关联Activity加载时候调用,表示可以加载到布局中了,在Activity方法onAttachedT

2020-09-22 12:00:50 307

原创 Android 框架系列(二)—— MVVM框架搭建及分析

Android项目框架分为三种:MVC、MVP、MVVM。这篇文章主要学习一下MVVM的框架搭建。MVVM是基于DataBingding这个工具实现的。实现效果:就是在ViewModel中可以修改View层的展示,无需通知View层做任何事情。1、使用DataBindingdataBinding{ //放在app项目下的build.gradle中android节点下 enabled = true }2、创建beanpublic class Person { p

2020-09-11 09:30:52 871

原创 Android NavigationView定制分割线

当我们在使用NavigationView的时候,视觉会给我们颜色和宽度,但是系统提供的不符合要求,这时候就需要自定义颜色和高度了实现方法:public static void setNavigationMenuLineStyle(NavigationView navigationView, @ColorInt final int color, final int height) { try { Field fieldByPressenter = navigati

2020-08-31 15:27:02 317

原创 Android application生命周期

环境:Android 10.0(29)最近在学习Replugin插件化开发,发现初始化都是在Application中调用的,所以顺便学习一下application的相关知识1、相关方法onCreate() :创建时候调用attachBaseContext(Context base):继承自ContextWrapper,设置最基础的上下文contextonTerminate() :应用被彻底关闭会调用,用模拟器测试时候,没发现有回调onConfigurationChanged(@NonNull C

2020-08-27 10:09:19 1374

原创 Android PMS工作原理

PMS整体原理如下:主要还是通过AIDL来调用系统信息比如:在MainActivity中调用getPackageManager().getPackageInfo("", PackageManager.GET_ACTIVITIES);具体的流程如下:上面只是简单的标记一下,并没有对照具体的代码进行分析,都是通过AIDL来获取系统的信息,如果想自己看的话可以参考上面的进行具体查看。...

2020-08-26 17:43:55 833

原创 Android AMS原理分析

AMS(ActivityManagerService)本质上就是一个AIDL,通过他调用系统的底层服务,加载Activity、Service四大组件。系统版本:Android10.0(29)各个版本具体的执行过程可能存在差异,但是总体的流程还是一样的,都是需要两次AIDL,来和系统进行交互。下面就来分析代码执行流程startActivity(new Intent(MainActivity.this,MainActivity.class));从上面这行代码开始:下面是依次执行的流程图其中有 两

2020-08-26 15:32:03 1110

MVVM简易框架搭建

主要是学习了MVVM框架,使得View层和ViewModel解耦,减少View层的代码,不需要对每个控件进行刷新,全部使用DataBingding来进行实现

2020-09-11

PluginProjectOnly.zip

Android插件化开发,360开源的Replugin第三方库,使用内部插件的方式开发,完整的环境搭建,下载即可运行,

2020-08-26

AIDL实现客户端和服务端的双向通信

主要是使用AIDL,实现客户端和服务端的双向通信,客户端调用服务端的登录,服务端将登录结果返回给客户端

2020-05-16

20000张人脸图片

可以用来进行人脸检测训练的人脸图片,图片较小,可以通过机器学习用来训练,实测还是有效的,可以放心使用

2018-02-24

Java断点续传

使用Javaweb已经Java客户端,实现文件的断点续传功能,文档中包括客户端和服务端

2018-02-11

Opencv 特征点检测

使用Opencv对图片进行特征点检测,采用多种不同的方法进行检测

2018-02-07

使用json解析所需的jar包集合

java调用json,实现生成或者解析json格式的字符串,还有gson可以使用

2018-01-17

android中DiskLruCache缓存类

android三级缓存的DiskLruCache类的代码以及其他使用到的工具类

2017-12-05

android三级缓存

实现android的三级缓存,内存-本地存储-网络,其中包括工具类。

2017-11-30

Java实现断点续传

包括一个客户端java文件,可以用来上传文件,但是要修改文件的地址;和一个服务端的完整JavaWeb项目,需要自己导入开发工具中调试

2017-11-30

Java实现多种单例模式

通过Java语言,主要实现了六种单例的生成方法,包括懒汉式、饿汉式、双重校验锁、枚举、静态内部类,可以根据实际情况选择使用

2017-11-30

Socket的各种使用测试

主要是测试Socket的各种应用,包括客户端和服务端的简单通信;多线程下载文件;HttpUrlConnection的简单测试;UDP的简单通信

2017-11-21

给数字添加*

给所有数字旁边添加*。例如:dadfd1224vbhgfh55bgg 转换成 dadfd*1224*vbhgfh*55*bgg。 思路:第一次遍历的时候,先给所有的数字左右两边都添加*;第二次遍历的时候,检查*左右两边的情况,如果有一边是*,那么就删除该*,将处理的结果放图StringBuffer中,最后输出结果。

2017-11-20

Java读取Excel文件的内容

使用Java读取Excel文件的内容,主要是使用POI框架,可以读取最新的Excel文件xlsx后缀文件,即2007版本之后的。

2017-11-20

家庭理财通

自己写的android应用家庭理财通,可以满足基本的用户需求,包括收入、支出等信息

2016-10-29

xutils工具类

使用utils更加方便开发android的一些应用,不需要考虑产生的问题

2016-10-29

空空如也

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

TA关注的人

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