Android
文章平均质量分 74
It一zhai男
Android,kotlin,Java,flutter,python,
展开
-
BottomNavigationView底部导航去除缩放动画以及点击水波纹动画
引用依赖库implementation "com.google.android.material:material:1.2.0-beta01"底部导航去除缩放动画做法:给BottomNavigationView添加属性labelVisibilityMode<com.google.android.material.bottomnavigation.BottomNavigationView android:id="@+id/navigation" android:原创 2021-03-28 12:04:15 · 3538 阅读 · 3 评论 -
【原理】Activity的启动流程(api 29)
文章目录1 闲话2 从ActivityThread到Activity的onCreate调用链1 闲话喜欢读源码的同学应该早就注意到了,android api28以后,Activity的启动流程改变了许多,如android 28以后,ActivityThread中已经删除掉了LAUNCH_ACTIVITY的标签,而且也将一些逻辑单独提出来放在了一些新的类里面。由于我只是关注了它从ActivityThread的main以及startActivity走到最终调用Activity的生命周期,没有仔细阅读其细节,原创 2020-07-05 18:50:05 · 640 阅读 · 1 评论 -
【JVM】Java字节码指令集及示例
文章目录1 Javac用法2 Javap用法3 JVM 指令分类3.1 操作数栈3.2 运算与转换3.3 条件转移3.4 类与数组3.5 调度与返回加finally4 JVM 指令集表5 编译生成class文件参考文章:1 Javac用法用法: javac <options> <source files>其中, 可能的选项包括:options描述-g生成所有调试信息-g:none不生成任何调试信息-g:{lines,vars,source}原创 2020-07-05 09:43:31 · 282 阅读 · 0 评论 -
【性能】Android中的内存溢出(Out Of Memory,OOM)
【性能】Android中的内存溢出(Out Of Memory,OOM)1 JVM内存区域介绍2. OOM形成的原因3. 造成OOM的有哪些3.1 从JVM的角度3.2 从具体使用角度3.2.1 内存泄漏导致的内存溢出3.2.2 资源使用不合理导致内存溢出参考文章1 JVM内存区域介绍一般来说,应用创建时会给其分配一个虚拟机,应用的中几乎所有的数据都存储在虚拟机的内存区域,而虚拟机的内存区域又分为5大块,分别是:Java堆,方法区,程序计数器,虚拟机栈和本地方法栈,借用一张图:Java堆(Jav原创 2020-07-04 23:03:58 · 622 阅读 · 0 评论 -
深度探索 Gradle 自动化构建技术(一、Gradle 核心配置篇)
声明:博客分享自掘金,写得太好了,能学习到很多,所以想分享推广,如果觉得侵权,请联系我立马删除作者:jsonchao文章标题:深度探索 Gradle 自动化构建技术(一、Gradle 核心配置篇)博客地址:https://juejin.im/post/5e924273f265da47f079379c前言成为一名优秀的Android开发,需要一份完备的 知识体系,在这里,让我们一起成长为自己所想的那样~。一、重识 Gradle工程构建工具从古老的 mk、make、cmake、qmake, 再到成转载 2020-05-18 20:18:12 · 896 阅读 · 0 评论 -
【Dagger2】一文让你从Dagger2入门到熟练
@Inject注解在属性中表示该属性需要依赖注入,注解的属性不能使用private修饰,只能用默认、protected或public注解在方法中表示该方法需要依赖注入,注解的方法不能是抽象方法,不能是private修饰的注解在构造方法中表示此类能为Dagger2提供依赖关系,如果有多个构造函数,只能注解一个,否则会报错...原创 2020-04-26 19:34:49 · 352 阅读 · 0 评论 -
【性能】Android内存管理理论篇
注:本文主要来自于谷歌官网1 内存管理概览Android Runtime(ART)和Dalvik虚拟机使用的是分页和内存映射来管理内存。这意味着应用修改的任何内存,无论修改的方式是分配新对象还是轻触内存映射的页面,都会一直驻留在RAM,并且无法换出。要从应用中释放内存,只能释放应用保留的对象引用,使内存可供垃圾回收器回收。这种情况有一个除外:对于任何未经修改的内存映射文件(如代码),如果系统...原创 2020-04-16 19:16:54 · 394 阅读 · 0 评论 -
【性能】Java对象生命周期
Java对象生命周期对象的生命周期大致可以分为7个阶段:创建阶段(Created)应用阶段(Using)不可视阶段(Invisible)不可达阶段(Unreachable)可收集阶段(Collected)终结阶段(Finalized)对象空间重新分配(Deallocated)创建阶段(Created)在对象创建阶段,一般要经历以下几个步骤才能完成对象的创建过程:为对象分...原创 2020-04-14 17:21:49 · 514 阅读 · 0 评论 -
【性能】垃圾收集器(GC)
目录1 概述2 判断对象是否存活2.1 引用计数法2.2 可达性分析3 垃圾收集算法3.1 标记-清除算法3.2 复制算法3.3 标记-整理算法3.4 分代收集算法1 概述在Java内存运行时的各个部分中,程序计数器,虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭;栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的,因...原创 2019-06-21 15:03:04 · 325 阅读 · 0 评论 -
【性能】OOM原理解析:LowMemoryKiller原理
1 概述Android的设计理念之一,便是应用程序退出,但进程还会继续存在系统以便再次启动时提高响应时间. 这样的设计会带来一个问题, 每个进程都有自己独立的内存地址空间,随着应用打开数量的增多,系统已使用的内存越来越大,就很有可能导致系统内存不足, 那么需要一个能管理所有进程,根据一定策略来释放进程的策略,这便有了lmk,全称为LowMemoryKiller(低内存杀手),lmkd来决定什么时...原创 2020-04-14 10:53:11 · 1354 阅读 · 0 评论 -
【IPC】Android中的进程间通信(IPC)详解
1 需要的知识点1.1 进程与线程要理解跨进程通信,首先需要理解以下几个知识点1:进程:按照操作系统的描述,进程是资源分配的最小单位,一个进程可以包含多个线程线程:线程是CPU调度的最小单位,多线程需要考虑并发问题。1.2 Android中的多进程Android多进程指的是一个应用中存在多个进程的情况,在Android中,一般一个应用存在一个进程。多进程的情况2:某个应用由于自...原创 2020-04-13 18:33:05 · 798 阅读 · 0 评论 -
【IPC】Binder跨进程通信机制原理
注:本文查阅网上众多博客,然后总结得出,参阅博客地址见章末附录1 Binder简介1.1 定义定义如图所示(图片来自网上):2 知识储备2.1 进程空间一个进程空间被分为用户空间和内核空间。内核空间是系统内核运行的空间;用户空间是用户程序运行的空间。不同进程间的用户空间数据不可共享,不同进程间的内核空间数据是共享的;同一进程内,用户空间和内核空间都可被系统调用。示意图如下所示:2...原创 2020-04-13 11:26:16 · 343 阅读 · 1 评论 -
【蓝牙】BluetoothAdapter详解
BluetoothAdapter简介BluetoothAdapter代表本地蓝牙设备适配器。BluetoothAdapter可以让我们执行基本的蓝牙任务,如发现蓝牙,查询蓝牙已配对列表,通过已知的MAC地址初始化一个BluetoothDevice实例,并且创建一个BluetoothServerSocket来监听其它设备的请求,启动蓝牙低功耗设备扫描等。要获取代表本地蓝牙适配器Bluetoot...原创 2020-04-10 19:08:09 · 7033 阅读 · 0 评论 -
【面试】Android面试题集锦
持续更新…Handler谈谈消息机制Handler作用 ?有哪些要素 ?流程是怎样的 ?一个线程能否创建多个Handler,Handler跟Looper之间的对应关系 ?Handler 引起的内存泄露原因以及最佳解决方案软引用跟弱引用的区别为什么系统不建议在子线程访问UI?Looper死循环为什么不会导致应用卡死?使用Handler的postDealy后消息队列会有什么变化?可...原创 2020-04-09 15:42:40 · 481 阅读 · 0 评论 -
【面试】Handler/Runnable造成的内存泄漏
1 内存泄漏根本原因内存泄漏的根本原因是:长生命周期的对象持有短生命周期的对象,短生命周期的对象就无法及时释放。2 Handler错误用法 private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { s...原创 2020-04-09 15:33:36 · 1509 阅读 · 2 评论 -
【面试】一个线程能否创建多个Handler,Handler跟Looper之间的对应关系 ?
1 一个线程能否创建多个Handler,Handler跟Looper之间的对应关系 ?一个线程能够创建多个Handler,Handler跟Looper没有对应关系,线程才跟Looper有对应关系,一个线程对应着一个Looper,如下所示:private static void prepare(boolean quitAllowed) { if (sThreadLocal.get() !...原创 2020-04-09 15:32:40 · 4701 阅读 · 0 评论 -
【面试】强引用、软引用、弱引用和虚引用
强引用:是指创建一个对象并把这个对象赋给一个引用变量。软引用:如果一个对象具有软引用,内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。弱引用:弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。虚引用:虚引用和前面的软引用、弱引用不同,它并不影响对象的生命...原创 2020-04-09 15:31:41 · 256 阅读 · 0 评论 -
【面试】可以在子线程直接new一个Handler吗?怎么做?
可以在子线程直接new一个Handler,不过需要在子线程里先调用Looper.prepare(),new一个Handler后,还需要调用Looper.loop()方法。 new Thread(new Runnable() { @Override public void run() { Looper.pre...原创 2020-04-09 15:21:52 · 2394 阅读 · 4 评论 -
【面试】Looper死循环为什么不会导致应用卡死?
点击app图标,首先会进入ActivityThread的main方法,这里是android程序的入口,如下所示:public static void main(String[] args) { `````` Looper.prepareMainLooper();//创建Looper和MessageQueue对象,用于处理主线程的消息 Activ...原创 2020-04-09 15:20:37 · 2424 阅读 · 1 评论 -
【面试】使用Handler的postDealy后消息队列会有什么变化?
MessageQueue里的消息会以时间顺序(执行的先后顺序)来排序,使用Handler的postDealy后,MessageQueue里的消息会进行重新排序。根据源码一步步分析:public final boolean postDelayed(@NonNull Runnable r, long delayMillis) { return sendMessageDelayed(getP...原创 2020-04-09 15:19:10 · 1688 阅读 · 0 评论 -
【泛型】泛型上下边界
上一篇 【泛型】通配符与嵌套通配符可以是任意类类型,在实际业务中使用通配符时,可能会遇到很多安全问题,如传入的泛型类没有特定的方法或属性,类型转换错误等。为了防止这些问题的发生,就有了上下边界,用于指定通配符的范围。1 泛型上限extends上限extends指定的类型必须是继承某个类,或者某个接口,即<=,如? extends FruitT extends List// 容...原创 2020-04-09 15:08:12 · 589 阅读 · 0 评论 -
【泛型】通配符与嵌套
上一篇 【泛型】泛型的作用与定义1 泛型分类泛型可以分成泛型类、泛型方法和泛型接口1.1 泛型类一个泛型类(generic class)就是具有一个或多个类型变量的类。定义一个泛型类十分简单,只需要在类名后面加上<>,再在里面加上类型参数://泛型类public class MyDemo<T>{ private T value; public M...原创 2020-04-09 15:04:40 · 617 阅读 · 0 评论 -
【泛型】泛型的作用与定义
一、泛型的基本概念泛型是JDK1.5的一种新特性,它的本质是参数化类型的应用,也就是说操作的数据类型被指定为一个参数,在用到的时候再指定具体的类型。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类,泛型接口和泛型方法。泛型思想早在C++语言的模板(Templates)中就开始生根发芽,在Java语言处于还没有出现泛型的版本时,只能通过Object是所有类型的父类和类型强制转换两个特点...原创 2020-04-09 15:02:55 · 1171 阅读 · 0 评论 -
【注解】annotationProcessor自动生成代码
使用annotationProcessor根据注解自动生成代码。本文先不讲原理,只讲实现过程。尝试了一下在模块化中使用注解自动生成代码,但是会报错:Attribute value must be constant。这是因为在library模块中使用该注解(即使用BindView绑定id)而library构建时产生的R文件在壳模块app中,如下图所示:所以在library中使用注解绑定id,...原创 2020-04-09 15:02:07 · 1259 阅读 · 0 评论 -
【注解】使用注解来代替findViewById
本文是使用注解代替findViewById的简单使用,在此之前,必须要了解什么是元注解,元注解有哪些,作用是什么?注解的概念是java5.0提出来的,元注解主要有四种:@Target:说明了注解修饰的范围@Retention:定义了注解被保留的时间@Documented:表示可以被诸如javadoc此类工具文档化@Inherited:阐述了某个被标注的类型是被继承的具体可参考:【注...原创 2020-04-09 15:01:12 · 231 阅读 · 0 评论 -
【注解】自定义注解及元注解
1 元注解元注解的作用就是负责注解其他注解。Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它annotation类型作说明。Java5.0定义的元注解有:@Target@Retention@Documented@Inherited1.1 @Target@Target说明了Annotation所修饰的对象范围:Annotation可用于pack...原创 2020-04-09 15:00:18 · 302 阅读 · 0 评论 -
【并发】Lock与ReentrantLock
1 Lock基本使用Lock能实现代码同步,它比synchronized更具灵活性,什么时候锁住,什么时候释放锁等都是看得见的,使用时必须使用try{}finally{},意思是万一发生异常或者错误都可以释放锁。try{}finally{ //释放锁}使用示例public class SaleTicket implements Runnable { private...原创 2020-04-09 14:58:12 · 817 阅读 · 2 评论 -
【并发】android中的synchronized
synchronized用于多线程访问,并且被修饰的部分不能同时被执行,是代码同步的一种方式。1 使用synchronized修饰方法1.1 synchronized修饰方法原理过程:当多个线程同时访问被synchronized修饰的方法是,有且仅有一个线程可以被访问,当一个线程在访问时,其它线程只能等待。当一个线程访问完毕后,下一个线程才可以访问。原理:当方法被synchronized...原创 2020-04-09 14:57:02 · 537 阅读 · 0 评论 -
【Android组件化】app壳工程
组件化中需要一个app壳工程,这个壳工程中不处理任何业务,就只是一个空壳,由它将所需要的各个组件模块组合起来,构成一个完整的应用。直接new一个module接着进入app的AndroidManifest文件将注册Activity的相关代码也搬到ModuleMain模块的AndroidManifest中去,只留下application标签。这里注意组件化项目中每个Module...原创 2020-04-09 14:55:03 · 3048 阅读 · 0 评论 -
Android软键盘相关
1 Android显示和隐藏软键盘方法1.1 InputMethodManager类Android中软键盘的管理主要是通过InputMethodManager类来完成的。InputMethodManager对象的获取方法如下:InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(Conte...原创 2020-04-09 11:41:00 · 405 阅读 · 0 评论 -
MultiImageView+PhotoView+ViewPager图片预览
效果截图PhotoViewPhotoView是一个github上的一个开源项目。将下面加入到根build.gradle文件中allprojects { repositories { maven { url "https://jitpack.io" } }}然后,加入库到你的模块build.gradledependencies { imp...原创 2020-04-09 11:39:31 · 453 阅读 · 1 评论 -
Android实现圆形头像效果
效果截图实现原理对于圆形头像的实现,其实就是对方形图像做某些处理,以达到圆形头像的效果。一般我们会通过Canvas和Paint结合来实现这种效果。##自定义View来实现因为圆形头像是视觉方面的需求,一般我们会考虑能否从自定义View的角度来解决问题。自定义的核心有两点:视觉和交互。视觉由onMeasure、onLayout、onDraw这三个方法来完成,而交互则是由dispatchTo...原创 2020-03-30 15:30:31 · 2298 阅读 · 0 评论 -
【项目FJU】使用SwipeRefreshLayout+RecyclerView制作下拉刷新上拉加载更多
效果截图https://github.com/ydslib/Jianshu/tree/develop需要用到的知识setColorSchemeResources:设置下拉刷新进度条的颜色setOnRefreshListener:设置下拉刷新监听android:overScrollMode:设置滑动到边缘时无效果模式ContentLoadingProgressBar:内容加载进度条,继...原创 2020-03-30 15:28:28 · 398 阅读 · 0 评论 -
TabLayout简单使用(一)
1 导入包29以前:implementation 'com.android.support:design:28.0.0'29及以后(使用androidx):implementation 'com.google.android.material:material:1.0.0'2 常用的布局属性2.1 tabIndicatorFullWidthtabIndicatorFullWidt...原创 2020-02-28 12:34:35 · 799 阅读 · 0 评论 -
Fragment+layout+viewpager嵌套Fragment+layout+viewpager解决切换空白问题
Fragment+layout+viewpager嵌套Fragment+layout+viewpager,切换外层Fragment后再返回最开始的Fragment会出现空白,无法加载,可以将getSupportFragmentManager()改成getChildFragmentManager()public class HomeFragment extends Fragment { p...原创 2020-02-24 16:36:50 · 311 阅读 · 0 评论 -
【布局属性】TabLayout 去掉按下时的阴影效果
之前在TabLayout的xml中添加以下属性就可以去掉按下时的阴影效果:app:tabBackground="@android:color/transparent"但现在升级androidx后,该属性无效。 添加以下属性可以去掉按下时的阴影效果: app:tabRippleColor = "@android:color/transparent"...原创 2020-02-20 18:22:03 · 1022 阅读 · 0 评论 -
Android短信相关(理论部分)
1 PDU编码协议1.1 PDU编码规则目前,发送短信消息常用Text和PDU(Protocol Data Unit,协议数据单元)模式。使用Text模式收发短信代码简单,实现起来容易,但最大的缺点是不能收发中文短信;而PDU模式不仅支持中文短信,也能发送英文短信。PDU模式收发短信可以使用3种编码:7-bit、8-bit和UCS2编码。7-bit编码用于发送普通的ASCII字符,8bit编码...原创 2020-02-14 11:41:44 · 924 阅读 · 0 评论 -
Android经典蓝牙相关知识
1 蓝牙基础知识1.1 蓝牙相关的权限<!--想要用蓝牙进行通信则要申明bluetooth权限--><uses-permission android:name="android.permission.BLUETOOTH"/><!--bluetooth_admin用来操作蓝牙,官方建议除非是用户请求修改蓝牙设置的--><uses-permissio...原创 2020-02-12 17:42:57 · 9654 阅读 · 1 评论 -
Android的httpclient的post方法获取服务器端的数据(服务器端是get方法)
1.首先建立一个StreamTools类:public class StreamTools {/** * * * @param is * @return */ public static String streamToStr(InputStream is) { try { ByteArrayOutputStream os = new ByteArrayOut原创 2015-11-03 16:38:20 · 444 阅读 · 0 评论 -
百度地图系列01——最简单的调用百度地图
百度地图系列01——最简单的调用百度地图源码下载地址:http://download.csdn.net/detail/u013293125/9287041 1、建立一个Android工程,命名为BaiduMapDemo012、在工程的libs目录下添加baidumapapi_v2_1_3.jar包3、在activity_main.xml中代码:<LinearLayout xmlns:android原创 2015-11-20 20:00:22 · 1397 阅读 · 0 评论