自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

海纳百川Android的博客

一个Android程序员的经验分享

  • 博客(80)
  • 收藏
  • 关注

原创 源码解析ViewGroup的onDraw为什么不一定会调用

网上有不少文章都说自定义ViewGroup的时候,如果需要自定义绘图,不能重写onDraw方法,而是要重写dispatch方法,因为ViewGroup绘制的时候不一定走onDraw方法,但是dispatchDraw方法是一定会走的。至于何时会走onDraw,何时不会走onDraw,有人说当ViewGroup设置背景的时候,会走onDraw方法,而没有背景的时候,不会走onDraw方法,这个说法也是有道理。切到本文的问题,为什么ViewGroup会不一定走onDraw方法呢,而非容器类的View为什么都会

2021-07-28 14:17:44 674

原创 Android 源码解析measure机制-深入浅出

Android 源码解析measure机制-深入浅出1、ViewRootImpl.performTraversals方法ViewRootImpl是最顶层控制一个Activity的UI显示的类,在View和WindowManager之间起一个中间管理的角色。该类的performTraversals方法里面会调用performMeasure、performLayout、performDraw三个方法,继而调用根布局DecorView的mersure、layout、draw方法,DecorView又会调用

2021-05-12 12:04:27 616

原创 Only fullscreen opaque activities can request orientation

Only fullscreen opaque activities can request orientation这个问题发生的必须同时满足三个条件:(1)你的Activity是透明的或者悬浮在另一个Activity上;(2)透明Activity限定了横竖屏方向,如下android:screenOrientation="portrait"android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"(3)t

2021-04-27 19:21:06 819

转载 C4.5算法详解

首先,C4.5是决策树算法的一种。决策树算法作为一种分类算法,目标就是将具有p维特征的n个样本分到c个类别中去。相当于做一个投影,c=f(n),将样本经过一种变换赋予一种类别标签。决策树为了达到这一目的,可以把分类的过程表示成一棵树,每次通过选择一个特征pi来进行分叉。那么怎样选择分叉的特征呢?每一次分叉选择哪个特征对样本进行划分可以最快最准确的对样本分类呢?不同的决策树算法有着不同的特征选择方案。ID3用信息增益,C4.5用信息增益率,CART用gini系数。下面主要针对C4.5算法,我们用一个例

2021-03-29 15:14:48 787

原创 Android EditText禁止输入emoji表情的一种方法

