- 博客(38)
- 收藏
- 关注
原创 Android ——事件分发机制
用户在使用app时,会经常频繁的触摸屏幕,点击页面交互,打开需要的功能。用户触摸点击的动作,就涉及到app中相关UI的触摸和点击事件。事件在UI中传递和处理的过程,就是事件分发流程。发生一次点击事件时,事件会按照Activity->ViewGroup->View的顺序,进行事件传递。
2024-12-18 20:51:34
1595
原创 View和ViewGroup,View绘制流程解析
View是绘制在屏幕上的用户能与之交互的一个对象,它代表了用户界面组件的一块可绘制的空间块,每一个空间块在屏幕上占据一个长方 形区域。View 的绘制流程是从 ViewRootImpl 的 performTraversals() 方法开始的,它经过测量(measure)、放置(layout)和绘制(draw)三个过程才能把一个 View 绘制出来,measure() 方法用于测量 View 的宽高,layout() 用于确定 View 在父容器中的放置位置,draw() 负责做具体的绘制操作。
2024-12-18 11:48:18
1185
原创 Android四大组件——ContentProvider(四)
这是在 Android 11 下才会出现的问题,简单来说,就是出于安全考虑,Android 11 要求应用事先说明需要访问的其他软件包。在 My Application2 中的 AndroidManifest.xml 中增加。
2024-12-11 15:20:44
162
原创 Android 事件分发机制详解/ 及Activity启动流程浅谈
目前网上的事件分发机制文章很多,可能大家看了很多,还是很懵逼,这篇文章是我自己总结的事件分发机制,提取了在事件分发机制中,最精华的部分,如果对事件分发还是不太清楚,可以看看这篇文章。
2024-12-09 16:38:50
1248
原创 Android四大组件——Service(二)
Service(服务)是一个一种可以在后台执行长时间运行操作而没有用户界面的应用组件。服务可由其他应用组件启动(如Activity),服务一旦被启动将在后台一直运行,即使启动服务的组件(Activity)已销毁也不受影响。此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信 (IPC)。
2024-12-09 16:26:37
904
原创 Android —— 四大组件之Activity(一)
Android四大组件即Activity(前台)Service(后台),Broadcast(通信),ContentProvider(数据存储)一、Activity。
2024-12-09 16:14:17
1098
原创 ANR分析总结
在Android中,当一个APP启动,其实是由zygote进程fork出来的一个子进程,这个进程(其中自然携带了一个0号线程)以 ActivityThread.main 为程序入口开始执行,而在main方法的最后,其实是没有机会到达exit的终点的,因为其调用了Looper.loop() 让0号线程“永远”不会到达终点(除了进程被杀掉)但既然可以使用APP,就说明我们在使用APP的过程中,代码没有执行到exit,这个就是下面要说到主线程的Handler机制了。则新的事件无法走到正常分发的逻辑。
2024-09-05 17:59:50
1513
原创 String.format各种使用方法
最小宽度] ,用于设置格式化后的字符串最小长度,若使用 [最小宽度] 而无设置 [标识] ,那么当字符串长度小于最小宽度时,则以左边补空格的方式凑够最小宽度。b,布尔类型,只要实参为非false的布尔类型,均格式化为字符串true,否则为字符串false。b,布尔类型,只要实参为非false的布尔类型,均格式化为字符串true,否则为字符串false。b,布尔类型,只要实参为非false的布尔类型,均格式化为字符串true,否则为字符串false。f,浮点数型(十进制)。
2024-08-29 11:40:43
2137
原创 【无标题】
MTK问题场景及所需Log抓取MobileLog、ModemLog、NetworkLog、ConnsysLog而在开启MTK Log之前,测试设备必须开启USB Debug。开启USB Debug。
2024-07-11 16:06:13
758
原创 APK反编译
使用方式举例,当发现使用jadx打不开某个APK或者DEX文件时,可以尝试将APK的DEX文件提出来,提取方式不详述,可自行百度。下载地址:https://github.com/DexPatcher/DexPatcher-tool/releases。官方地址:https://github.com/iBotPeaches/Apktool/tree/gh-pages。官方地址:https://github.com/DexPatcher/dexpatcher-tool。使用示例:d2j-dex2jar xxx。
2024-07-11 15:04:57
252
原创 焦点问题 anr
/ActivityThread会在onResume后将activity的window添加到wms中,保证当前页面的window。//将弹出dialog的操作放到MessageQueue后面延迟一会,保证activity的onResume优先执行完成。// 具备focus焦点,防止频繁的ANR异常。
2024-03-28 17:42:04
198
原创 音频焦点问题踩坑 Android9
如果只希望在短时间内播放音频,并且希望前一个持有音频焦点的应用暂停播放,则应该请求暂时性的焦点 (AUDIOFOCUS_GAIN_TRANSIENT)。如果只希望在短时间内播放音频,并且希望前一个持有音频焦点的应用暂停播放,则应该请求暂时性的焦点 (AUDIOFOCUS_GAIN_TRANSIENT)。如果计划在将来一段时间内播放音频,并且希望前一个持有音频焦点的应用停止播放,则应该请求永久性的音频焦点 (AUDIOFOCUS_GAIN)。Android 9以上 这里永久失去了焦点 无法正常恢复。
2024-03-27 12:04:13
339
原创 【大屏 折叠屏适配】 折叠后,activity左右黑边问题
分屏模式 /之所以从 Android 7.0 开始,把 resizeableActivity 默认改为 true,是因为在 7.0 里增加了一个新功能,叫分屏模式。如果把 resizeableActivity 设为 false,就意味着应用是不支持分屏模式的,它决定了应用是否有分屏的设置项。
2024-03-25 16:02:53
1787
原创 talkback适配:焦点顺序切换问题
如:这里id从1到6,则会以这6个id 对应的虚拟视图,从小到大进行焦点切换。这里将上述的id数组,与对应虚拟视图做了绑定。
2024-03-08 17:57:23
525
原创 adb命令,获取当前页面的包名和类名。 adb shell dumpsys window | findStr mCurrentFocus
adb shell dumpsys window | findStr mCurrentFocus
2023-12-26 19:42:40
1761
原创 adb root相关命令
请注意,这些操作可能会使设备的保修无效,并可能导致设备变砖或丧失数据。在进行操作之前,请确保您充分了解每个步骤的含义,并已经对您的设备进行了备份。执行此命令后,屏幕上会出现提示,需要您使用音量键选中“是”,然后按电源键确认,以解锁bootloader。这个命令会重启您的Android设备,进入bootloader模式。请记住,在执行这些操作之前,您应该了解它们的风险,并确保您有权限对设备进行这些更改。如果对这些步骤不够熟悉,可能会导致设备损坏。默认情况下,系统分区是只读的,以防止对关键系统文件的意外修改。
2023-12-26 17:01:37
2349
原创 Android12 新增SplashScreen,相关适配问题
如果您的现有启动画面是使用替换 android:windowBackground 的自定义主题实现的,那么在 Android 12 及更高版本上,系统会将自定义启动画面替换为默认的 Android 系统启动画面(这可能不是应用的预期体验)。如果您的现有启动画面是使用专用 Activity 实现的,那么在搭载 Android 12 或更高版本的设备上启动您的应用会导致系统重复显示启动画面,也就是先显示新的系统启动画面,接着显示您现有的启动画面 activity。
2023-12-13 17:46:07
4449
2
原创 Android布局优化之include、ViewStub、merge
在写Android的xml布局时,用好 include、ViewStub、merge这三个标签,可以是我们的xml更加简洁、高效。
2023-12-04 20:14:28
1011
原创 Kotlin:内置函数let、also、with、run、apply的使用
作用:调用同一个对象的多个方法 / 属性时,可以省去对象名重复,直接调用方法名 / 属性即可。调用同一个对象的多个方法 / 属性时,可以省去对象名重复,直接调用方法名 / 属性即可。let函数:返回值 = 最后一行 / return的表达式。且有返回值 :函数块的最后一行 / return表达式。{ } 返回值为 最后一行 or return语句。also函数:返回值 = 传入的对象的本身。run函数返回最后一行的值 / 表达式。apply函数返回传入的对象的本身。{ } 返回值为 自身。
2023-11-23 15:33:25
390
原创 This Activity already has an action bar supplied by the window decor
mainfest中activity没有设置theme,默认是有actionbar的。设置activity为noactionbar。
2023-11-20 15:18:16
131
1
原创 一个Activity内多个Fragment间切换的生命周期问题
且在下一级个Fragment处按HOME返回(或其他能触发onSaveInstanceState的操作),会触发onDestroyView的Fragmende的onSaveInstanceState。而ViewBinding在onDestroyView时会将binding置为null,因此此时在onSaveInstanceState中访问binding会报错。调用了上一个Fragment的onDestroyView。
2023-11-20 14:15:52
176
1
原创 adb获取手机当前有哪些在运行的任务栈
可以关注 ActivityRecord{2290792d u0 com.hjr.heidoulib/.module.activity.TestComponentNameActivity t9}来获取当前应用所显示的界面的包名跟类名。在Android studio中的Terminal中输入 adb shell dumpsys activity activities。就会出现你想要的信息。
2023-11-16 11:12:55
251
1
原创 Android获取Build.ID
Build.ID是Android系统中的一个属性,用于标识设备的唯一标识符。它是一个字符串,通常由厂商在制造设备时设定,并且在设备的整个生命周期中保持不变。每个设备都有一个唯一的Build.ID,因此我们可以根据它来区分不同的设备。在Android开发中,经常需要获取设备的一些信息,比如设备型号、Android系统版本等。而Build.ID就是其中一个重要的属性,它代表了设备的唯一标识符,对于判断设备类型和版本非常有用。
2023-11-15 16:53:22
1275
原创 从被混淆的log里通过mapping还原log文件
因此 还原为EditEventViewBinding类型的,FragmentEditEventBinding类的editEventView这个属性。例如:String test 属性,String被混淆为 String -> a,test被混淆为 test -> o。报空指针错误,从空的引用中读属性值:q6.b q6.c.a。分析: q6.b类型的 q6.c.a这个属性。前面是类型,后面是属性名。
2023-11-13 21:16:35
155
原创 Kotlin中非局部返回,从lambda表达式返回的问题
越来越多的会使用到一个activity嵌套多个fragment的场景,典型的例子就是app的首页,一般都会由一个activity+多个子tab组成,那对于Fragment的显示、隐藏等我们通常都是通过FragmentManager进行管理,但这种方式很容易造成代码臃肿,难以维护。而通过Jetpack的导航组件——Navigation,就可以很方便的管理各fragment之间的切换,让开发变得更简单。
2023-11-13 21:03:03
168
原创 Android 多用户时的userId获取方法
Android的多用户可以做到不同用户的应用的物理文件级(数据)的区分,以实现不同用户有不同的壁纸、密码,以及不同的应用等。Linux是多用户系统,每个用户都拥有一个uid,这个uid由系统和用户名做映射绑定。同时,为了便于用户管理(譬如管理文档权限),Linux引入了群组的概念,可以将多个用户归于一个群组。例如:在一个有两个用户(用户id分别为0和10)的安卓设备上,在用户10下安装一个应用,此时,在0下是看不到这个应用的。root用户:Linux下的唯一的超级用户,拥有所有的系统权限。
2023-11-10 18:12:33
1418
1
原创 Android AlarmManager 闹钟服务
AlarmManager 则具有唤醒 CPU 的功能,可以保证每次需要执行特定任务时 CPU 都能正常工作, 或者说当 CPU 处于休眠时注册的闹钟会被保留(可以唤醒 CPU),但如果设备被关闭,或者重新 启动的话,闹钟将被清除。从 API 19 开始,Alarm 的机制都是非准确传递的,操作系统将会转换闹钟,来最小化唤醒和电池的使用,但某些新的 API 会支持严格准确的传递,比如。AlarmManager 主要是用来在某个时刻运行某些的代码的,即使 APP 在那个特定时间并没有运行。
2023-11-01 16:17:55
204
1
原创 ValueAnimator 最基本的轮子
ValueAnimator 并不常用,因为它的功能太基础了。ObjectAnimator 是自动调用目标对象的 setter 方法来更新目标属性的值,以及很多的时候还会以此来改变目标对象的 UI,而 ValueAnimator 只是通过渐变的方式来改变一个独立的数据,这个数据不是属于某个对象的,至于在数据更新后要做什么事,全都由你来定,你可以依然是去调用某个对象的 setter 方法(别这么为难自己),也可以做其他的事,不管要做什么,都是要你自己来写的,ValueAnimator 不会帮你做。
2023-09-08 15:00:13
82
1
原创 ImageView.setBackGroundDrawable时会把padding清空
ImageView.setBackGroundDrawable时会把padding清空。
2023-09-07 14:55:35
75
1
原创 腾讯微信秒剪 实习生一面
这里写自定义目录标题腾讯微信秒剪 实习生一面腾讯微信秒剪 实习生一面1.自我介绍2.简单说下当前的项目 负责什么3.项目为什么要用Retrofit和rxjava Retrofit和rxjava的优点缺点4.Java的可见性,原子性,synchronized,怎么保证可见性 原子性 volatile怎么保证的可见性5.java的静态内部类和非静态内部类内存分配是怎样的??(反正是内存什么的好像) 静态方法跟非静态方法 死锁和同步 死锁产生的原因 静态方法中synchronized和非静态
2021-03-25 21:59:43
455
转载 解决recylerview和下拉刷新的冲突
学习笔记思路:监听RecyclerView的滑动,当滑动到顶部的时候,再设置SwipeRefreshLayout刷新可用。mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
2020-05-18 20:45:09
314
Android四大组件及动画技术详解与应用
2024-12-09
Java内存管理与优化技术详解及应用
2024-12-09
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人