
Android Framework
文章平均质量分 64
Android Framework
guangdeshishe
这个作者很懒,什么都没留下…
展开
-
Android 五种启动模式小结
ActivityRecord对应着一个Activity实例,保存了Activity所有相关信息TaskRecord指的是一个任务栈,里面包含多个ActivityRecordActivityStack用于管理TaskRecord。原创 2023-04-04 22:02:48 · 1052 阅读 · 0 评论 -
RecycleView小结
RecycleView四级缓存一级缓存:用于存放当前屏幕可显示区域的ViewHolder,目的是为了方便更新数据,以及对View操作时更加快捷二级缓存:用于缓存最近滑动出屏幕的ViewHolder,目的是为了当用户将该View滑出屏幕外时又突然滑回来时能够快速显示,最多能缓存2个ViewHolder,不需要重新绑定数据,只有当postion相同时才能匹配上三级缓存:用户自定义的缓存,一般比较少用上四级缓存:用于缓存其他滑出屏幕外的ViewHolder,每种类型的ViewHolder最多5个Re原创 2023-04-04 22:02:10 · 1002 阅读 · 0 评论 -
Android消息机制-Handler小结
Epoll机制是Linux系统中用于IO多路并发的机制,它通过对FD文件进行注册监听,当FD文件的可读可写状态发生改变的时候,会唤醒阻塞的应用线程并调用回调函数达到通知的目的;它相比poll和socket等机制,使用红黑树来保存fd文件节点,使得查找节点时的效率高了很多,而且它通过注册回调函数的方式,使得用户层和内核层之间拷贝的次数减少了sleep 5秒后延迟5秒的消息会立刻执行,接着再过5秒,延迟10秒的消息会执行。原创 2023-04-04 22:04:01 · 1646 阅读 · 0 评论 -
Android Binder小结
物理地址就是内存条的真实地址,虚拟地址是MMU内存管理单元出来之后才有的,虚拟地址是给cpu用的,cpu不能通过虚拟地址直接访问内存,需要通过MMU转换后才能访问到真实的物理内存;原创 2023-04-04 22:00:36 · 741 阅读 · 0 评论 -
Android系统启动过程小结
init进程主要用于启动和守护系统关键服务,比如:网络、通话相关服务、Zygote进程、ServiceManager等等它是通过解析init.rc文件来启动这些系统关键服务init进程是1号进程,属于第一个用户进程,0号进程是内核进程。原创 2023-04-04 22:01:50 · 547 阅读 · 0 评论 -
Android事件分发机制小结
当手指触摸屏幕时,linux会将触摸信号记录到dev/input目录下的文件中IMS底层会开启两个线程:InputReaderThread和InputDispatcherThreadViewRootImpl在setView的时候,会创建InputChannel,通过WindowManager传递给IMS,IMS通过这个InputChannel向APP进程发送触摸事件;当ViewRootImpl这边接收到IMS那边发送过来的一个触摸事件后,最终会调用Activity的dispatchTouchEvent;原创 2023-04-04 21:58:20 · 739 阅读 · 0 评论 -
Activity任务栈、进程、taskAffinity、allowTaskReparenting之间的关系研究
基于Android11设备测试结果疑问:任务栈和进程关系? 答案:任务栈和进程可以说没什么关系,不同进程中的Activity可以在同一个任务栈中,任务栈可以看作是系统级别的东西,跟具体某个app没关系A启动B的Activity1时,Activity1是运行在A进程还是B进程中? 答案:默认情况下是B的进程,除非Activity1有指定其他进程,即使Activity1指定的进程名称与A的一样,它也不是跟A运行在同一个进程中,而是同名但是pid不同的另一个进程中"standard"启动模原创 2021-05-13 17:17:53 · 1039 阅读 · 0 评论 -
Apps targeting Android 12 and higher are required to specify an explicit value
Manifest merger failed : Apps targeting Android 12 and higher are required to specify an explicit value for android:exported when the corresponding component has an intent filter defined. See https://developer.android.com/guide/topics/manifest/activity-ele原创 2021-07-28 11:05:40 · 8545 阅读 · 5 评论 -
android.system.ErrnoException: open failed: EPERM (Operation not permitted)
android 10(Q)开始增加了沙盒机制,不能直接把文件保存到/sdcard目录下,只能保存到APP专属目录下;AndroidManifest.xml在标签下增加属性【android:requestLegacyExternalStorage=“true”】可以暂时保存到/sdcard路径下,但是Android11开始就失效了我们可以通过Context的getExternalFilesDir(null)方法获取APP专属目录,例如:/storage/emulated/0/Android/data/com原创 2021-07-30 16:51:31 · 10916 阅读 · 0 评论 -
Android 12(S)新特性小结
新功能:引入全新的统一API(OnReceiveContentListener)用于组件接收富媒体内容应用通过配置,支持自动将设备上录制的 HEVC(H.265) 和 HDR(HDR10 和 HDR10+)视频转码为更广泛兼容的 AVC (H.264)格式支持AVIF格式图片支持从音频产生触感反馈效果,增强游戏和音频身临其境的体验ImageDecoder支持解码gif和webp格式图片在非 DPC 应用中提供设备属性验证增强了Wi-Fi感知功能影响应用的行为变更所有应用:无论采用原创 2021-05-18 17:08:25 · 4834 阅读 · 1 评论 -
Android编舞者类Choreographer小结
编舞者类的作用主要是控制绘制节奏,用于发起一次vsync垂直同步信号的监听,当垂直同步信号来的时候会回调注册的Runnable或者FramCallback。原创 2023-04-01 21:36:26 · 1384 阅读 · 0 评论 -
Unresolved reference: synthetic 【Android】【Android Studio】【kotlin-android-extensions】
这个插件已经过时了,之前还只是警告,现在完全不能用了,Google推荐我们使用。这个类了,又看了下kotlin扩展包下面确实没这个类了。网上找了一圈基本都是教我们怎么使用,让我们导入。原创 2022-10-26 07:14:18 · 2552 阅读 · 0 评论 -
Android获取所有App信息
示例代码/*** 获取所有APP信息,保存到SDcard/download/AppInfo.txt文件中*/public static void getAppInfo(Context context) { if (context == null) { return; } ArrayList<String> launchList = getLauncherList(context); Log.d("getAppInfo", Arrays.toString(new ArrayL原创 2022-04-24 14:16:32 · 3761 阅读 · 0 评论 -
Android 捕获主线程异常崩溃
一般情况下我们想要捕获全局异常会调用Thread.setDefaultUncaughtExceptionHandler方法;但是这个方法只能捕获子线程的异常,如果是主线程发生crash,则程序还是会崩溃;想要主线程不崩溃,可以在自定义Application加上下面这段代码:Handler(Looper.getMainLooper()).post() { while (true) { try { Looper.loop() } catch (e原创 2022-03-16 17:57:24 · 3885 阅读 · 0 评论 -
Handler同步屏障
Handler同步屏障功能小结当MessageQueue.postSyncBarrier发送了一个同步屏障消息后,所有的同步消息(普通Message)都不能被执行,只有被标记为异步的Message才能执行;MessageQueue.removeSyncBarrier移除屏障消息后,普通消息才能正常继续执行;正常的消息Message.target指向Handler,并且Message默认是同步消息,如果想变成异步消息,可以调用Message.setAsynchronous(true)方法,或者Hand原创 2022-02-16 20:19:16 · 1053 阅读 · 0 评论 -
Android int二进制32位合并多个参数
二进制运算与运算(&):同1为1例如:0&0=0;0&1=0;1&0=0;1&1=1或运算(|):有1为1例如:0|0=0; 0|1=1;1|0=1;1|1=1;异或运算(^):不同为1例如:0^0=0; 01=1;10=1;1^1=0;取反(~):二进制中1变0;0变1例如:二进制1010;取反后就是0101Integer.toBinaryString(int):将整型值转换成二进制字符串基本原理int最大值是2的31原创 2022-01-30 15:42:11 · 2424 阅读 · 0 评论 -
Android 12 新APP启动画面(SplashScreen API)简介&&源码分析
以往的启动画面默认情况下刚启动APP时会显示一会白色背景如果把这个启动背景设置为null,则一闪而过的白色会变成黑色如果把启动Activity设置为背景透明【< item name=“android:windowIsTranslucent”>true</ item>】或者禁用了启动画面【< item name=“android:windowDisablePreview”>true</ item>】;虽然一闪而过的黑色或者白色没有了,但是因为背景透明了就原创 2021-10-11 21:59:52 · 8008 阅读 · 1 评论 -
Android px density densityDpi dp 之间的关系和区别
px表示屏幕的物理像素,例如 1080×1920densityDpi简称dpi,我们常说的像素密度,表示1英寸上对应有多少个像素,例如 160dpi、320dpi、440dpi、480dpi.以1080×1920的5英寸手机为例:宽:1080像素高:1920像素对角线(5英寸):根据勾股定理算出大约2203像素每英寸上大约有:440像素 = 2203/5所以这个手机的像素密度是440dpidpdip的别称,dp是Android上为了适配不同屏幕设备而定义的一种抽象单位,1dp可以理解为原创 2021-09-29 11:28:51 · 3498 阅读 · 0 评论 -
Toast源码分析(Android 11)
基于Android R(11) ,targetSdkVersion 30源码分析基本用法普通Toast:Toast.makeText(this@MainActivity, "hello Toast!", Toast.LENGTH_SHORT).show()自定义View的Toast:val toast = Toast(this@MainActivity)val view = Button(this@MainActivity)view.text = "custom toast!".原创 2021-07-28 18:12:40 · 1577 阅读 · 0 评论 -
Android Messenger和Handler的关系
刚开始接触Messenger和Handler时,总感觉他俩有点相似,因为它俩都有“send(Message message)”方法,并且处理消息都是串行的,后来看了源码才知道,它俩何止是相似,Messenger完全就是Handler支持跨进程调用的增强版。Messenger的基本用法服务端:MyService.ktclass MyService : Service() { val mServiceMessenger = Messenger(ServiceMessengerHandler(L.原创 2021-07-22 07:57:53 · 606 阅读 · 1 评论 -
CoordinatorLayout/AppbarLayout/CollapsingToolbarLayout的配合使用,Toolbar特效
上面这个特效就是Toolbar与CoordinatorLayout/AppbarLayout/CollapsingToolbarLayout配合后的效果;这几个View单独使用没什么效果,一般都是要互相配合才行。简介CoordinatorLayout: Coordinator的翻译后意思是【协调者】,它主要用于协调处理子View如何响应滚动事件,一般与NestedScrollView配合,协调子View滚动事件的处理AppbarLayout:是一种支持响应滚动手势的App Bar布局,继承自Li..原创 2021-07-14 07:09:26 · 2349 阅读 · 2 评论 -
Android状态栏/导航虚拟按键实现全透明小记
刚开始的状态栏,我们设置的布局是从状态栏下开始绘制的:代码设置状态栏全透明,我们设置的布局内容从状态栏开始绘制了:class UITool { companion object { /** * make status bar full transparent */ fun fullTransparentStatusBar(activity: Activity) { val window = activ原创 2021-06-11 21:25:07 · 2127 阅读 · 3 评论 -
Android Studio将某个Module作为Library被引用时,主APP安装后作为Library的Module在桌面上也有一个APP图标
Android Studio将某个Module作为Library被引用时,主APP安装后作为Library的Module在桌面上也有一个APP图标,点开后就是那个Library的主界面,大概是这样:这是因为作为Library的Module中AndroidManifest.xml里配置了默认启动的Activity,像这样://Library项目中<activity android:name=".SettingsActivity" android:label="@string/app原创 2021-06-09 07:06:19 · 503 阅读 · 2 评论 -
Android11(30) Activity启动过程时序图
Activity.startActivity => startActivityForResultInstrumentation.execStartActivityActivityTaskManager.startActivityActivityTaskManagerService.startActivity => startActivityAsUserActivityStarter.execute => executeRequest => startActivityUnc..原创 2021-03-14 17:13:03 · 846 阅读 · 2 评论 -
【精简版】Android消息机制(Handle、Message、Looper、MessageQueue, ThreadLocal)
主要涉及到的主要类有Handle、Message、Looper、MessageQueue, ThreadLocal整体流程:Handler是用来发送和处理Message,发送Message的时候,会把Message放入MessageQueue队列中,然后在Looper调用loop方法开启一个循环中,不断的从MessageQueue队列中读取Message,将Message再交由Handler处理,一个形象的比喻就是把Handler看做是流水线上的工人,Message就是传输带上带处理的商品,Messag原创 2020-10-18 18:00:14 · 174 阅读 · 0 评论 -
【精简版】一个APP从启动到主页面显示过程?
Luncher APP通过startActivity启动目标APP的默认ActivityInstrumentation.execLaunchActivity 通过Binder跨进程调用AMS的startActivity方法AMS中判断APP进程还没启动,则会通知Zygote进程fork新的进程给app,并启动主线程ActivityThread,在ActivityThread的main方法中又会创建Looper进入主线程的消息循环接着AMS通过ApplicationThread发送Handler消息给.原创 2020-10-18 17:39:20 · 145 阅读 · 0 评论 -
Android EditText 限制输入 金额 保留两位小数 InputFilter理解
问题描述:在 EditText中经常要限制输入的内容,比如在输入金额的地方,我们通常需要限制它“只能输入数字和小数点”、“保留两位小数”、“金额最前面不能出现0”、“小数点不能出现在第一位”分析问题:限制输入一般有下面几种方法:在布局文件里给EditText增加属性:android:inputType=“numberDecimal”,对应的代码设置://java代码editText...原创 2019-06-27 18:07:49 · 3152 阅读 · 2 评论 -
Only fullscreen opaque activities can request orientation 保持原有功能不变一行代码解决的办法
把标题的英文翻译中文就是:只有不透明的全屏Activity才可以设置它的orientation属性(也就是写死Activity只能横屏竖屏)之所以奔溃了,是因为你这台设备是Android8.0以上系统,Activity被指定了orientation属性,设置了背景透明,https://blog.youkuaiyun.com/starry_eve/article/details/82777160...原创 2019-07-17 11:27:14 · 202 阅读 · 0 评论 -
The exception was not handled due to missing onError handler in the subscribe() method call
The exception was not handled due to missing onError handler in the subscribe() method call. Further reading: https://github.com/ReactiveX/RxJava/wiki/Error-Handling | cn.leancloud.AVException出现这个问...原创 2019-08-08 10:48:15 · 12942 阅读 · 0 评论 -
Android cn.leancloud.AVException code=999 message=null
Android在使用leancloud数据存储服务时出现下面这个错误:cn.leancloud.AVException code=999 message=null查阅了官方文档,并没有错误码为999的说明,于是查看了一下AVException.java源码,找到了999这个错误码的常量描述:public class AVException extends Exception { ...原创 2019-08-08 11:37:07 · 7777 阅读 · 1 评论 -
Android ListView 中EditText无法获取焦点 最终解决方案
目前这类问题网上已经有很多答案了,例如:1、有的是加android:descendantFocusability属性;2、有的是给EditText添加Touch事件,记录下是点击了哪个EditText,然后再adapter里的getView方法里手动给这个EditText获取焦点我接到的需求是:1、点击添加按钮,然后再列表里添加一个Item;2、这个Item里就是一个表单,里面很多个...原创 2019-08-13 18:07:49 · 1687 阅读 · 0 评论 -
android setResult finish 异常
需求描述:跳转商品列表界面选择商品后,需要将选择的商品数据返回上一个界面通常从一个Activity返回数据到上一个Activity,我们一般都是在finish之前setResult,将要返回的数据存储在Intent中。问题:代码写好之后发现选择某个商品之后点击可以正常返回,但是当选择多个商品或者其他商品时,点击返回时没有任何反应,界面还是可以操作没有卡死,也没有崩溃日志,就是界面变得有些卡...原创 2019-08-15 20:01:53 · 1053 阅读 · 0 评论 -
分析Activity创建到显示的过程,理解Window、WindowManager、WindowManagerService之间的关系
涉及到的类以及方法主要有下面这些:ActivityThread:performLaunchActivity:创建Activity并调用attach方法,以及相应的生命周期,比如:onCreate、onStart、onRestoreInstanceState、onPostCreateperformResumeActivity:调用Activity的performResume方法,内部会调用...原创 2019-08-21 10:35:42 · 741 阅读 · 0 评论 -
DSL element 'useProguard' is obsolete and will be removed soon. Use 'android.enableR8' in gradle.pro
gradle升级到com.android.tools.build:gradle:3.5.0这个版本之后就出现标题这个提示:DSL element ‘useProguard’ is obsolete and will be removed soon. Use ‘android.enableR8’ in gradle.properties出现这个警告是因为build.gradle里配置了 'u...原创 2019-08-22 10:33:33 · 8397 阅读 · 0 评论 -
Android Activity启动过程分析
基于Android8.0-26源码分析我们启动Activity时一般是这样的,如果需要返回结果则调用startActivityForResult方法:Intent intent = new Intent(this, MainActivity.class);startActivity(intent);startActivityForResult(intent, 0);先来看看Acti...原创 2019-08-22 16:35:46 · 385 阅读 · 0 评论 -
Android Service启动过程分析
基于Android8.0-26源码分析整体流程:startService:Activity: startServiceContextWrapper: startServiceContextImpl: startServiceContextImpl: startServiceCommonActivityManagerService: startServiceActiveSe...原创 2019-08-30 15:39:03 · 386 阅读 · 0 评论 -
Android 模块化/组件化 理解
随着项目越来越大,编译的时间会越来越长,参与开发测试的人也会越来越多,各个功能模块之间也会越来越耦合难以复用,模块化和组件化就是为了提高开发测试的效率,降低功能模块之间的耦合性,使得它们可以复用,那么什么是模块化?什么是组件化?他们有什么区别呢?组件:指的是具有单一功能的控件,比如扫一扫控件、图片选择控件、城市选择、日期选择、分享、自定义组件等模块:指的是与业务相关的功能、比如订单模块、搜索...原创 2019-09-12 16:03:16 · 641 阅读 · 0 评论 -
Android 动态改变布局文件里元素位置
问题描述:在开发过程中有时候会遇到这样的需求:在同一个布局文件中有两个元素A、B,他们有时候A在上面,有时候B要在上面,如果A、B都是代码new出来的,或者在单独的xml文件里则比较简单,直接在代码里按照需要的顺序add进去就行了,但是我们现在不想那么麻烦把A、B单独拆分出来,只想改变A、B在xml文件里的顺序要如何做呢?解决思路:将布局文件里的A(id:view_a)、B(id:vi...原创 2019-04-25 19:21:32 · 2048 阅读 · 0 评论