在安卓app开发中,会遇到EditText禁止输入emoji表情的需求,方法很简单,只需要给EditText添加一个InputFilter就行了,如下面代码:public class EmojiInputFilter implements InputFilter { protected Pattern emoji = Pattern.compile("[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27

2021-03-25 18:25:33 3876 1

原创 Android ConstraintLayout属性简介(一、基础篇)

Android ConstraintLayout属性简介(一)本篇文章介绍ConstraintLayout下面几个最基本的属性:layout_constraintLeft_toLeftOflayout_constraintLeft_toRightOflayout_constraintRight_toLeftOflayout_constraintRight_toRightOflayout_constraintTop_toTopOflayout_constraintTop_toBottomOf

2020-12-02 20:47:55 4285

原创 Program type already present: com.***.***.classA“的解决经验

AGPBI: {"kind":"error","text":"Program type already present: com.***.***.classA","sources":[{}],"tool":"D8"}的解决经验Android Studio在整合框架,导入第三方库的时候,会遇见各种各样的编译报错问题,根据我个人的经验,主要错误的原因是因为重复导入依赖包导致的,重复的可以是资源,也可以是类。重复导入报错的一般提示就是如本文标题中所写的“Program type already present

2020-11-19 15:11:40 1312

原创 java如何动态获取泛型参数的类型

Java如何动态获取泛型参数的类型我们都知道java中的泛型其实是伪泛型,java在编译阶段会对变异类型进行擦除,擦出到泛型类的最小上限,编译后得到的class文件里面是没有任何泛型信息的,泛型的控制其实就是java编译器进行的控制,编译阶段进行泛型检查。那如果我们想在运行时知道泛型类的类型,如何做到呢?主要用到下面几个api:1、public Type getGenericSuperclass()---Class类的方法2、Type[] getActualTypeArguments()---P

2020-10-20 18:59:35 5639

原创 android View的background何时加载的

android View的background何时加载的作为安卓开发者的我们,经常为view设置背景,而且大部分时候是在xml里面通过view的android:background属性进行设置的,或设置成一张图片,或设置成纯颜色。然后呢,我们也知道view的绘制流程要经过三大步:onMeasure,这是测量view的大小的;onLayout,这是确定view的位置的;onDraw,这是具体绘制view的。那么,这里抛出一个问题:backgound应该也属于view的具体呈现,是否是在onDraw里面

2020-08-24 10:44:18 785

原创 android studio download maven-metadata.xml卡住问题

android studio download maven-metadata.xml卡住问题我的android studio版本已经升级到4.0.1了,Gradle插件版本,即com.android.tools.build:gradle后面跟着的版本,也是4.0.1,对应的gradle版本已经是6.1.1了,即使用的是gradle-6.1.1-all.zip。最近经常遇见更新代码后第一次编译dowlnad maven-metadata.xml文件卡住半天,最后还是sync fail的问题,最后的解决方法

2020-08-02 22:07:57 16852 7

原创 java.lang.SecurityException: Not allowed to change Do Not Disturb state

Not allowed to change Do Not Disturb state at android.os.Parcel.readException(Parcel.java:2013) at android.os.Parcel.readException(Parcel.java:1959) at android.media.IAudioService$Stub$Proxy.setStreamVolume(IAudioService.java:943)...

2020-05-16 22:34:44 5193

原创 判断链表中是否存在环的方法及证明

一、判断链表中是否存在环的方法及证明首先说明一点就是如果链中存在环,可能整个链是一个环,也可能是该链表的后面一部分形成了环。如何判断链表中是否存在环,经典的判断方法就是利用两个指向链表头节点的指针,同时移动,两个指针每次移动的节点数是不一样的,如果存在环,那么这两个指针随着移动次数的增加,肯定会某个节点相遇,否则移动快的指针会到率先达链表末尾,即不存在环。有没有同学会疑惑:如果存在环,这两...

2020-04-24 15:14:32 2049

原创 Andorid Parcelable序列化遇见List、数组、Map如何处理

Andorid Parcelable序列化遇见List、数组、Map如何处理安卓开发中,如果遇见需要序列化的场景,我们一般都会把我们的Bean类实现Parcelable接口,如下:import android.os.Parcel;import android.os.Parcelable;public class Test implements Parcelable { pr...

2019-12-15 23:27:08 6687 2

原创 SparseArray源码解读

SparseArray源码解读google推荐使用SparseArray来代替HashMap,可见SparseArray应该有其优点,至于是什么优点,我们先来看看源码,就比较清楚了。一、构造方法SparseArray有两个构造方法,一个无参构造方法和一个有参构造方法,无参构造方法本质上还是调用了有参构造方法。public SparseArray() { this(...

2019-11-24 17:34:54 607

转载 Android使用https

HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS,为了数据传输的安全,HTTPS在H...

2019-09-27 13:37:53 1258

原创 解决default activity not found办法大全

最近在项目中遇到一个问题,就是以前用android studio能正常打开的工程,今天突然报default activity not found错误,该错误导致app那块显示一个红叉,无法直接launch app,可以build工程产生apk文件,但是不能用studio直接launch app,这样对开发来讲还是很不方便的。正常情况下如下图遇见该错误的时候如下图进到Edit Con...

2019-08-26 14:08:37 69596 11

原创 Java 数学三角函数正弦、余弦、正切以及反正弦、反余弦、反正切函数的使用

Java 数学三角函数正弦、余弦、正切以及反正弦、反余弦、反正切函数的使用Java中数据三角函数在Math类里面有封装好的对应方法,正弦函数是sin方法,余弦函数是cos方法,正切函数是tan方法,反正弦函数是asin方法,反余弦函数是acos方法,反正切函数是atan方法。(注意,Math类里面并没有提供余切及反余切函数,但是可以利用现有的函数计算出来)下面是这些方法的代码举例及运行结果...

2019-07-16 17:47:18 7007

转载 Java深拷贝和浅拷贝

Java浅拷贝和深拷贝一看就懂的,java深拷贝浅拷贝将一个对象的引用复制给另外一个对象,一共有三种方式。第一种方式是直接赋值,第二种方式是浅拷贝,第三种是深拷贝。所以大家知道了哈,这三种概念实际上都是为了拷贝对象啊。1、直接赋值好,下面我们先看第一种方式,直接赋值。在Java中,A a1 = a2,我们需要理解的是这实际上复制的是引用,也就是说a1和a2指向的是...

2019-07-10 19:57:58 445

原创 adb shell查看进程方法

adb shell查看进程方法android开发过程中,有时候我们需要知道某个应用的进程号,下面介绍两种方法,都是要用到adb shell命令。第一种:adb shell ps该命令比较简单粗暴,会列出手机中的所有进程的信息,如下图所示:我们只要在NAME那一列找到我们的app的包名了就可以了,PID就是进程号,不过面对这么多进程,很多人脑子估计一下子就懵了,特别当看了一天代码...

2019-04-17 17:10:18 68857 5

原创 android NSD service使用介绍

android NSD service使用介绍最近项目中要实现局域网设备发现,接触到了MDNS协议,什么是MDNS协议呢,下面摘抄自百度百科。mDNS即组播DNS(multicast DNS)。使用5353端口,在内网没有DNS服务器时,就会出现此组播信息。在一个没有常规DNS服务器的小型网络内,可以使用mDNS来实现类似DNS的编程接口、包格式和操作语义。组播DNS是IETF零配...

2019-04-14 13:43:22 2017 2

原创 HashMap.entrySet( )分析

我们在写代码的时候经常会用到HashMap这个方法的entrySet()方法,这个方法返回返回的是一个Set对象,很多人以为返回的是一个包含了Map里面所有键值对的一个集合对象,这个理解不准确,怎么说呢,通过这个Set对象,我们确实可以获取到Map里面存放的所有键值对,但是这个集合对象本身是不存放数据的,它只是助于我们遍历Map中的数据,类似于Iterator。下面我们来看看源码简要分析一下。...

2019-03-10 16:01:40 5580 13

转载 AndroidStudio添加依赖的方式介绍

AndroidStudio添加依赖的方式介绍本文转载自https://www.jianshu.com/p/52b192f3ce1c android-apt APT(Annotation Processing Tool),注释处理工具,对源代码文件进行检测,根据注解自动生成代码。并编译生成的源文件和原来的源文件,将它们一起生成class文件 annotationProcess...

2018-12-12 09:51:39 762

原创 android为广播加上FLAG_EXCLUDE_STOPPED_PACKAGES

自android3.1之后,android就为广播增加了两个标志FLAG_EXCLUDE_STOPPED_PACKAGES和FLAG_INCLUDE_STOPPED_PACKAGES。android系统默认为我们的广播加上了FLAG_EXCLUDE_STOPPED_PACKAGES标志,我们从源码上来看一下是否如此。首先我们从Activity的sendBroadcast方法跟起,该方法源码为:...

2018-09-08 19:42:29 2088

原创 android系统广播有哪些

android系统广播有哪些呢,本文做一个整理。Intent类里面有系统广播的名称的定义,系统广播都会有下面这样的注释* This is a protected intent that can only be sent by the system.有这样注释的广播的定义一共有52个,如下面所示:public static final String ACTION_INSTALL_E...

2018-09-08 13:19:00 4140

原创 斐波那契数列两种算法的时间复杂度

斐波那契数列简介:斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n&gt...

2018-09-07 09:49:13 10981 2

原创 子线程能弹Toast吗

子线程能弹Toast吗?相信很多安卓开发者都坚信一个信念,那就是子线程不能更新UI,不能进行UI操作,写此文之前,我自己也是这么坚信的,直到我注意到一个异常,才引发我对子线程不能更新UI有了新的认识。这个异常是在我在子线程里面不小心弹了一个Toast引发的,该异常相信很多朋友都见过,就是java.lang.RuntimeException: Can't create handler ins...

2018-08-20 13:43:47 8663 8

原创 安卓Toast显示流程分析

我们在开发apk的过程中,经常会用到Toast,它的确很方便,不用开发者编写UI布局,只需要传入字符串就能给用户提示,那么它的显示与消失的流程是怎样的呢,本来就来讲一讲这个流程(所用源码为android 8.0版本)。1、首先我们来看一下Toast的弹出的写法:Toast.makeText(ServiceTestActivity.this,"test",Toast.LENGTH_LONG...

2018-08-19 17:52:29 3698 1

原创 SystemServer类解析

SystemServer类解析安卓系统有一个system_server进程,该进程由zygote进程创建,负责运行所有的系统服务,该进程的入口类是frameworks/base/services/java/com/android/server/SystemServer.java。下面来解析一下该类的主要功能。该类有一个main方法,说起main方法学过java的都熟悉,main方法是一段j...

2018-08-13 14:11:47 986

原创 getSystemService追根溯源

getSystemService追根溯源在安卓开发过程中,我们经常会用到getSystemService方法来获取各种系统服务,比如下面几种常见的获取服务代码:NetworkInfo networkInfo = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActi...

2018-08-12 03:26:06 5854 4

原创 Service的onStartCommand几种返回值的用法

Android开发者都知道Service的onStartCommand方法,其返回值会决定Service的不同特性,比如Service被杀死后能否可以自动重启。本文详细说一下各返回值的作用。安卓源码里面给出了四种返回值,分别是START_STICKY、START_NOT_STICKY、STRAT_REDELIVER_INTENT、START_STICKY_COMPATIBILITY。/** ...

2018-08-06 15:24:23 2191 3

原创 android如何正确获取iccid,特别是中间带有字母的iccid

android如何正确获取iccid,特别是中间带有字母的iccid在android设备上面获取sim卡的iccid,相信很多开发者都能很容易做到,网上也有大量的获取方法,99%的写法都和下面一样TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);...

2018-07-11 18:25:02 22103 9

原创 Android 共享元素动画

Andriod 5.0之后,包括5.0,开始支持共享元素动画,该动画主要用于两个activity之间,两个Activity共享某些控件,Activity A跳转到Activity B的时候,A的某个控件能自动移动到B的相应控件的位置,产生动画。该动画看起来很高大上,而且实现方法非常简单,是我目前见过的实现起来最简单的动画了。该动画实现起来有两步,每步都很简单:1、在要共享的控件中加上属性andro...

2018-07-08 19:33:52 8332

原创 Handler消息机制的源码深度分析

说起Handler机制,难免会提到四大类Handler、MessageQueue、Message、Looper.我们不从代码说起,而是从我们的习惯用法说起,在我们使用Handler的时候,普遍用法如下:Handler myHandler = new Handler(){ @Override public void handleMessage(Message msg) { ...

2018-07-06 11:26:34 724

原创 安卓TextView、Button点击效果背景变化实现

android控件点击效果实现android UI开发中最经常用到的就是各种控件的点击事件,比如TextView和Button,点击时背景色有个变化提醒用户触发了点击事件,当用户手指抬起时,背景色又恢复正常,这种效果配置方法很简单,两步即可。第一步 编写一个XML文件该文件位于drawable文件夹下面,根据使用的背景的资源不同,写法也不同,比如有的背景直接使用的是颜色,有的是用的是图片,下面列举...

2018-06-20 16:28:59 9440 1

原创 蓝牙通信工作流程讲解

最近项目上需要蓝牙通讯功能,所以自己私下里学习了一下蓝牙通讯相关的知识。一直以为蓝牙通讯是调用系统层的API实现的,比如我们平时用的利用蓝牙传照片和文件,我们只需要选择一下接受设备就可以了,但是自己实现蓝牙远程通信之后,才明白其中的一些细节问题,有些流程还是需要我们自己去做的。1、首先是蓝牙通信机制蓝牙通信也是采用Socket机制,通信双方有一方为服务器端,另一方为客户端,可能有人会觉...

2018-06-19 14:35:45 16087 1

原创 Activity获取控件宽高的最佳时机和方法

Activity获取控件宽高的最佳时机和方法 我们在做android UI方面开发的时候,获取某一个控件宽高是不可避免的事情,获取view的宽高android提供有现成的方法View.getWidth()和View.getHeight(),但是如果获取时机不对,我们获取到的宽高值会为0.那么什么时候调用才能获取到正确的值呢? 我们都知道只有在View的onlayout方法执行完之后,其宽高值才能确...

2018-06-06 15:51:28 3539

原创 java静态分配的理解

最近觉得自己的java基础知识有些忘了,所以闲暇时间巩固一下,看到了Java的静态多分配的概念,竟有些陌生了(个人觉得Java往往有很多高大上的概念,其实都是我们在实际应用中用到过的,但是说到这些概念我们就会无知感爆棚,有木有同感,面试的时候很多都是问概念的,虽然平时会用但是不懂这些概念的话会很吃亏),可能也有些人不知道静态多分配的概念,Java 是一种静态多分配、动态单分配的语言(C++也是),...

2018-05-30 14:21:10 1581

原创 如何设置compileSdkVersion, minSdkVersion, and targetSdkVersion

最近看到了一片国外的资料,google开发工程师贡献的一片如何设置compileSdkVersion, minSdkVersion, and targetSdkVersion,讲的很官方很正解,收藏一下。Dependingon the time of the year, it might only be a few months after you release an appthat a new...

2018-05-26 14:55:59 3528

原创 Android 3.1增加FLAG_EXCLUDE_STOPPED_PACKAGES和FLAG_INCLUDE_STOPPED_PACKAGES机制

Android3.1增加FLAG_EXCLUDE_STOPPED_PACKAGES和FLAG_INCLUDE_STOPPED_PACKAGES机制自Android3.1之后,google在Android里面为广播增加了两个flag:FLAG_EXCLUDE_STOPPED_PACKAGES和FLAG_INCLUDE_STOPPED_PACKAGES。/** * If set, this...

2018-05-24 15:13:27 3169 5

原创 Android手势与触摸事件的分发和消费机制

Android手势与触摸事件的分发和消费机制在Android 客户端开发过程中,经常会遇到手势事件的处理,本篇博文讲一下本人对touch事件处理机制的一些理解,希望对一些同志们有所帮助。我们知道Android的视图是树形结构,如下图所示为例:由于PhoneWindow和DecorView我们平时是不会有改动的,也用不到,所以我们只关注能用到的三个类:Activity、View...

2018-05-12 20:10:30 2220 1

空空如也

空空如也

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

TA关注的人

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