自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(136)
  • 收藏
  • 关注

原创 个人博客导航

Java学习:java中I/O流之字节流和字符流Java设计模式总结Java设计模式 — 单例模式(Singleton)Java设计模式 — 模板模式(template)Java设计模式 — 观察者模式(Observer)Java设计模式 — 工厂模式(Factory)Java设计模式 — 适配器模式(Adapter)java多线程(一):Synchronized的...

2020-01-17 18:10:06 1194

原创 JNI基础语法

我们知道Java代码的内存是由垃圾回收器来管理,而JNI代码则不受Java的垃圾回收器来管理,所以JNI代码提供了一组函数,来管理通过JNI代码生成的JNI对象,比如jobject,jclass,jstring,jarray等,对于这些对象,绝对不能简单的声明一个全局变量,在JNI接口函数里面给这个全局变量赋值这么简单,一定要使用JNI代码提供的管理JNI对象的函数,否则代码可能会出现预想不到的问题。我们推荐的方法是,当JNI函数调用的Java方法出现异常的时候,JNI函数应该合理的停止执行代码。

2022-01-20 16:57:49 3195

原创 JNI开发入门

一、概述这篇文章用于记录JNI开发入门第一步,通过AS进行编写JNI代码,并生成so库文件。二、NDK环境搭建AS中下载NDK创建一个jni项目AS会帮我们创建两个文件三、编写JNI代码打开CMakeLists.txt文件,可以看到生成so库的名称和连接的cpp文件等。# For more information about using CMake with Android Studio, read the# documentation: https://d.android.com/

2022-01-20 13:54:42 2503

原创 Android 进程间通信——AIDL学习与使用

一、概述AIDL是一个缩写,全称是Android Interface Definition Language,也就是Android接口定义语言。目的是为了实现进程间通信,尤其是在涉及多进程并发情况下的进程间通信。AIDL的语法和Java是一样的,只是在一些细微处有些许差别:文件类型:用AIDL书写的文件的后缀是 .aidl,而不是 .java。数据类型:AIDL默认支持一些数据类型,在使用这些数据类型的时候是不需要导包的,但是除了这些类型之外的数据类型,在使用之前必须导包。默认支持的数据类型

2021-11-22 15:42:23 2311

原创 Android音视频通话——Linphone开发笔记总结

一、前言前一段时间完成了基于linphone实现音视频通话的项目,踩了很多坑,特此总结记录。Linphone是一款开源基于SIP协议的语音视频电话软件,可移植到移动端Android、IOS、WindowsPhone8。二、相关文档linehone官网 :http://www.linphone.org/technical-corner/liblinphone官网文档:https://wiki.linphone.org/xwiki/wiki/public/view/Lib/Getting%20s

2021-10-27 14:21:54 9867 4

原创 Android 使用FTP实现上传、下载等功能

