自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(29)
  • 收藏
  • 关注

原创 Android 11 Unable to start service Intent 问题(包可见性,resolveIntent返回null)

今天在Android11上发现了一个的问题,如果目标Service的进程没有启动,那么无论是bindService还是startService都没有办法拉起指定的Service。网上查了很多资料如下:1.目标Service 设置 android:exported="true"2.目标Service需要声明自定义权限。客户端需要声明权限。3.目标Service需要添加<intent-filter></intent-filter>上面的方法都试过了**然并卵**,还是报Unab

2021-10-25 12:32:30 13584 5

原创 面试官问你Java线程池--怎么样回答才能让面试官知道你真的懂了!

一.引言不管是Java面试还是Android面试,线程池都是面试官高频考察的点,那我们怎么回答,才能让面试官了解到我们是真的懂Java线程池了呢?这篇文章不涉及到线程池的使用和原理,如果你还不知道怎么使用线程池,可以先去了解一下。下面我会从几个方面入手循序渐进的告诉你怎么回答这一类问题,并切构建自己的知识体系。二.线程池是什么,为什么要有线程池?我们知道线程的创建和销毁都是十分消耗系统资源的,第一涉及到了用户态和核心态的切换,第二就是线程资源的回收。为了提高线程的复用和避免系统资源的浪费,所以就有了线

2021-10-24 14:43:57 1741

原创 手把手带你剖析ReentrantLock的底层实现AQS

一.引言在面试过程中发现很多人对synchronized关键字还能说出点东西,但是当问到ReentrantLock的时候,大部分的应试者的回答都是不知道。今天呢我们就手把手来剖析一下ReentrantLock的底层实现。让我们一起来阅读源码吧。二.ReentrantLock的使用ReentrantLock的使用我们就不多说了。 //默认非公平锁 ReentrantLock lock = new ReentrantLock(); //实现公平锁

2021-10-24 12:45:26 1145

原创 分析Android Framework源码--彻底了解Android AudioFocus机制,肯定有你不知道的知识点(基于Android10.0)

一.引言今天我们来说说Android Audio系统中一套十分重要的机制-AudioFocus机制。AudioFoucs机制的设计主要是为了解决每个音源之间播放冲突的问题。下面呢让我们从源码的角度深度剖析一下AndroidFocus机制。二.AudioService在说AudioFocus机制之前有必要先了解一下AudioManager和AudioService这两个类。了解Android服务的朋友都知道,Android自带的系统服分为native服务和Java层服务,Java层服务我们了解最深的应该

2021-07-11 01:11:57 4902 2

原创 聊聊TCP/IP和Http/Https协议中的一些高频面试知识点(一)

一.引言TCP/IP和Http协议已经是老生常谈的话题了,也是每个程序猿必备的网络通信基础,今天我们聊一聊面试过程中经常会出现的有关TCP/IP和Http协议的一些知识。本篇文章呢只是带大家了解一些关键的知识点,不会大篇幅的介绍这些协议的背景和一些冗余的信息等,大家如果有需要可以翻阅详细资料哈。希望本篇文章呢能对大家提供一些帮助。二.TCP/IP协议1.什么是TCP/IP?关于TCP/IP协议,一般有两种说法,第一种就是TCP/IP 是指 TCP 和 IP 这两种协议(TCP协议和IP协议);还有一

2020-10-24 17:30:19 4912

原创 Activity页面的绘制流程

一.引言很多朋友都认为Activity的页面绘制是在Activity的onResume方法执行完成就被成功绘制成功了,认为这个时候我们就可以看到我们写的页面了。那真的是这样嘛?其实并不然,Activity的页面它制是在Activity的onResume方法执行完成后才会被绘制,且绘制完成的时长与我们主线当时的状态和布局的层级以及CPU内存都是有一定的关系,这些也是我们分析Activity启动黑屏...

2020-04-11 13:28:18 5332

原创 源码角度聊聊BlockCanary的原理

今天我们来说说BlockCanary的核心原理,BlockCanary是一个能检测主线程是否卡顿的框架。那么它为什么可以检测主线程卡顿呢?我们都知道Android是一个消息驱动型的系统。每当我们创建一个进程的时候,在ActivityThread内部都会为我们去创建一个主线程的Handler,然后开启消息的队列的轮询。**1.ActivityThead.main()** public...

