Android
文章平均质量分 76
慕容野野
这个作者很懒,什么都没留下…
展开
-
Android更新UI的方式
目录Activity.runOnUiThread(Runnable)View.post(Runnable) View.postDelay(Runnable,long)Activity.runOnUiThread(Runnable)流程介绍:1.首先入口Handler类中runOnUiThread方法,如果当前线程不是UI线程,就调用mHandler.post(action); public final void runOnUiThread(Runnable action) {原创 2022-02-24 13:30:01 · 1151 阅读 · 1 评论 -
彻底搞懂LeakCanary检测泄漏原理
LeakCanary原理LeakCanary如何初始化?LeakCanary.install()1.1 ActivityDestroyWatcher.install()1.2 FragmentDestroyWatcher.install()1.3 listener.onLeakSentryInstalled()LeakCanary如何检测Activity退出并释放的原理?LeakCanary是如何使用ActivityLifecycleCallBacks?RefWatcher是什么呢?引用队列和弱引用代码应用原创 2022-02-24 13:29:30 · 930 阅读 · 0 评论 -
Android面试必问框架原理
Android面试必问框架原理volatile的实现原理synchronized的实现原理join方法实现原理CAS无锁编程的原理ReentrantLock的实现原理AOP理解IOC理解dagger2注入原理hilt原理组件化通信使用autoService+ServiceLoaderARouterBinderServiceManager启动`SM注册流程`Binder相关类图bindService流程图手写Binder实现AIDL原理Retrofit原理OkHttp拦截器流程Glide原理EvenetBus原创 2022-02-24 12:09:01 · 2870 阅读 · 0 评论 -
java.lang.UnsupportedOperationException: For security reasons, WebView is not allowed in privileged
最近做的项目,用webview加载网页,自测好好的,突然有一天,项目赋予了系统级应用能力,这个时候,webview不能用了;狗血,怎么办呢?因为应用是系统级别的,在AndroidManifest.xml中添加了android:sharedUserId=“android.uid.system”根据异常分析,是安全问题限制了webview控件使用追溯源码发现有这样的判断final int uid = android.os.Process.myUid();if (uid == android.os.原创 2022-02-24 11:59:04 · 3363 阅读 · 0 评论 -
快手Android上机面试:设计一个下载文件的框架
一个开放的上机面试题,能想到什么就写什么,我总结考的是以下几点吧:第一考文件下载功能的实现第二考代码习惯,代码风格是否规范第三考框架搭建能力,线程切换之类的思路:1、下载文件用HttpUrlConnection、Okhttp随便写2、代码规范尽量多看看阿里的文档规范,成员变量命名规范,接口名,方法名等见名识义3、考虑简单实现,一个Manager管理类,供程序调用;再设计两个接口,一个负责核心逻辑编写,一个负责数据监听;Manager管理类除了实现核心逻辑接口,还要实现Runnable接口;至于线原创 2021-06-22 20:16:40 · 534 阅读 · 1 评论 -
Android事件分发流程总结
Activity事件分发源码流程图原创 2021-06-04 11:36:55 · 690 阅读 · 0 评论 -
解决AndroidStudio下载gradle慢的问题
1.使用下载工具下载gradlegradle的官网下载地址是 https://gradle.org/releases,打开网址后下载complete版本的gradle。2.替换本地gradle完全关闭AS,包括正在下载gradle的进程也需要关闭。进入到本地的gradle存储目录,我的MAC是/Users/XX/.gradle/wrapper/dists,linux系统的话应该是在个人用户目录下。把gradle-6.5-all.zip文件复制到 gradle-6.5-all/8bnwg5hd3w55原创 2021-03-15 16:06:52 · 219 阅读 · 0 评论 -
了解Binder与AIDL关系
了解Binder与AIDL关系什么是BinderAIDL与BinderService接口方法调用流程小结什么是BinderBinder是一个类,它实现了IBinder接口,而IBinder接口定义了与远程对象的交互协议。通常在进行跨进程通信时,不需要实现IBinder接口,直接从Binder派生即可。除了实现IBinder接口外,Binder中还提供了两个重要的接口。(1)Transact(),客户端调用,用于发送调用请求(2)onTransact(),服务端响应,用于接收调用请求因为以上的原因原创 2021-01-11 21:16:23 · 475 阅读 · 0 评论 -
Android各版本新特性简单总结
目录Android5.0新特性Android6.0新特性Android7.0新特性Android8.0(O)新特性Android9.0(P)新特性Android10.0(Q)新特性Android11.0(R)新特性Android5.0新特性MaterialDesign设计风格支持64位ART虚拟机5.0推出ART虚拟机,5.0之前都是Dalvik他们的区别是:Dalvik,每次运行,字节码都需要通过即时编译器转换成机器码(JIT)ART,第一次安装应用的时候,字节码就会预先编译成机器码(A原创 2021-01-02 20:33:04 · 850 阅读 · 0 评论 -
面试:volatile特性详解
目录volatile 是什么?volatile 的可见性那么JMM与volatile有什么关系?JMM关于同步的规定JMM的主内存与工作内存描述示例代码来认识可见性volatile的原子性特征为什么说不保证原子性呢?volatile怎么解决原子性问题volatile的指令重排volatile 禁止实现指令重排优化单例模式下的volatilevolatile 是什么?Java语言规范第三版中对volatile的定义如下:java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应确保原创 2021-01-02 01:05:49 · 352 阅读 · 0 评论 -
Activity切换生命周期
Activity(A)启动后点击Home键再回到应用 的生命周期:onPause(A)->oStop(A)->onRestart(A)->onStart(A)->onResume(A)两个Activity(A->B)切换(B正常的Activity)的生命周期:onPause(A)->onCreate(B)->onStart(B)->onResume(B)->oStop(A)这时如果按回退键回退到A :onPause(B)->onResta原创 2020-12-31 15:19:50 · 691 阅读 · 0 评论 -
Android系统启动流程
Android系统启动流程那么结合本篇以及本系列的前三篇文章,我们就可以得出Android系统启动流程,如下所示。1.启动电源以及系统启动当电源按下时引导芯片代码开始从预定义的地方(固化在ROM)开始执行。加载引导程序Bootloader到RAM,然后执行。2.引导程序BootLoader引导程序BootLoader是在Android操作系统开始运行前的一个小程序,它的主要作用是把系统OS拉起来并运行。3.Linux内核启动内核启动时,设置缓存、被保护存储器、计划列表、加载驱动。当内核完成系统原创 2020-12-30 14:06:39 · 223 阅读 · 0 评论 -
内存泄漏面试总结
目录内存泄漏怎么产生的避免内存泄漏的一些技巧内存泄漏怎么产生的内存泄漏的主要原因在于一个生命周期长的东西间接引用了一个生命周期短的东西,会造成生命周期短的东西无法被回收避免内存泄漏的一些技巧1、不要以为Java永远会帮你清理回收正在运行的threads.在上面的代码中,我们很容易误以为当Activity结束销毁时会帮我们把正在运行的thread也结束回收掉,但事情永远不是这样的!Java threads会一直存在,只有当线程运行完成或被杀死掉,线程才会被回收。所以我们应该养成为thread设置退出逻原创 2020-12-29 19:55:19 · 178 阅读 · 0 评论 -
手机连接小盒子怎么看logcat日志
前提:远程手机调试,手机连接小盒子,无法插入电脑USB,这个时候想调试手机看日志怎么办,往下看:Step1:设置手机和PC在同一网络下,即连接同一WIFI;用USB连接手机;在终端输入:adb tcpip 5555解释:5555 端口是默认端口,也可以用其他端口Step2:断开手机与PC的USB连接,在终端输入:adb connect IP:5555, 比如这样:adb connect 192.168.10.161:5555终端会返回:connected to 192.168.10.16原创 2020-12-29 19:38:57 · 155 阅读 · 0 评论 -
handler面经10问
handler面经10问1. Handler 的基本原理2. 子线程中怎么使用 Handler3. MessageQueue 获取消息是怎么等待4. 为什么不用 wait 而用 epoll 呢?5. 线程和 Handler Looper MessageQueue 的关系6. 多个线程给 MessageQueue 发消息,如何保证线程安全7. Handler 消息延迟是怎么处理的8. View.post 和 Handler.post 的区别9. Handler 导致的内存泄漏9.1 内存泄漏原因9.2 避免h原创 2020-12-23 22:28:47 · 144 阅读 · 1 评论 -
Android8.0以上无法收到隐式广播 BroadcastQueue: Background execution not allowed:
问题2019-01-14 21:28:54.725 1083-1167/? W/BroadcastQueue: Background execution not allowed: receiving Intent { act=com.rlk.powersavemanagement.ACTION_AVAILABLE_TIME flg=0x10 (has extras) } to com.transsion.powercenter/.provider.PowerWidgetProvider这是怎么搞得?正原创 2020-12-21 18:22:58 · 604 阅读 · 2 评论 -
经验:Android批量打包APK并批量安装
在实际项目开发中,一个项目会有多个模块,那么如何用一个命令来依次生成多个APK呢?答案是通过gradlew命令进行批量打包假如项目名称为AProject,模块分别有B、C、D,那么如果用命令单独打包分别执行以下命令,assembleRelease、assembleDebug和assembleAndroidTest分别是你实际场景需要打包的渠道,可自行编写./gradlew :B:assembleRelease./gradlew :C:assembleDebug./gradlew :D:ass原创 2020-12-17 19:45:14 · 2021 阅读 · 0 评论 -
什么是内存泄漏,Java如何解决
一、什么是内存泄漏通俗讲就是该回收的对象,因为引用问题没有被回收,最终会产生OOM二、产生的原因一个长声明周期的对象持有一个短生命周期对象的引用三、Java如何解决Java不会解决,需要开发者通过profile或者mat工具进行分析你可以模拟一段内存泄漏的代码,然后运行,并马上退出activity,这个时候打开profile工具,进入memory来分析内存情况,先强迫进行垃圾回收(如图),然后截取内存快照按照包来找一下LeakActivity会发现有200多个字节没有被回收,代表原创 2020-12-17 19:21:44 · 150 阅读 · 1 评论 -
为什么Binder通信只需要一次拷贝
动态内核可加载模块 && 内存映射通俗翻译过来就是:Binder驱动和mmap跨进程通信是需要内核空间做支持的。传统的 IPC 机制如管道、Socket 都是内核的一部分,因此通过内核支持来实现进程间通信自然是没问题的。但是 Binder 并不是 Linux 系统内核的一部分,那怎么办呢?这就得益于 Linux 的动态内核可加载模块(Loadable Kernel Module,LKM)的机制;模块是具有独立功能的程序,它可以被单独编译,但是不能独立运行。它在运行时被链接...原创 2020-12-17 13:16:32 · 1052 阅读 · 0 评论 -
Java序列化理解-Serialiable和Parcelable区别
一、什么是序列化和反序列化:序列化和反序列化是一个过程,而不是什么接口,是把数据按照一定规则和格式保存下来,将来按照这种规则再把数据恢复回来。注意:Serialiable和Parcelable仅仅是实现序列化的方案之一简单总结这俩就是:Serialiable Java独有的,序列化接口 规则是JDK规则,序列化过程原理:需要大量IO和反射Parcelable Android独有的,序列化接口,需要程序员实现过程,是内存的序列化,存的是值,不会保存类和属性类型,序列化过程不需要IO操作,..原创 2020-12-17 13:14:17 · 302 阅读 · 0 评论 -
Git和ssh配置问题总结
流程:GIT安装-SSH配置-克隆代码一、GIT下载安装配置百度git官网,下载链接,根据自己电脑系统下载相应的安装包,一路默认下一步安装好后在桌面界面点击鼠标右键,会出现如下界面检查git是否安装OK,直接敲git命令,弹出下图所示界面就说明安装成功啦!git安装好去GitHub上注册一个账号,或者公司的gitlab账号,点击桌面上的Git Bash快捷图标,我们要用账号进行环境配置:配置用户名 git config --global user.name "usernam原创 2020-11-24 20:45:09 · 1573 阅读 · 0 评论 -
Android 杀死进程或者关机操作SIM卡,注册静态广播还能收到吗?
开机状态:系统静态广播发送,能监听到,动态广播也能监听到杀死进程:系统静态广播发送能监听到,动态广播也能监听到关机状态:系统静态广播不发送,再开机发送,并监听到,动态广播不能监听到...原创 2020-04-03 14:23:49 · 604 阅读 · 0 评论 -
Android 最快速获取通讯录所有手机号、对应姓名和头像
最近在做Android通讯录相关开发,需求是获取系统通讯录中所有手机号字段,包括住宅的手机号,还要展示姓名和头像获取通讯录手机性能低500条数据大概耗时要15s左右,满足不了产品需求,所以要进行优化获取速度。简单实现:查询所有手机号要指定URI路径:content://com.android.contacts/phones速度优化点:一、查询sql一定要过滤列,500条数据会将时...原创 2020-04-03 14:02:14 · 1418 阅读 · 0 评论 -
发布给用户的apk没有签名如何升级?
发布给用户的apk没有签名如何升级?原创 2016-06-28 15:17:58 · 1049 阅读 · 1 评论 -
android 制作9.png图片
一、什么是9.png: 可能做过任务栏美化的同学都会知道,我靠,framework-res.apk\res\drawable-hdpi 目录下有非常非常多的XXXXXX.9.png图片。千万不要以为这个9只是png格式图片的命名区分,其实他是一种特殊的格式,在png图片的基础上动了些手脚,而且这种手脚你会 看不见摸不着(详情见下面具体内容)。 9.png转载 2014-02-18 19:21:14 · 510 阅读 · 0 评论 -
一次退出所有的activity
网上有很多方法,有些弄的太麻烦了. 注意:那个activityManager的方法在sdk2.1后就不能用了,不要使用那个方法。 方法: 1.新建一个数据类,定义一个static的haspMap属性[其他也可以只要能存键值对就好]。 2.把每个入栈的activity启动时丢入hashmap。 3.复写每个需入栈的activ转载 2013-02-20 14:13:25 · 299 阅读 · 0 评论 -
LIstView模拟ExpandableListView
/********************************LIstView模拟ExpandableListView**************************************************************/下面我们看一个案例: 2012-9-25 23:28 上传下载附件(169.28 KB)转载 2012-11-15 17:38:27 · 396 阅读 · 0 评论 -
Spinner数据填充
第1种方法,在Java类中载入列表数据,在这里只是列出了一些静态数据: 页面布局spinner_1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:drawSelectorOnTop="false" />Java类:public class Spin转载 2012-11-01 23:49:12 · 745 阅读 · 0 评论