一、前言最近在项目中遇到使用到FTP上传和下载资源,特此记录一下实现的方式。Android实现FTP的功能主要用到了Apache的Commons Net库,将Commons Net的jar包下载引入到项目中即可。基本使用流程图如下:二、基本实现2.1 连接和登录FTP协议和HTTP协议有所不同,使用FTP进行下载时,你需要进行登录操作。如果服务器没设置登录功能可忽略登录操作。 /** * 连接到FTP服务器 * * @param host ftp服务

2021-10-21 18:49:11 6238 1

原创 Android View 事件分发机制

一、前言View的事件分发机制是Android中较为重要的知识点,也是比较难理解的。日常开发中,我们经常会遇到各种滑动有冲突,解决滑动冲突还得对View的事件分发、拦截、消费 深入理解。二、事件分发的三个阶段当用户触摸屏幕时,就会产生相应的事件。Touch事件相关细节(发生触摸的位置、时间、历史记录、手势动作等)被封装成MotionEvent对象。当一个MotionEvent 产生后,系统需要把这个事件传递给一个具体的 View 去处理。Android事件分发机制的本质是要解决:点击事件由哪个对象发出

2021-09-02 11:02:30 347

原创 Android 窗口坐标

前言在开发中经常遇到控件坐标计算的问题,为方便之后查找特此记录一下。View中的坐标系View的坐标系统是相对于父控件而言的。view提供的方法getTop:获取到的,是view自身的顶边到其父布局顶边的距离getLeft:获取到的,是view自身的左边到其父布局左边的距离getRight:获取到的,是view自身的右边到其父布局左边的距离getBottom:获取到的,是view自身的底边到其父布局顶边的距离MotionEvent中的坐标系getX():获取点击事件相对控件左

2021-09-01 17:04:15 367

原创 Android基于ViewPager2实现循环轮播图、3D画廊效果

一、前言在开发中经常会遇到循环轮播图,之前的实现方式是在Activity中使用定时器控制轮播。后面想了想,看能不能把ViewPager2和定时器封装成自定义控件方便移植。然后就有了这个自定义控件。二、控件实现因为使用的是ViewPager2,所以要用到适配器,这里写了个BaseBannerAdapter用来设置循环滚动/** * @ Author : 廖健鹏 * @ Date : 2021/7/27 * @ e-mail : 329524627@qq.com * @ Description

2021-07-28 10:59:39 5919 4

原创 Android 自定义图片地图坐标

一、前言最近项目要求实现一个在自定义地图图片上添加坐标信息的功能,类似于在图片做标注的功能。如下图所示。坐标的位置是相对于图片宽高的百分比二、思路改功能主要分为三个视图,1.继承FrameLayout作为父容器;2.添加一个铺满父布局的ImageView显示地图图片;3.动态添加自定义坐标视图三、代码实现1. 自定义坐标视图<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.Con

2021-07-05 10:59:49 726 1

原创 Android 10分区存储权限变更及适配

一、前言在Android 10中引入了分区储存功能,在外部存储设备中为每个应用提供了一个“隔离存储沙盒”。其他应用无法直接访问应用的沙盒文件。由于文件是应用的私有文件,不再需要任何权限即可访问和保存自己的文件。此变更并有助于减少应用所需的权限数量,同时保证用户文件的隐私性。目标版本targetSdkVersion设置为28或更低版本以下时,我们对外部存储空间的读写访问需要READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE权限。目标版本targetSdkVer

2021-05-14 17:40:03 5401 8

转载 Android Fragment在特殊情况下的生命周期

一、前言对于Fragment的使用和生命周期网上有很多说明(传送门),此篇文章只是记录一些特殊情况下的Fragment的生命周期执行情况。二、发现问题在开发中,经常使用底部导航功能,一般采用RadioGroup+Fragment实现界面切换,例如class MainActivity : AppCompatActivity(){ private var mFragments: Array<Fragment?> = arrayOf((HomeFragment()), null, null,

2021-05-10 10:36:49 881

原创 Android onActivityResult的替代方法—registerForActivityResult

一、前言今天新建项目引入 implementation "androidx.fragment:fragment-ktx:1.3.0"包后,发现startActivityForResult()、onActivityResult()、requestPermissions()、onRequestPermissionsResult()方法被标记为过时,取而代之的是新方法registerForActivityResult()二、基本用法 registerForActivityResult(Acti

2021-05-06 16:32:57 5344 2

原创 Android MQTT通信实践

一、简介MQTT(Message Queuing Telemetry Transport,消息队列遥测传输),是轻量级基于代理的发布/订阅的消息传输协议,它可以通过很少的代码和带宽和远程设备连接。MQTT协议是为大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,协议具有许多不同的功能:是一种发布/订阅的消息传输协议。通过 TCP/IP 运行,TCP/IP 可以提供基本网络连接。是一种管理网络中消息流的经济方式。 例如,固定长度的标题仅 2 个字节长度,并且协议

2021-05-05 16:15:08 1047 1

原创 Android设备唯一标识符

一、前言在开发中,我们有时候会遇到获取Android设备的唯一标识,唯一标识必须满足两个特性才能完美解决定位唯一设备的问题:(1)唯一性:标识必须在所有使用该应用的设备上保持唯一性(2)不变性:标识必须在同一设备上保持不变二、使用硬件标识硬件标识实际上在硬件生产之时就被要求满足这两个特性(依然有人工生产的不确定性),所以,在过去,这是一种很常用的方案,但如今硬件标识的获取趋于困难性,使得使用硬件标识作为唯一识别码的方案所能使用的范围越来越狭窄,官方也不推荐使用这种方式。2.1 IMEIIMEI

2021-05-05 14:37:22 1089 4

原创 Android通知栏—Notification(二)

先研究一下,过几天再完成

2021-04-29 16:18:58 1210 1

原创 Android通知栏—Notification(一)

一、概述通知是指 Android 在您应用的界面之外显示的消息,旨在向用户提供提醒、来自他人的通信信息或您应用中的其他实时信息。用户可以点按通知来打开应用,或直接从通知中执行操作。二、Notification属性展示了通知最常见的部分,具体如下所示:小图标:必须提供,通过 setSmallIcon() 进行设置。应用名称:由系统提供。时间戳:由系统提供,但您可以使用 setWhen() 替换它或者使用 setShowWhen(false) 隐藏它。大图标:可选内容(通常仅用于联系人照片,请

2021-04-29 16:14:18 1302 2

原创 Android模块化开发与ARouter框架

一、为什么要模块化开发?如果App代码量不大,业务量比较少,这时候没有必要进行模块化开发。但是如果App业务较多的时候,代码复杂,每个模块之间的代码耦合严重,结构臃肿,每个开发人员开发部分代码时会影响其他开发人员的模块,修改一处代码要编译整个工程,效率较低,这时候最好的办法就是进行模块化拆分。不同的人可以独立负责不同的模块,相互不影响。二、项目架构设计项目架构设计的思路主要分为主App、公共基础模块、业务处理模块主App: 一个空壳app,本身不实现任何业务逻辑,主要用于将所有的模块打包成完整的r

2021-02-20 08:58:02 396 1

原创 Kotlin高级语法 — 集合常用操作符汇总

Kotlin中集合相关的操作符分为下述六类:总数操作符、过滤操作符、映射操作符、顺序操作符、生产操作符、元素操作符1、总数操作符操作符作用any()判断是不是一个集合,若是,则在判断集合是否为空,若为空则返回false,反之返回true,若不是集合,则返回hasNextany{...}判断集合中是否存在满足条件的元素。若存在则返回true,反之返回falseall{...}判断集合中的所有元素是否都满足条件。若是则返回true,反之则返回falsenone(

2020-12-08 10:25:13 1183

原创 Android ViewModel、LiveData 使用详解

过两天完成、、、

2020-12-03 17:37:36 1842

原创 Android Navigation 组件(进阶篇)

1、使用 NavigationUI 更新界面组件Navigation 组件包含 NavigationUI 类。此类包含使用顶部应用栏、抽屉式导航栏和底部导航栏管理导航的静态方法。可参阅:Android Material 常用组件详解(七)—— BottomNavigationView 使用详解Android Material 常用组件详解(九)—— NavigationView 使用详解Android Material 常用组件详解(十)—— ToolBar、AppBarLayout、Coordi

2020-12-03 15:30:33 1870 1

原创 Android Navigation 组件(基础篇)

一、前言在日常开发中,越来越多的会使用到一个activity嵌套多个fragment的场景,典型的例子就是app的首页,一般都会由一个activity+多个Fragment组成的底部导航界面,那对于Fragment的显示、隐藏等我们通常都是通过FragmentManager进行管理,但这种方式很容易造成代码臃肿,难以维护。而通过Jetpack的导航组件——Navigation,就可以很方便的管理各fragment之间的切换,让开发变得更简单。官方文档Navigation主要由三部分组成:Navig

2020-12-02 16:42:27 9774 9

原创 Android Material 常用组件详解(十)—— ToolBar、AppBarLayout、CoordinatorLayout、CollapsingToolbarLayout 使用详解

一、ToolBarToolBar是Android 5.0推出的一个新的导航控件用于取代之前的ActionBar,由于其高度的可定制性、灵活性、具有Material Design风格等优点。1.1 ToolBar属性整理 Toolbar 比较常用的属性app:navigationIcon 设置 navigation buttonapp:logo 设置 logo 图标app:title 设置标题app:titleTextColor 设置标题文字颜色app:subtitle 设置副标题app

2020-12-01 16:21:15 5594

原创 Android Material 常用组件详解(九)—— NavigationView 使用详解

一、前言在开发中,我们最常使用DrawerLayout + NavigationView 实现侧滑菜单,而NavigationView用来实现侧滑导航的布局。二、实现方式2.1 基础用法<?xml version="1.0" encoding="utf-8"?><androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"

2020-12-01 10:28:15 4077 1

原创 Android Material 常用组件详解(八)—— TabLayout 使用详解

一、前言在开发中,我们最常使用的是TabLayout+ViewPager+Fragment实现多个界面滑动的形式。二、实现方式2.1 基础用法 <com.google.android.material.tabs.TabLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <com.google.android.mat

2020-11-30 14:12:01 5712

原创 Android Material 常用组件详解(七)—— BottomNavigationView 使用详解

一、前言在开发中,底部导航栏十分常见。一般来说,我们可以自己组合控件实现,比如LinearLayout + TextView(使用android:drawableTop属性+selector状态切换)、RadioGroup + RadioButton等等组合控件的方法自定义实现复杂效果。而BottomNavigationView控件也是一种不错的选择。二、基本使用<LinearLayout xmlns:android="http://schemas.android.com/apk/re

2020-11-30 09:16:53 5656

原创 Android Material 常用组件详解(六)—— Progress indicators、Slider 使用详解

1.Progress indicatorsProgress indicators是自带动画效果的Progress。进度指示器向用户通知正在进行的进程的状态,例如加载应用程序,提交表单或保存更新。类型△ 线性和圆形Material Design提供两种视觉上不同类型的进度指示器:线性和循环进度指示器。分别对应LinearProgressIndicator和CircularProgressIndicator△ 确定和不确定进度指标可能是确定的或不确定的。确定指标显示流程需要多长时间。 不确定的指标

2020-11-27 15:57:22 10367

原创 Android Material 常用组件详解(五)—— MaterialButton、MaterialButtonToggleGroup、ShapeableImageView 使用详解

1.MaterialButton我们平时写布局,当遇到按钮需要圆角、或者描边等,通常的方法是新建一个xml文件,在shape标签下写,然后通过android:background或setBackground(drawable)设置。如果我们每个界面都新建个xml写shape,那么后期项目大了,维护起来就像无底洞。那么有没有这样一个控件,能在xml直接配置圆角、描边属性,满足平时开发的基本UI需求?刚好MaterialButton控件符合上面的要求。直接使用 <com.google.an

2020-11-27 14:21:58 3665 1

原创 Android Material 常用组件详解(四)—— SwitchMaterial、Chip、ChipGroup 使用详解

1.SwitchMaterial加强版的Switch直接使用 <com.google.android.material.switchmaterial.SwitchMaterial android:layout_width="wrap_content" android:layout_height="match_parent" android:checked="true" android:enabled="true"/>添加开关文字 <com.

2020-11-27 10:50:31 12382 2

原创 Android Material 常用组件详解(三)—— SnackBar、FloatingActionButton 使用详解

1.SnackBarSnackbar显示在所有屏幕其它元素之上(屏幕最顶层),同一时间只能显示一个snackbar。Snackbar的基本使用很简单,与Toast类似。//带按钮的Snackbar.make(coordinatorLayout,"这是massage", Snackbar.LENGTH_LONG).setAction("这是action", new View.OnClickListener() { @Override public void onClick(View v

2020-11-26 20:19:34 1601

原创 Android Material 常用组件详解(一)

一、前言Google I/O 2014 发布了Material Design。希望统一 Android平台设计语言规范。然而再国内的很多产品和设计师并不吃这一套,还是各种仿IOS的UI。而且这些控件使用起来非常方便,多数时候使用它可以满足我们日常开发UI的需求,提高效率。这里就对一些常用的组件做一个总结。官方Demo:github地址可以通过这个网站https://material.io/develop/android,去查找要使用的Material components,里边都有使用接入说明。二、

2020-11-26 18:32:21 4358

原创 Android Material 常用组件详解(二)—— TextInputLayout 使用详解

介绍TextInputLayout 主要是作为 EditText 的容器,从而为 EditText 生成一个浮动的 Label,当用户点击 EditText 的时候,EditText 中的 hint 字符串会自动移到 EditText 的左上角。TextInputLayout 使用详解1、基本使用布局文件中只需要在 EditText 外层包裹一层 TextInputLayout 布局即可<com.google.android.material.textfield.TextInputLayo

2020-11-26 18:31:49 2493

原创 Android Paging3 基本使用

一、前言Paging3,是Jetpack提供给开发者用来显示本地或者网络数据集的分页库。针对这类场景,传统的做法是用RecyclerView的加载更多来实现分页加载,很多逻辑需要自行处理且不一定完善。Paging3相当于是官网提供的一套解决方案。下图为您应用的各个层级中推荐直接接入 Paging 的 Android 应用架构二、添加依赖根据语言二选一即可,我使用的是kotlin//javaimplementation 'androidx.paging:paging-runtime:3.0.0-

2020-11-26 10:52:30 4734 6

原创 Android数据库框架——Room框架的使用

一、前言Room是Jetpack组件库一员,属于ORM库,主要是对Sqlite做了一层抽象,从而简化开发者对数据库操作。Room支持编译时的语法检查,并且支持返回LiveData。官网说明二、添加依赖在app的build.gradle中添加如下依赖:def room_version = "2.2.5"implementation "androidx.room:room-runtime:$room_version"// For Kotlin use kapt instead of annotat

2020-11-25 17:26:10 1443

原创 Android RecyclerView的正确打开方式——DiffUtil、AsyncListDiff以及最新ListAdapter使用

前言自Android5.0以来,RecyclerView渐渐取代ListView成为Android开发中使用最多的列表控件,对于RecyclerView的使用相信大家都不陌生,但对于RecyclerView的高效刷新,却是很多人不知道的。简单粗暴的刷新方式 Adapter.notifyDataSetChanged()这种方式想必是大家曾经用的最多的一种刷新Adapter的方式,它的缺点很明显:无脑刷新整个RecyclerView可视区域,每个item重绘,如果你的onBindViewHolde

2020-11-25 16:06:53 3940 8

原创 Android EditText过滤换行符或Emoji表情

public class CharFilter { /** * 根据 * 1. "汉字区间" * 2. "数字区间" * 3. "小写字母区间" * 4. "大写字母区间" * 过滤掉非法字符的方法 * @param oldString * @return */ public static String filterCharToNormal(String oldString) { S.

2020-11-24 15:17:18 733

原创 Android 滚轮选择器——仿ios滚轮控件

前言这是一个仿ios滚轮的控件,可以用于滚动选择。本组件根据loopView控件扩展修改的,loopView项目地址:https://github.com/weidongjian/androidWheelView在原有的基础上添加一些自定义设置,可根据自己的需求修改。GitHub项目地址使用gradle集成 allprojects { repositories { ... maven { url 'https://jitpack.io' } } }dependencies

2020-11-24 14:39:56 2400 5

原创 RecyclerView 列表点击定位到中间位置

实现效果如果我们需要实现点击RecyclerView 列表定位到中间的位置,如下图一般情况下,RecyclerView 的列表滚动到指定位置,我们会使用 RecyclerView 的 smoothScrollToPosition(),但是问题有两个:不会定位到中间位置。当滚动的目标位置在屏幕中时,不会滚动。实现方法新建 CenterLayoutManager 类继承 LinearLayoutManager 类,重写 smoothScrollToPosition() 方法。在此类中,新建 C

2020-11-24 11:24:17 1195 1

转载 RecyclerView Item布局宽高无效问题原因及解决方法

问题复现为什么发现了这个问题呢?是当时要写一个列表,列表本来很简单,一行显示一个文本,实现起来也很容易,一个RecyclerView就搞定。Activity以及Adapter代码如下:private void initView() { mRecyclerView = (RecyclerView) findViewById(R.id.rv_inflate_test); RVAdapter adapter = new RVAdapter(); adapter

2020-11-24 10:49:59 3701 3

原创 Android之isTaskRoot()——防止应用初始化2次

一、前言在android开发中,难免会遇到各种奇葩的问题。最近在开发中遇到一种情况在app在LoginActivity登陆之后进入到主页面MainActivity,并且将LoginActivity界面已经finish了,按下home键退出回到桌面应用程序列表,又点击该应用的icon重新进入该应用,却发现应用是重新打开,而不是继续上次离开的界面。按道理来说,我都将LoginActivity界面finish,怎么也可能打开上一个界面。并且将app后台清掉之后就不再出现了。开始我怀疑是内存不足导致app被杀,然

2020-11-20 10:48:01 1696

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除