2020-03-29 16:12:30 4537

原创 Android性能优化-内存篇(其实内存优化也就这回事)

一.引言今天来聊一聊Android中内存优化的一些手段。首先问问自己为什么要内存优化呢?(1):App消耗内存过大,导致手机内存低于内存警戒线的时候,Low Memory Killer机制就会触发,App占用内存越多,被处理掉的机会就越大。(2):受虚拟机堆内存限制,出现OOM,内存溢出,程序出现crash。(3):频繁的GC会导致内存抖动,并发GC伴随着stop-the-world。G...

2020-01-05 14:48:19 3291

原创 Activity跳转你所不知道的生命周期

大部分的Android的开发者都会下意识的认为当一个ActivityA跳转到另一个ActivityB的时候,生命周期会是这样的onPause(ActivityA) - onCreate(ActivityB) - onResume(ActivityB) -onStop(ActivityA)。其实以上说的生命周期只有在同一个进程内部跳转,才会去遵循。今天我们就来说一说一种特殊情况。如果Activit...

2019-12-30 20:08:02 3202 1

原创 LeakCanary原理解析,理解起来超简单!

一.引言LeakCanary我相信大家都不会陌生的,在我们的开发过程中,为了避免内存泄漏的问题,我们可以在我们的项目中集成LeakCanary,来观察我们的应用程序是存在内存泄漏的问题。今天我们就来看看LeakCanary的原理,了解它是怎么去判断我们的应用程序是发生了内存泄漏的。二.源码解析在LeakCanary的源码中使用到了一个非常关键的数据结构,这个数据结构是LeakCanary判断...

2019-08-17 00:17:02 14835 5

原创 带着问题分析Framework层源码(一):按键音声音太小,我们该如何增大?

