- 博客(87)
- 资源 (5)
- 收藏
- 关注
原创 Android中使用AndroidX出现 but the ‘android.useAndroidX‘ property is not enabled的问题解决办法
当更新了Android Studio之后编译出现了这样的问题:This project uses AndroidX dependencies, but the 'android.useAndroidX' property is not enabled. Set this property to true in the gradle.properties file and retry.Th...
2020-04-13 14:44:07
42676
7
原创 Android中如何实现自动化测试
在开发项目的过程中,我们将某个阶段的需求完成并且提测,通常,在测试工程师更细致的测试之下,会测试出一些我们没有考虑周全而出现的代码逻辑问题或自测没有测出来的交互问题,有些问题可以直接通过打印定位,但是对于一些偶现,且在当前打印中并不能快速定位的问题,那我们接下来的调试步骤一般是在相关代码里添加一些自己的新的打印,然后根据测试工程师描述的步骤进行操作,然后再观察打印,重复这两个步骤之后一步步debug出有问题的代码段,由于这个问题是偶现的,若概率非常小,则需要我们不断的手动点击屏幕,做大量的重复的动作去复现测
2025-09-09 17:47:22
620
原创 Android系统如何优雅的实现应用双开功能
本文介绍了基于Android多用户机制实现应用双开功能的技术方案。首先分析了应用双开与多用户的区别,指出应用双开更注重便捷性。随后对比了三种实现方式(修改包名、虚拟引擎、多用户机制),最终选择系统兼容性更好的多用户方案。文章详细阐述了实现步骤:1)通过反射调用系统API创建配置用户;2)在新用户空间安装应用;3)改造Launcher3界面,支持控制分身应用显示。关键点包括过滤用户应用列表、修改最近任务显示逻辑等。最后展示了实现效果,同一应用的两个实例可并行运行并独立显示。该方案适用于需要高安全性和系统兼容性
2025-08-25 11:45:51
3798
原创 如何使用一台电脑adb调试多个Android设备
本文介绍了Android调试时连接多个设备的解决方案。当adb检测到多台连接设备时,可通过两种方式处理:一是使用adb disconnect命令临时断开指定设备连接;二是使用adb -s [设备名]命令直接指定目标设备执行调试命令。两种方法分别适用于需要临时断开连接和保持所有设备连接的调试场景,为多设备调试提供了灵活选择。
2025-07-31 16:38:34
959
原创 TaskDisplayArea、ActivityStack、Task以及ActivityRecord之间的关系
根据以上显示的信息,注释(1)中的Display #0 为ActivityDisplay,id为0,注释(2)中的Stack #33 为 ActivityStack,id为33,注释(4)中的Stack #1为ActivityStack,id为1,注释(3)和注释(5)TaskRecord的 id分别为33和30.我们可以看到这里有很多个ActivityStack 的全局变量,mRootHomeTask使用来存储launcher的ActivityStack,其type为home。
2024-07-04 14:13:59
1367
原创 Activity、Window、DecorView的关系
在注释(3)可以看到Activity持有PhoneWindow并初始化了PhoneWindow实例,在注释(4)中调用PhoneWindow的setCallback方法将activity实例设置给PhoneWindow,这一点很重要,我们在看DecorView的代码时候,看到的mWindow.getCallback()方法,实际就是获取DecorView相对应的Activity实例。至此,我们知道了在注释(14)中,我们熟悉的activity中的onResume()方法是被。
2024-07-03 12:40:15
1724
3
原创 Android 系统框架结构
大部分开发的同学是不太清楚Android的系统的基本架构的,特别是应用层开发的同学,故经过该文章的介绍,希望同学们对Android的架构有基本的认识。类似于网络的五层结构,Android系统结构也有着其五层结构,从底层到上层是一个把硬件抽象化,然后再接口化以及应用调用接口的过程。
2023-01-11 09:21:14
3956
1
原创 fragment如何获取activity的点击事件
fragment中有一个弹框,需要在整个activity被触摸时将该弹框进行隐藏,但是在fragment中的view只能获取到fragment被触摸的事件,而不能直接获取activity的触摸事件,如果想要获取activity的触摸事件,我们可以怎么做呢?...
2022-08-05 15:38:03
1639
原创 This version of the Android Support plugin for IntelliJ IDEA (or Android Studio) cannot open 问题解决方法
以上意思是当前的IntelliJ IDEA 或者Android studio所支持的Android插件不能打开该项目,请更新到2021.1.1版本或者更新的版本,故我们将相关的Android插件检查更新一下即可。
2022-08-03 09:18:49
12706
1
原创 gerrit中如何切换远程服务器
当你使用的远程服务器要更换的时候,即代码转移到新的gerrit服务器上了,是否一定需要重新配密钥,且需要重新拉代码呢。其实大可不必,重新拉一份代码太大费周章了,使用命令切换远程服务器即可。以下是一个从192.168.8.67切换到192.168.1.80远程服务器的例子。...
2022-07-30 14:34:16
899
原创 编译Android项目的时候提示非法字符:“\ufeff”的解决方法
当编译一个新导入进Android studio的项目编译后提示非法字符:“\ufeff”的错误提示时,只需要将将字符改为GBK,然后再转化为UTF-8即可解决。
2022-06-07 09:58:08
1625
3
原创 使用sqlite3语句后出现省略号 ... 的解决方法
当在linux系统中打开数据库,然后使用sql语句,然后如下图遇到出现省略号...>问题如何解决?
2022-06-06 16:08:39
1157
原创 git 中stash的实用方法
git stash : 存储所有改动;git stash pop : 释放第一次改动相关文件;git stash push /.../... : 存取指定的文件;git stash -m "存储的信息" : 给当前压栈存储的修改添加说明信息(如果没有指定信息,则说明信息为最新的commit信息)git stash list : 查看所有的压栈修改;git stash show stash@{0} : 查看某一个压栈修改了哪几个文件;git stash show -p stash@{0
2022-05-12 15:12:48
59735
5
原创 打开Source Insight 出现闪退的问题解决
打开 Source Insight 出现闪退情况,具体情况如下:出现以上画面之后立即闪退。解决方法:右键点击 Source Insight 图标--->属性---->兼容性--->以兼容模式运行这个程序:如下图:点击应用和确定,即可解决问题。...
2022-03-03 09:58:27
1796
原创 使用AlarmManager不准时的解决方法
最近我们公司的产品被客户投诉定时关机偶现不准时和偶现不起作用的问题。具体复现操作是定时一段比较长的时间进行自动关机就很容易出现该概率问题。 由于这个定时关机功能是前同事实现的,所以我得查看代码,查看跟踪代码发现该定时方式使用的是使用了AlarmManager里的set()方法:AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);alarm...
2022-02-24 11:40:55
11033
3
原创 如何获取未安装apk应用的包名、应用名以及版本信息等
在Android开发过程中,在做是否可安装第三方应用的功能的时候可能需要先判断应用的信息,比如包名,当通过apk的包名判断到该apk不能够被安装的时候,我们将不允许安装。那么对于未安装的应用,我们如何获取其应用相关信息呢,其实知道了该第三方apk的路径我们就可以获取其应用信息了。 public String getPackageName(Context context, String apkPath) { PackageManager pm = context.getPackag
2022-02-17 09:56:17
3042
2
原创 如何使用signapk.jar给APK签名
当应用的UID为system时,是不能直接在Android机器上安装的,会提示"安装失败"或者提示"应用未安装";如图:问题原因:因为系统签名不一致,需要拿到系统签名,然后给应用重新签名.问题解决:(1) 准备好签名工具signapk.jar (工具链接:)(2)拿到机器系统应用需要的签名文件.pem和.pk8.(如platform.pk8和platform.x509.pem)(3)把将要签名的应用(如 text.apk),signapk.jar,.pem和.
2022-02-15 15:57:41
4636
原创 如何修改commit中的提交人信息
如图,在Gerrit中push代码的时候,提示失败,原因是在提交的这些commit修改中,包含了作者不是自己的commit,以至于其他是自己的修改commit也不能提交。 因为我们的commit信息有可能是通过导入补丁而来的,如果生成该对策的补丁的修改对策是其他人的修改,那么commit信息中的作者就是他的,如果你直接push将会报错,那么这个时候就需要找到那条作者不是自己的commit信息。步骤:1.查询之前的commit提交记录:git rebase ...
2021-08-19 11:46:30
6737
1
原创 Android中设置color透明度百分比的参考表
在Android设置color时,可通过以下方式设置(RGB值及透明度):#1A56c8a9 解释:以上为16进制,前面两位1A为透明度,56为R值,c8为G值,a9为B值,1A换算为十进制则为1*16+10=26(A为10,B为11,C为12,D为13,E为14,F为15),最大值为FF,换为十进制则为15*16+15=255,对于RGB值,数值越大,颜色越浅;对于透明度,数值越大,透明度越小。例如透明度为1A,即为十进制的26,则透明度为26/255约=0.1019...
2021-07-29 20:11:41
1584
1
原创 Android如何实现全局的护眼模式
最近接到一个需求,是 一个做护眼模式的需求,且要求是在Android全局,即在任何场景都可使用,思考了会和查阅资料,考虑到其实可以用一个淡黄色的透明遮罩盖在上面的方法。要求这个遮罩不影响其下面的应用等正常的使用。 如果直接在应用中开启一个蒙层activity,那么退出这个activity或者关闭应用,护眼模式就会被关闭,显然这是不符合我们的要求的,所以我们可以开启一个服务,然后在这个服务中添加这个遮罩。即可实现我们的所有全局操作都在护眼模式之下了。以下是开启...
2021-07-27 11:47:56
2441
2
原创 Android中如何判断是否正在播放视频
在AudioManager中有一个isMusicActive()方法,该方法可用来判断当前是否在播放音乐或者视频。/** * 判断是否在播放音乐或者视频 * @param context * @return */private boolean isMusicOrVideoPlay(Context context){ AudioManager audioManager = (AudioManager) context.getSystemService(AUDIO_SER...
2021-07-19 19:06:20
4678
6
原创 Android编译出现FAILED: setup-jack-server问题的解决办法
在编译Android的时候出现了如下错误:[ 28% 1127/3932] Ensuring Jack server is installed and startedFAILED: setup-jack-server图:原因:jack在编译的时候,可能出现多个人在同时编译的情况,这个时候就有可能出现两个人用同一个端口,发生端口冲突以至于超时。解决办法:修改端口号(修改 .jack-settings和.jack-server/config.properties文件)...
2021-07-09 14:39:33
3551
4
原创 将drawable对象转为json遇到的坑
如图 要持久化存储一个对象,需要先将对象转化为字节流,我使用的是谷歌的gson,如图对含有Drawable的实体对象转string时,会,在转化的时候报了转化异常,需要先将drawable转化为string类型,然后在main方法中使用gson转化第17行报错:实际上是...
2021-07-07 10:12:17
610
2
原创 如何在源码编译中给应用添加第三方jar包
如果我们在Androidstudio中使用第三方jar包,只需要在gradle文件中添加依赖,例如:implementation 'com.github.ybq:Android-SpinKit:1.2.0' 但是我们有很多在系统中的应用,用到了很多系统库,不能够直接在Androidstudio中编译,需要在系统环境中编译,这些应用从源码中导出来的也是没有gradle文件的,所以不能直接添加依赖,需要配置应用的Android.mk文件。操作步骤: ...
2021-06-29 11:38:55
639
原创 “Caused by: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:”的解决方法
Android studio升级到最新版本之后出现 “Caused by: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:”的报错提示:如下图:解决方法: 将 “File – Project Structure – Project”路径下的Gradle version改为最新版本:步骤如下:1)点击左上角的File-->Proje...
2021-04-21 10:45:28
59663
6
原创 java中==和equals区别
java中的 “==” 、“equals” 以及 hashCode都能起到比较的作用,那么它们的区别又是什么呢?一、操作符 == 如果是比较基本类型,如int,long等,它们的比较就是“值”的比较;如果是比较对象实例,那么比较的是它们两个所指向的对象在内存中的存储地址是否是一致的。而不是比较它们的内容。、1.对基本类型使用操作符 ==int类型的比较例子如下: int x = 1; int y = 1; Sy...
2021-04-08 09:28:10
234
原创 JAVA中所指的三大特性,原子性、可见性、重排序到底指的是什么?
一、原子性 所谓原子性既是指操作是单一不可分割的。举个例子:(1)int i = 0;(2)i = i + 1; 对语句(2)," i = i + 1" 就不是原子性操作。因为" i = i + 1" 实际上可以分解为3个操作:(1)读取变量 i 的当前值;(2)使当前值 i 和1做加法运算;(3)将加完后的值赋给 i 变量。 在多线程环境中,非原子操作可能会受其他线程的干扰。比如,上述例子如果没有对语句(2)的代码进行同步(Synchr...
2021-03-07 17:45:06
879
1
原创 Java中单例模式不同写法详解(包含懒汉式、饿汉模式、双重检查模式、静态内部类)
前言: 在Java,单例(Singleton)模式是一种广泛使用的设计模式。单例模式的主要作用是保证在全局某个类只有一个实例存在。它适用于一个类的实例需要重复被利用,使用单例即可避免实例对象的重复创建,不仅可以减少每次创建对象的时间开销,还可以节约内存空间。一些管理器和控制器常被设计成单例模式。常用的单例模式写法有以下几种:饿汉模式、懒汉式、双重检查模式、静态内部类等。一、 饿汉模式public class SingletonA{ private sta...
2021-02-25 10:48:54
337
1
原创 ArrayList、LinkedList、CopyOnWriteArrayList和Vector的区别详解
一. ArrayArray(数组)是基于索引(index)的数据结构,且它占用的内存空间是连续的,所以搜索和读取数据时使用索引在数组中是很快的。 Array获取数据的时候非常快,直接通过索引找到数据,时间复杂度是O(1);但是要删除数据却是开销很大,因为删除数据后需要把后面剩下的所有数据前移。注意:数组初始化必须指定初始化的长度, 否则报错。eg: int[] x = new int[];//报错,没有初始化长度 int[] x = new int[5];/...
2021-02-23 15:02:46
935
原创 调试应用时提示错误,你的主机中止了一个已建立的连接的解决方法
使用adb调试应用的时候,有时会出现 “ 你的主机中止了一个已建立的连接 ”的问题。问题截图如下:原因: 可能是连接的网络有所干扰。解决方法: 1.如果是用的手提电脑且连接了wifi热点,则将WiFi断开,可暂时调至飞行模式。如图: 此时的wifi是断开的,这个时候可以尝试继续调试安装应用。2.如果连接的是有线网络,即是插了网线,那么可以将网线拔了,断开网络后重新尝试调试安装应用...
2021-02-22 14:46:00
2354
原创 通用adb的默认路径在哪里?
安装了Android 的SDK后,会带有默认的adb工具,可用于普通的Android真机调试,那么这个adb的默认路径一般是:C:\Users\你的电脑用户名\AppData\Local\Android\Sdk\platform-tools 如图显示位置: 使用通用adb进行调试的步骤:一、全选路径如图:二、输入cmd如图:三、点击回车键如图,会弹出命令窗口,此时即可输入adb命令了...
2021-02-22 09:34:44
34526
原创 HashMap 及 ConcurrentHashMap原理详解
一.HashMap 的工作原理1.hashing的概念 Hashing(散列法)是一种将字符组成的字符串转换为固定长度的数值的方法,称为散列法,也叫哈希法。2.HashMap 内部结构 代码结构: 由上图可以看出,HashMap是数组和链表结合组成的复合结构,数组被分为一个个桶(bucket),每个桶可存储一个或多个Entry对象,在HashMap 中Node实现了Entry接口方法,每个Node对象包含四部分,分...
2021-02-20 17:55:52
2118
1
原创 理解java的异常分类及其处理,看这一篇文章就够了
前言: 异常是指程序的指令没有被正常执行的情况,这些情况会让程序异常退出,在Java中有两种类别的异常:Error和Exception。Error和Exception都是继承于Throwable类。一.Error Error 类对象由 Java 虚拟机生成并抛出,不可捕捉,程序本身不能处理。这种情况下会导致程序异常崩溃,如下图的Error继承结构可看出,Error下会有许多子类。例如较常见的Error异常StackOverflowError(某个线...
2021-02-08 11:41:59
620
3
原创 String、StringBuffer以及StringBuilder的区别。
在java中,我们经常使用字符串类型,那么我们所见到的String、StringBuffer、StringBuilder的区别到底是什么呢?先看以下整理的区别表格: String StringBuffer StringBuilder 是否可变 不可变,String 是 final 类,不能被继承。对于已经存在的 Stirng 对象,修改它的值,就是重新创建一个对象。 可变,使用 append() 方法修改 Stringbuffer 的值,修改...
2021-02-04 16:20:31
361
1
原创 java中的静态方法的讲解
静态方法定义: 在类中使用static修饰的方法。 说明: 使用static修饰的静态方法会在类定义的时候被装载到内存中;而非静态方法是属于具体实例化的对象的,只有当持有该方法的类的对象被创建的时候,该方法就会被加载到该对象所在内存。 注意: 非静态方法既可以访问静态数据成员和方法又可以访问非静态数据成员和方法; 而静态方法只能访问静态数据成员和方法。原因: 静态方法和静态数据成员会随着类的定义而被分配和...
2021-02-03 10:23:27
2779
原创 java中的垃圾回收(GC)机制
前言: 垃圾回收机制是Java语言中一个非常重要的机制,在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这些由JVM来处理。那么在java中什么是垃圾?什么是垃圾回收?如何回收?接下来我们一一探讨。一.什么是垃圾 在Java中,如果一个对象没有被其他对象所引用,那么该对象就会被认为是无用的,就被称为 “ 垃圾 ”。二.什么是垃圾回收 在以上提到“垃圾”的概念,回收其所占用的内存空间,就叫做 “ 垃圾回收 ”。三.如...
2021-02-02 17:36:42
339
1
原创 用Android studio 开发flutter项目时用夜神模拟器发现无法连接的解决办法
使用Android Studio开发Flutter项目,虚拟机使用的第三发的Android虚拟机,我这里使用的是夜神模拟器:但是Android studio如下不能自动查找到这个虚拟机。如图所示 : 一直在显示Loading的状态。原因: 可能是因为Android studio中的adb工具和夜神模拟器中的adb版本不一致解决方法:1. cmd进入到adb工具目录下输入adb version 查看adb版本2. cmd进...
2021-01-29 18:05:24
853
1
原创 testview使用setText的时候出现android.content.res.Resources$NotFoundException: String resource ID #0x3c报错
Android 开发时使用testview的setText时候出现了以下报错:Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x3c原因: setText()中传入的参数为int类型。解决办法: 使用String.valueOf ( )将int类型的参数转化为String类型。...
2021-01-28 16:48:29
638
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