![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
android
文章平均质量分 59
xiaopangcame
这个作者很懒,什么都没留下…
展开
-
Android studio Load error:undefined path variables
进行Sync Project with Gradle Files。android stuido 报错。原创 2023-12-02 10:03:22 · 431 阅读 · 0 评论 -
Android DiskLruCache完全解析,硬盘缓存的最佳方案
LruCache只是管理了内存中图片的存储与释放,如果图片从内存中被移除的话,那么又需要从网络上重新加载一次图片,这显然非常耗时。对此,Google又提供了一套硬盘缓存的解决方案:DiskLruCache(非Google官方编写,但获得官方认证)。原创 2023-06-20 23:42:23 · 1990 阅读 · 1 评论 -
android内部存储和外部存储
我们在开发Android应用的过程中,避免不了要用到数据持久化技术,所谓的数据持久化就是将RAM中的瞬时数据保存到ROM中,保证在App退出或者手机关机后数据不会丢失。我们常用的数据持久化的方式有文件存储,数据库存储,SharedPreference存储等。在window中,当我们存储文件或者数据的时候,我们会选择保存到磁盘的某个目录,而在Android中有两个位置可以让应用进行数据持久化存储—内部存储和外部存储。在开发过程中可以根据不同的场景将数据存储在不同的位置,那究竟什么是内部存储?什么是外部存储?原创 2023-06-20 23:36:54 · 2020 阅读 · 0 评论 -
隐藏Detected problems with API compatibility警告弹窗
说明在代码中有通过反射调用含有@hide注解的方法或属性的逻辑,亦即调用系统隐藏API的逻辑。而从Android9.0开始,系统将限制这种调用方式,而弹出警告弹窗。调用了系统隐藏API的时候,都会有类似Accessing hidden field或Accessing hidden method的打印。当然以上方法调用,可能不太容易找到其他实现的方式,如果真的找不到,那也没办法。3.查看代码中调用了哪些系统隐藏API,看可否将这些逻辑改成其他方式实现。原创 2023-02-14 16:57:21 · 846 阅读 · 1 评论 -
Android枚举实现Parcelable接口
当枚举类为一个类的成员变量,并且该类也要实现Parcelable接口时,则先让枚举类实现Parcelable接口,原创 2022-12-10 12:08:57 · 545 阅读 · 0 评论 -
在Android Studio中使用Lambda
所有可以更改为lambda表达式的地方都会出现灰色带下滑波浪线的提示,将光标移至提示处,按下快捷键Alt+Enter会弹出替换成Lambda表达式的提示框,选择替换即可。下图是View点击事件的代码,采用Lambda的书写简介很多。常应用在只有一个方法的接口中。而我们自定义的接口,后期可能会增加接口中的方法,这样修改的地方就比较多,因为。在使用过程中,不建议在自定义接口中使用,原因是因为。也并没有在多个实现方法时提示要使用。不支持多个方法的接口,原创 2022-12-09 16:09:45 · 681 阅读 · 0 评论 -
解决Android8.0之后开启service
系统不允许后台应用创建后台服务。在系统创建服务后,应用有5秒的时间来调用该服务的 startForeground() 方法以显示新服务的用户可见通知。但是目前在调用:context.startForegroundService(intent)时报如下ANR,startForegroundService()文档说明在service启动后要调用startForeground()。项目测试时发现的,在双击返回键关闭应用后(并未杀死后台)重新打开APP,其他手机都OK,但是8.0的手机会出现较频繁的crash。原创 2022-12-09 08:35:40 · 689 阅读 · 0 评论 -
Android高版本Service在后台一分钟被杀死
最近公司出现了一个Bug,Service在后台写log时候一分钟左右被杀死,或者运行一会就被杀死了,上网搜了一下原来是Android高版本为了保护电量,流量什么的,会在后台杀死这些Service,现在我的做法是在通知栏加一条通知,让他保证Service存活。原创 2022-12-08 22:49:58 · 1498 阅读 · 0 评论 -
电话状态权限及IMEI获取流程源码分析
从ActivityManager的checkCompomentPermission()方法中一堆的if语句,其实也不难发现,权限的判断,主要还是和appId,uid,pid等参数相关,一般第三方app都是通过PackageManagerService来判断的。mCi是GSMPhone基类PhoneBase中的一个全局变量,其类型为CommandsInterface,为一个Interface,接下来就看看这个Interface的实现,这里就举出所有实现类型了,实现这个Interface的是RIL这个类。原创 2022-11-10 15:35:11 · 1252 阅读 · 0 评论 -
Android EditText 不自动获取焦点
在Activity上面显示一个EditText,进入该页面时想阻止这个EditText自动获取焦点而自动调起键盘。思路如下:可以采取让父级控件来获取焦点就可以了。目前该方法为最佳效果。原创 2022-10-19 10:46:56 · 1278 阅读 · 0 评论 -
解决 Unable to determine application id: com.android.tools.idea.run.ApkProvisionException
问题:Unable to determine application id: com.android.tools.idea.run.ApkProvisionException: Error loading build artifacts from: ../app/build/outputs/apk/debug/output-metadata.json。第三步:清除缓存和重启工程。第二步:再次编译工程。原创 2022-09-08 17:57:55 · 2243 阅读 · 1 评论 -
Android打开或者关闭GPS
【代码】Android打开或者关闭GPS。原创 2022-09-08 15:17:35 · 178 阅读 · 0 评论 -
利用AlarmManager完成精准的轮询
其实答案非常简单,相对于 Handler 来说,使用 sendEmptyMessageDelayed 方法是依赖于 Handler 所在的线程的,如果线程结束,就起不到定时任务的效果;轮询一般意味着我们需要Service来完成我们的一些具体的请求,这里我想让AlarmManager来定时唤醒一个Receiver用来启动请求的Service,这里比较困难的是,综上可知,AlarmManager不仅仅只是用了完成闹钟操作,还可以用来完成一些定时任务,但是因为系统的不断升级和优化,出于省电的考虑,在。...原创 2022-08-26 16:27:53 · 641 阅读 · 0 评论 -
Android PendingIntent
从这个角度来说,PendingIntent可以被理解为一种特殊的异步处理机制。不过,单就命名而言,PendingIntent其实具有一定误导性,因为它既不继承于Intent,也不包含Intent,它的核心可以粗略地汇总成四个字——“异步激发”。比如说A进程作为发起端,它可以从系统“获取”一个PendingIntent,然后A进程可以将PendingIntent对象通过binder机制“传递”给B进程,再由B进程在未来某个合适时机,“回调”PendingIntent对象的send()动作,完成激发。...原创 2022-08-17 17:49:44 · 968 阅读 · 0 评论 -
Android 打印堆栈日志的几种方法
在Android调试过程中经常会出现程序出现的结果不是我们预期的结果,那就需要加Log打印调试,看调用过程是否正确,此时就需要打印程序的调用栈,特别是Android代码相当庞大,打印堆栈更有利于我们分析问题,下面就记录下平时用到不退出程序打印堆栈的方法。验证的方法相关简单,在Activity的类中创建一个方法ThrowException,在onCreate中调用此方法,看打印出什么public void ThrowException() { // 调试打印堆栈而不退出 ......原创 2022-05-11 10:41:31 · 4169 阅读 · 0 评论 -
Android 网络切换 发送多次广播问题
最近发现做项目监听网络切换广播,根据网络条件切换一些设置.测试发现每次3G-WIFI 或者WIFI到3G,网络切换的广播都会发出多次.比如3G-->WIFI 会发送三个广播 1.连接wifi 2.关闭手机网络 3.连接wifi 有没有方法判断这个过程呢?那就来看一个类 http://www.androidcommunitydocs.com/reference/android/net/ConnectivityManager.html (官方API 文档)...原创 2022-04-08 08:49:29 · 594 阅读 · 0 评论 -
Java/Android中的引用类型及WeakReference应用实践
一、背景一般意义上而言,Java/Android中的引用类型包括强引用、软引用、弱引用、虚引用。不同的引用类型具有各自适用的应用场景,并与JVM的GC直接相关。作为Java/Android中的引用类型之一,WeakReference被大量的使用到系统源码、基础工具甚至具体的业务逻辑中。在解决需要异步使用目标对象实体、且又不影响目标对象实体的生命周期的场景中,具有天然优势。同时,还能进一步判断目标对象实体当前所处的GC阶段,如当前是否GC roots可达,亦或者已经被GC回收。二、四种引用类型原创 2022-04-01 15:51:26 · 2541 阅读 · 0 评论 -
java.lang.OutOfMemoryError: Could not allocate JNI Env
最近有一些OOM的错误上报java.lang.OutOfMemoryError: Could not allocate JNI Env极少量的java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Out of memory一个典型的用户状态是这样的用户使用时长 1小时56分11秒 前后台状态 后台设备机型 OPPO R9S 系统版本 Android 6.0.1,level 23可用内存大小 1.97 G原创 2022-03-24 14:14:45 · 1361 阅读 · 0 评论 -
Android应用被浅杀和深杀
onTaskRemoved()方法在当用户移除应用的一个Task栈时被调用。也就是当用户在最近任务界面把该应用的一个task划掉时,或者在最近任务界面进行清理时。这两种情况下onTaskRemoved()都会被调用,但在大多Android机型上,这两种情况有所不同:第一种情况即应用被浅杀(用户只划掉这一个Task),该Task栈会被清理,但如果有后台service在运行,该应用的进程不会被杀掉,后台service仍然在运行。第二种即应用被深杀(用户在最近任务界面直接按清理按钮),该应用的进程会被直接杀掉,后原创 2022-03-20 14:58:53 · 788 阅读 · 0 评论 -
bindService不能触发onServiceConnected方法的原因
在android项目中用到AIDL, bindService( service, connection, BIND_AUTO_CREATE ) 之后一直不调用 connection中的onServiceConnected方法可能原因1: 1、服务器端的service声明,要和客户端bindService的第一个参数匹配,不然客户端启动不了这个服务。<service android:name="com.example.multi.ContentServi...原创 2022-03-16 16:53:57 · 1238 阅读 · 0 评论 -
android模拟器
模拟器运行需要四个文件,分别是:Linux Kernel system.img userdata.img ramdisk.img上面我 lunch 命令时选择的是 aosp_x86-eng,因此 linux 默认使用的 AOSP/prebuilds/qemu-kernel/x86/kernel-qemu 下的 kernel-qemu,而其他文件则是使用的 AOSP/out/target/product/generic_x86 目录下的 system.img、userdata.img、ramdis原创 2022-02-07 17:01:25 · 771 阅读 · 0 评论 -
Android 源码 (AOSP) - 编译 ( 模拟器 )
启动模拟器emulatorcommand not found错误, 你肯定是在没有导入环境的窗口执行 emulator 了-bash: emulator: command not found这里要先导入环境, 如下. build/envsetup.sh选择运行的项目 (这个和你编译的一样)lunch aosp_arm-engANDROID_PRODUCT_OUT找不到环境变量 ANDROID_PRODUCT_OUTemulat原创 2022-02-06 22:19:09 · 1256 阅读 · 1 评论 -
android 源码编译 模拟器emulator启动
Android源代码编译成功之后,我们就可以运行它了。为了方便起见,我们使用Android模拟器emulator来运行编译出来的Android源代码。执行以下命令来启动Android模拟器:~~~USER@MACHINE:~/Android$ export PATH=$PATH:~/Android/out/host/linux-x86/binUSER@MACHINE:~/Android$ export ANDROID_PRODUCT_OUT=~/Android/out/target/produc原创 2022-01-28 19:46:08 · 3939 阅读 · 1 评论 -
Activity的启动流程
总的流程图:1. 进程A与AMS的交互过程此处以跨进程启动Activity分析一下源码流程:A调用startActivity时,需要与AMS交互,此时需要需要获取到AMS的代理对象Binder也就是上图的AMP,通过ActivityManagerNative.getDefault()获得,并调用AMP的startActivity方法,然后会通过mRemote.transact方法进行Binder通信,在AMS的onTransact方法里面会获取到请求的Activity参数信息:mRemo.原创 2022-01-16 11:19:59 · 160 阅读 · 0 评论 -
android:excludeFromRecents 属性需要注意的小地方
在 Android 系统中,如果我们不想某个 Activity 出现在 “Recent screens” 中,可以设置 <activity> 属性 android:excludeFromRecents 为 true。其中有些需要注意到的地方说明下。android:excludeFromRecents 属性并不会仅仅影响被设置的 Activity。由此该 Activity 启动的后续同属一个 “Task” 的一系列 Activity 都不会出现在 Recent screens。也就是说该属性是原创 2022-01-03 10:22:06 · 1021 阅读 · 1 评论 -
使用广播接收器时,onReceive 会多次执行
原因一:没有在onDestory中调用解注册。unregisterReceiver()原因二:BroadcastReceiver变量所在的Activity或者Fragment被创建的多次,形成多个对象。原创 2021-12-23 20:15:38 · 2197 阅读 · 0 评论 -
Android应用启动流程分析
1 前言网上看过很多Activity启动过程的源码解析,很多文章会贴上一大段代码,然后从startActivity()函数开始深究整个源码的调用栈。个人感觉这类文章代码细节太多,反而容易迷失在源码调用之中,从而忽略了Activity启动过程的本质。所以本文就简单地定性地对Activity启动过程进行描述,不会贴上大篇幅的源码,同时梳理一下相关的经典问题。也是对以前的所学做一个复习总结。2 冷启动与热启动Activity启动过程中,一般会牵涉到应用启动的流程。应用启动又分为冷启动和热启动。冷启原创 2021-11-16 09:15:27 · 884 阅读 · 0 评论 -
(Android 9.0)Activity启动流程源码分析
前言熟悉Activity的启动流程和运行原理是一个合格的应用开发人员所应该具备的基本素质,其重要程度就不多做描述了。同时,知识栈应该不断的更新,最新发布的Android 9.0版本相较于之前的几个版本也做了许多改动和重构,但是大体流程变化不大。本文基于Android 9.0版本源码,从Activity启动方法startActivity为切入口分析整个流程。相关类简介Instrumentation用于实现应用程序测试代码的基类。当在打开仪器的情况下运行时,这个类将在任何应用程序代码之前为您实例化原创 2021-11-14 10:21:41 · 5526 阅读 · 0 评论 -
Android Studio aar包引用方式
主工程第一种方式1.将aar包复制到app libs目录下2.在app的build.gradle文件中配置如下:android { ... repositories { flatDir { dirs 'libs' } }} implementation(name: '****', ext: 'aar')第二种方式1.将aar包复制到app libs目录下2.在app build.grad...原创 2021-11-10 09:26:45 · 1923 阅读 · 0 评论 -
Android 存储优化 —— MMKV 集成与原理
前言APP 的性能优化之路是永无止境的, 这里学习一个腾讯开源用于提升本地存储效率的轻量级存储框架 MMKV目前项目中在轻量级存储上使用的是 SharedPreferences, 虽然 SP 兼容性极好, 但 SP 的低性能一直被诟病, 线上也出现了一些因为 SP 导致的 ANR网上有很多针对 SP 的优化方案, 这里笔者使用的是通过 Hook SP 在 Application 中的创建, 将其替换成自定义的 SP 的方式来增强性能, 但 SDK 28 以后禁止反射 QueuedWork.get原创 2021-10-22 10:34:24 · 1234 阅读 · 0 评论 -
获取本机号码及sim卡信息
一、SIM卡存储的数据可分为四类,它们分别是:第一类是固定存放的数据。这类数据在移动电话机被出售之前由SIM卡中心写入,包括国际移动用户识别号(IMSI)、鉴权密钥(KI)、鉴权和加密算法等等。第二类是暂时存放的有关网络的数据。如位置区域识别码(LAI)、移动用户暂时识别码(TMSI)、禁止接入的公共电话网代码等。第三类是相关的业务代码,如个人识别码(PIN)、解锁码(PUK)、计费费率等。第四类是电话号码簿,是手机用户随时输入的电话号码。用户全部资料几乎都存储在SIM卡内,因此SIM卡又称为用..原创 2021-10-13 09:57:34 · 3013 阅读 · 0 评论 -
android源码github
https://github.com/aosp-mirror/platform_frameworks_base原创 2021-07-22 10:37:52 · 206 阅读 · 1 评论 -
Activity启动流程(二)
应用进程绑定到AMS AMS发送启动Activity的请求 ActivityThread的Handler处理启动Activity的请求一、应用进程绑定到AMS1. 时序图2. 详细过程在前面一篇我们知道当Zygote进程孵化出应用进程后会执行ActivityThread的main方法,所以我们先看看main方法里的代码。frameworks/base/core/java/android/app/ActivityThread.java public stat.原创 2021-07-14 22:50:23 · 318 阅读 · 0 评论 -
Activity启动流程(一)
于是到这里子进程也就是应用进程就被孵化出来了。你以为这样就结束了?其实还早呢!别忘了我们的最终使命是根Activity的启动,而现在只是有了根Activity所需要的应用进程,革命尚未成功,仍需要努力!Launcher进程请求AMS AMS发送创建应用进程请求 Zygote进程接受请求并孵化应用进程 应用进程启动ActivityThread 一、Launcher进程请求AMS 上面我们提到根Activity的启动流程其实就是桌面上点击一个应用图标进入到应用的第一个Activity..原创 2021-07-14 21:57:45 · 2547 阅读 · 5 评论 -
Android 相机预览方向和拍照方向
我们知道手机 Camera 的图像数据都是来自于摄像头硬件的图像传感器(Image Sensor),这个 Sensor 被固定到手机之后是有一个默认的取景方向的,这个方向如下图所示,坐标原点位于手机横放时的左上角:Camera 预览方向由于手机屏幕可以 360 度旋转,为了保证用户无论怎么旋转手机都能看到“正确”的预览画面。Android 系统底层根据当前手机屏幕的方向对图像 Sensor 采集到的数据进行了旋转处理后才传输给显示系统。因此,你在打开 Camera 应用后,无论怎么旋转手机都原创 2021-06-30 13:56:22 · 2020 阅读 · 0 评论 -
H.264编码基础知识详解
一、编码基础概念1、为什么要进行视频编码?视频是由一帧帧图像组成,就如常见的gif图片,如果打开一张gif图片,可以发现里面是由很多张图片组成。一般视频为了不让观众感觉到卡顿,一秒钟至少需要16帧画面(一般是30帧),假如该视频是一个1280x720分辨率的视频,那么不经过编码一秒钟的大小:结果:1280x720x60≈843.75M所以不经过编码的视频根本没法保存,更不用说传输了。2、视频压缩编码标准视频中存在很多冗余信息,比如图像相邻像素之间有较强的相关性,视频序列的相邻图像之间内原创 2021-05-15 11:39:40 · 8769 阅读 · 1 评论 -
Android Studio插件的源文件位置——mac端
有些时候安装插件后,整个android studio都卡住了,无法通过Android Studio --> preferences --> plugins来卸载,这时候就需要找到安装位置,进行删除。在第一次安装as的时候,系统会为我们安装一堆插件,他们的位置位于/Applications/Android Studio.app/Contents/plugins我们一般都会自己安装插件,安装的目录位于/Users/xxx/Library/Application Support/Andr...原创 2021-05-03 09:28:04 · 1383 阅读 · 0 评论 -
Retrofit2 源码解析
0. 基本使用1、Retrofit 将我们的 HTTP API 转换成一个 接口形式。所以我们第一步定义一个 interfacepublic interface GitHubService { @GET("user/{user}/repos") Call<List<Integer>> listRepos(@Path("user") String user);}2、然后构建一个 Retrofit,通过 create 方法生成 GitHubService原创 2021-04-17 22:23:46 · 325 阅读 · 0 评论 -
connect to maven.google.com:443 connect timed out 连接不上的解决办法
maven {url 'https://maven.google.com'}最新版本的AndroidStudio (Canary 9) + Gradle 已经使用 google()来指代 google 仓库了,会自动解析到https://dl.google.com/dl/android/maven2/。也就是说创建好项目不需要翻墙,也不需要修改什么就能更新依赖包了。所以我们直接修改Google的maven地址:maven {url 'https://dl.google.com/dl...原创 2021-03-30 10:08:56 · 2865 阅读 · 0 评论 -
Android reckon 控制项目打包版本
reckon用法github地址:[https://github.com/ajoberstar/reckon]根项目 gradle配置buildscript { apply from: 'versions.gradle' repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:4.1..原创 2021-03-10 16:52:29 · 105 阅读 · 0 评论