作为一名Android开发人员,对源码的阅读是必不可少的。但是Android源码那么庞大,从何开始阅读,如何开始阅读,很多人都会感觉无从下手,今天我来带着问题,去带大家分析一下Android源码,并解决问题。源码并不可怕,耐着性子看就好了。今天我们来看一下如何增大按键音量呢,下面贴一下调用播放按键音方法的代码: AudioManager audioManager = (Audio...

2019-08-14 12:05:28 2453 4

原创 RxJava2.x源码解析(一)

一.引言说到RxJava,我相信现在每个Android开发者对他都有一定的了解。怎么使用,不是我们今天要讨论的,本着知其然必知其所以然的态度,我们来挖一挖RxJava背后的实现。今天我们就从一个最简单的例子入手,不涉及线程调度,线程调度的实现我们留着下次去了解。下面我们来举一个RxJava最简单的实现代码: Observable.create(new ObservableOnSubscr...

2019-04-11 12:32:59 467

原创 通过设置不同的inPreferredConfig值真的能减少Bitmap加载时占用的内存么?

我相信大部分Android开发都知道在解析Bitmap到内存的时候都知道,需要设置inPreferredConfig来减少Bitmap占用的内存,那么配置inPreferredConfig这个属性真的能减少Bitmap占用的内存么?其实并不然,这个就是我们今天要讨论的东西。大家都知道,Android中Bitmap占用的内存大小与两个因素相关:1.Bitmap的宽高(和图片的像素,图片放置的位置...

2019-04-04 10:31:53 1515

原创 在Android中为啥建议你用Message.obtain()方法获取Message对象,而不是使用new关键字?

大家都知道Android应用程序是通过消息来驱动的。每开启一个应用进程,我们都会在当前应用进程的主线程成创建一个消息队列,和Handler来处理应用程序中的消息。不管是刷新界面,或者是启动组件等等,都和消息相关。所以Message对象在我们的应用程序中使用时很频繁的。一般情况下,我们会通过Handler去发送一个消息,而这个消息(即Message对象)我们可以通过关键字new进行创建,也可以通过...

2019-03-27 17:14:43 1803

原创 从Android开发者的角度看一看IOS和Flutter中的列表实现

引言:大家都知道,目前IOS和Android是当前移动操作系统的主流,而Flutter作为Google推出的跨平台的UI框架,并且在未来作为Google新系统Fuchsia的开发框架,它采用dart语言编写,前景在目前是被很看好的。如果我们在Android领域已经有了一定深入的了解,去了解IOS平台和Flutter的开发是大有裨益的,可以增强我们对移动端的理解。List作为我们在开发中最常用的控件...

2019-03-21 23:25:55 571

原创 吐槽一下静态代理和装饰者模式的区别

今天我们来聊聊静态代理模式和装饰者模式的区别。一开始见到这两个模式的时候,第一感觉就是两个模式的实现方式不是大同小异么,然后带着疑惑在网上搜了搜资料,看到很多资料说他们区别于:代理模式主要目的在控制对象的访问。装饰者模式主要目的在于增加对象的行为。其实这句话是没错的。但是例举的例子就让人很摸不清头脑了,大概意思就是代理对象在编译期就已经确定了,而装饰者模式的装饰对象是在程序运行过程中才确定的。下...

2019-03-17 14:50:10 2054 1

原创 简单的包装一个线程池,存储所有任务的运行结果。

线程池,想必无论是做Android开发的还是做Java的对它都不陌生。它可以为我们提高线程的复用,默认情况下核心线程不会被销毁,避免了我们创建和销毁线程带来的开销。那我们如何去判断线程池中的任务执行完毕了呢?...

2019-03-12 19:01:09 394

原创 介绍几种等待多线程任务执行完毕的方法

一.引言:在我们日常的开发过程中,我们经常会开启多个线程或者创建一个线程池去执行多个并发任务,当所有任务执行完毕后,我们一般会做一个统一的处理。那我们如何直到多个线程的任务已经全部执行完毕了呢?今天由我来为大家介绍几种方法:二.join()方法 Thread thread1 = new Thread(new Runnable() { @Overrid...

2019-03-10 17:40:38 3914

原创 Android中Java多线程和单线程的执行效率对比

引言:众所周知的,线程是操作系统能够调度的最小单位。为什么需要多线程呢?因为我们的CPU的运算速度是非常的快的,在一个应用程序的运行过程中的大部分时间,都花在了,I/O操作,网络请求,和数据库操作上。如果没有多线程,我们的CPU大部分时间都是处于等待的状态,对CPU的资源造成了极大的浪费。多线程就是多个线程去共享CPU的时间片。一个CPU在一个固定的时间点,一个CPU只会处理一条线程中的指令。提...

2019-03-09 12:53:03 1396

原创 跨进程通讯Binder的onTransact方法一定在binder线程池的binder线程中执行吗?

一.引言在大多数人的印象中,在Android中用Binder机制进行跨进程通讯,Binder会在onTransact方法中处理Binder驱动发送过来的消息,这个方法会运行在Binder驱动的Binder线程池中。其实这么说是不对的,片面的,在大多数情况下,onTransact()方法的确是在Binder线程中处理Binder驱动发送过来的消息。除了一种情况,在两个进程中都存在Binder实体...

2019-02-28 22:06:13 2848 3

原创 源码角度详解Java中的优先队列PriorityQueue(堆的实现)

队列是一种先进先出的数据结构。而在优先队列中,元素被赋予优先级。当访问元素时,拥有最高优先级(或者最低)的元素首先被删除。今天我们来了解一下,Java中为我们实现了优先队列的类PriorityQueue。在了解PriorityQueue之前,我们要了解一下我们一种数据结构-堆。堆呢,通常是一个可以被看做一棵完全二叉树的数组对象。除了是一颗完全二叉树,堆还总满足一个条件:堆中某个节点的值总是不大于...

2019-02-03 00:39:32 2645 1

原创 详解二叉搜索树(BST)的Java实现和五种遍历方式

树是一种典型的数据结构。今天我们来了解一下,一种特殊的树,二叉搜索树(BST),二叉搜索树在我们的实际开发过程中应用还是很广泛的,在我们的HashMap中,红黑树(一种特殊的二叉搜索树),是我们解决Hash冲突的一种方式。今天我们来好好了解一下我们的二叉搜索树。1.二叉搜索树的特征:对于树中的每一个节点,它的左子树中的节点值都小于该节点的值,而它的右子树中的节点值都大于该节点值。如下图所示...

2019-02-01 00:11:34 1650

原创 浅析Java字符串String和intern()方法,StringBuilder和StringBuffer区别。

String虽然不属于Java的八大基本类型,但是在我们的日常开发中,使用它的次数是很频繁的。但是我想问下大家你们真的了解String么?下面我从几个方面带大家重新了解下我们的String:1.不可变性我相信每个java开发者,都知道在我们java中的String它是不可变的。但是它的不可变性具体体现在哪呢?1.不可继承。2.对象不可变在我们的IDE中查看我们的String类,我们的...

2019-01-29 21:49:37 683

原创 常用算法总结(Java实现)

不管我们做什么开发,了解一些常用的算法和数据结构能够增强我们对程序设计的理解,对我们的开发大有裨益的。今天我来总结一下我们在日常开发过程中比较常用的算法。1.二分查找法:假设存在一个数组存储了由小到大的100个数,我们想要找到我们的存在的那个数。怎么办呢?有些人想到的第一种方法应该循环遍历,如果相等就找到,跳出循环。如果是1万,甚至1亿个数呢,而我们恰巧找到的那个数,正好在最后一个,我们岂不是...

2019-01-28 20:39:04 942

原创 你知道Java类什么情况下会被初始化吗?

引言:在我们Java中类的加载和连接过程都是在程序运行期间完成的。一般我们的类从它被加载到虚拟机内存,和到被卸载出内存为止:它的生命周期可以细分为:加载 - 验证 - 准备 - 解析 - 初始化 - 使用 - 卸载。我们统一把验证,准备,和解析阶段统称为连接阶段。一般我们说的类加载完成包括三个阶段,加载 - 连接 - 初始化。下面我们就来了解了解这三个阶段做了哪些事。1.加载阶段加载阶段...

2019-01-27 20:50:50 1839

原创 NDK开发新增cpp文件,cpp目录下看不到 报This file is not part of the project. Pelase include it in the appropriate

找到项目目录最下方。修改CMakeList.txt文件配置添加file(GLOB native_srcs "src/main/cpp/*.cpp") 和 ${native_srcs}如下图所示:重新build,问题就能解决了。

2019-01-27 00:20:25 8301 3

原创 HashMap,ArrayMap,SparseArray 源码角度分析,Android中的数据结构你该如何去选择?

引言:Map集合,以key-value形式存储的数据结构,是我们在Android开发过程中经常需要用到的。除了java.util包下,为我们提供的HashMap是我们开发中经常使用的,Android也为我们提供了,两种以key-value形式存储的数据结构,一个是ArrayMap,一个是SparseArray。那么这三种Map集合我在日常的开发过程中该去如何抉择呢。下面让我来从源代码的...

2019-01-26 22:04:19 1428 1

原创 Java关键字synchronized的使用

今天我们来聊一聊java关键字synchronized。相信大家对这个关键字,一定不是很陌生,synchronized是我们在开发过程中保证多线程安全的一种重要手段。那什么是线程安全呢?简单的说就是当多个线程同时访问这个对象都能得到正确的结果。在解释synchronized之前,我们先来看看下面这段代码。 List&amp;amp;amp;amp;amp;amp;amp;lt;Thread&amp;amp;amp;amp;amp;amp;amp;gt; thread

2019-01-26 01:00:08 1014

原创 单例模式详解

单例模式在我们日常开发中,是我们最常见到的设计模式了。实现单例模式的方法有很多,有些人虽然会写,但是对为什么这么写,还是一点不明白。下面我来给大家讲讲单例模式为什么这么写,有什么好处。实现单例模式呢,一般有以下几个关键点:(1)私有的构造函数(无法通过new创建实例)(2)通过静态方法或者枚举提供对象的实例(3)确保单例对象只有一个(考虑多线程情况下)。有时候在实现单例模式...

2019-01-24 20:46:48 888

空空如也

空空如也

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

TA关注的人

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