![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Android
文章平均质量分 87
e电动小马达e
正在努力奋斗的程序猿
展开
-
JNI基础语法
我们知道Java代码的内存是由垃圾回收器来管理,而JNI代码则不受Java的垃圾回收器来管理,所以JNI代码提供了一组函数,来管理通过JNI代码生成的JNI对象,比如jobject,jclass,jstring,jarray等,对于这些对象,绝对不能简单的声明一个全局变量,在JNI接口函数里面给这个全局变量赋值这么简单,一定要使用JNI代码提供的管理JNI对象的函数,否则代码可能会出现预想不到的问题。我们推荐的方法是,当JNI函数调用的Java方法出现异常的时候,JNI函数应该合理的停止执行代码。原创 2022-01-20 16:57:49 · 3088 阅读 · 0 评论 -
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 · 2437 阅读 · 0 评论 -
Android 进程间通信——AIDL学习与使用
一、概述AIDL是一个缩写,全称是Android Interface Definition Language,也就是Android接口定义语言。目的是为了实现进程间通信,尤其是在涉及多进程并发情况下的进程间通信。AIDL的语法和Java是一样的,只是在一些细微处有些许差别:文件类型:用AIDL书写的文件的后缀是 .aidl,而不是 .java。数据类型:AIDL默认支持一些数据类型,在使用这些数据类型的时候是不需要导包的,但是除了这些类型之外的数据类型,在使用之前必须导包。默认支持的数据类型原创 2021-11-22 15:42:23 · 2245 阅读 · 0 评论 -
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 · 9486 阅读 · 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 · 5793 阅读 · 1 评论 -
Android View 事件分发机制
一、前言View的事件分发机制是Android中较为重要的知识点,也是比较难理解的。日常开发中,我们经常会遇到各种滑动有冲突,解决滑动冲突还得对View的事件分发、拦截、消费 深入理解。二、事件分发的三个阶段当用户触摸屏幕时,就会产生相应的事件。Touch事件相关细节(发生触摸的位置、时间、历史记录、手势动作等)被封装成MotionEvent对象。当一个MotionEvent 产生后,系统需要把这个事件传递给一个具体的 View 去处理。Android事件分发机制的本质是要解决:点击事件由哪个对象发出原创 2021-09-02 11:02:30 · 302 阅读 · 0 评论 -
Android 窗口坐标
前言在开发中经常遇到控件坐标计算的问题,为方便之后查找特此记录一下。View中的坐标系View的坐标系统是相对于父控件而言的。view提供的方法getTop:获取到的,是view自身的顶边到其父布局顶边的距离getLeft:获取到的,是view自身的左边到其父布局左边的距离getRight:获取到的,是view自身的右边到其父布局左边的距离getBottom:获取到的,是view自身的底边到其父布局顶边的距离MotionEvent中的坐标系getX():获取点击事件相对控件左原创 2021-09-01 17:04:15 · 330 阅读 · 0 评论 -
Android基于ViewPager2实现循环轮播图、3D画廊效果
一、前言在开发中经常会遇到循环轮播图,之前的实现方式是在Activity中使用定时器控制轮播。后面想了想,看能不能把ViewPager2和定时器封装成自定义控件方便移植。然后就有了这个自定义控件。二、控件实现因为使用的是ViewPager2,所以要用到适配器,这里写了个BaseBannerAdapter用来设置循环滚动/** * @ Author : 廖健鹏 * @ Date : 2021/7/27 * @ e-mail : 329524627@qq.com * @ Description原创 2021-07-28 10:59:39 · 5751 阅读 · 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 · 670 阅读 · 1 评论 -
Android 10分区存储权限变更及适配
一、前言在Android 10中引入了分区储存功能,在外部存储设备中为每个应用提供了一个“隔离存储沙盒”。其他应用无法直接访问应用的沙盒文件。由于文件是应用的私有文件,不再需要任何权限即可访问和保存自己的文件。此变更并有助于减少应用所需的权限数量,同时保证用户文件的隐私性。目标版本targetSdkVersion设置为28或更低版本以下时,我们对外部存储空间的读写访问需要READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE权限。目标版本targetSdkVer原创 2021-05-14 17:40:03 · 5206 阅读 · 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 · 738 阅读 · 0 评论 -
Android onActivityResult的替代方法—registerForActivityResult
一、前言今天新建项目引入 implementation "androidx.fragment:fragment-ktx:1.3.0"包后,发现startActivityForResult()、onActivityResult()、requestPermissions()、onRequestPermissionsResult()方法被标记为过时,取而代之的是新方法registerForActivityResult()二、基本用法 registerForActivityResult(Acti原创 2021-05-06 16:32:57 · 5023 阅读 · 2 评论 -
Android MQTT通信实践
一、简介MQTT(Message Queuing Telemetry Transport,消息队列遥测传输),是轻量级基于代理的发布/订阅的消息传输协议,它可以通过很少的代码和带宽和远程设备连接。MQTT协议是为大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,协议具有许多不同的功能:是一种发布/订阅的消息传输协议。通过 TCP/IP 运行,TCP/IP 可以提供基本网络连接。是一种管理网络中消息流的经济方式。 例如,固定长度的标题仅 2 个字节长度,并且协议原创 2021-05-05 16:15:08 · 990 阅读 · 1 评论 -
Android设备唯一标识符
一、前言在开发中,我们有时候会遇到获取Android设备的唯一标识,唯一标识必须满足两个特性才能完美解决定位唯一设备的问题:(1)唯一性:标识必须在所有使用该应用的设备上保持唯一性(2)不变性:标识必须在同一设备上保持不变二、使用硬件标识硬件标识实际上在硬件生产之时就被要求满足这两个特性(依然有人工生产的不确定性),所以,在过去,这是一种很常用的方案,但如今硬件标识的获取趋于困难性,使得使用硬件标识作为唯一识别码的方案所能使用的范围越来越狭窄,官方也不推荐使用这种方式。2.1 IMEIIMEI原创 2021-05-05 14:37:22 · 974 阅读 · 4 评论 -
Android通知栏—Notification(二)
先研究一下,过几天再完成原创 2021-04-29 16:18:58 · 1146 阅读 · 1 评论 -
Android通知栏—Notification(一)
一、概述通知是指 Android 在您应用的界面之外显示的消息,旨在向用户提供提醒、来自他人的通信信息或您应用中的其他实时信息。用户可以点按通知来打开应用,或直接从通知中执行操作。二、Notification属性展示了通知最常见的部分,具体如下所示:小图标:必须提供,通过 setSmallIcon() 进行设置。应用名称:由系统提供。时间戳:由系统提供,但您可以使用 setWhen() 替换它或者使用 setShowWhen(false) 隐藏它。大图标:可选内容(通常仅用于联系人照片,请原创 2021-04-29 16:14:18 · 1226 阅读 · 2 评论 -
Android模块化开发与ARouter框架
一、为什么要模块化开发?如果App代码量不大,业务量比较少,这时候没有必要进行模块化开发。但是如果App业务较多的时候,代码复杂,每个模块之间的代码耦合严重,结构臃肿,每个开发人员开发部分代码时会影响其他开发人员的模块,修改一处代码要编译整个工程,效率较低,这时候最好的办法就是进行模块化拆分。不同的人可以独立负责不同的模块,相互不影响。二、项目架构设计项目架构设计的思路主要分为主App、公共基础模块、业务处理模块主App: 一个空壳app,本身不实现任何业务逻辑,主要用于将所有的模块打包成完整的r原创 2021-02-20 08:58:02 · 356 阅读 · 1 评论 -
Android ViewModel、LiveData 使用详解
过两天完成、、、原创 2020-12-03 17:37:36 · 1768 阅读 · 0 评论 -
Android Navigation 组件(进阶篇)
1、使用 NavigationUI 更新界面组件Navigation 组件包含 NavigationUI 类。此类包含使用顶部应用栏、抽屉式导航栏和底部导航栏管理导航的静态方法。可参阅:Android Material 常用组件详解(七)—— BottomNavigationView 使用详解Android Material 常用组件详解(九)—— NavigationView 使用详解Android Material 常用组件详解(十)—— ToolBar、AppBarLayout、Coordi原创 2020-12-03 15:30:33 · 1730 阅读 · 1 评论 -
Android Navigation 组件(基础篇)
一、前言在日常开发中,越来越多的会使用到一个activity嵌套多个fragment的场景,典型的例子就是app的首页,一般都会由一个activity+多个Fragment组成的底部导航界面,那对于Fragment的显示、隐藏等我们通常都是通过FragmentManager进行管理,但这种方式很容易造成代码臃肿,难以维护。而通过Jetpack的导航组件——Navigation,就可以很方便的管理各fragment之间的切换,让开发变得更简单。官方文档Navigation主要由三部分组成:Navig原创 2020-12-02 16:42:27 · 9651 阅读 · 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 · 5121 阅读 · 0 评论 -
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 · 3912 阅读 · 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 · 5614 阅读 · 0 评论 -
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 · 5594 阅读 · 0 评论 -
Android Material 常用组件详解(六)—— Progress indicators、Slider 使用详解
1.Progress indicatorsProgress indicators是自带动画效果的Progress。进度指示器向用户通知正在进行的进程的状态,例如加载应用程序,提交表单或保存更新。类型△ 线性和圆形Material Design提供两种视觉上不同类型的进度指示器:线性和循环进度指示器。分别对应LinearProgressIndicator和CircularProgressIndicator△ 确定和不确定进度指标可能是确定的或不确定的。确定指标显示流程需要多长时间。 不确定的指标原创 2020-11-27 15:57:22 · 9435 阅读 · 0 评论 -
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 · 3529 阅读 · 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 · 11732 阅读 · 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 · 1528 阅读 · 0 评论 -
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 · 4093 阅读 · 0 评论 -
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 · 2372 阅读 · 0 评论 -
Android Paging3 基本使用
一、前言Paging3,是Jetpack提供给开发者用来显示本地或者网络数据集的分页库。针对这类场景,传统的做法是用RecyclerView的加载更多来实现分页加载,很多逻辑需要自行处理且不一定完善。Paging3相当于是官网提供的一套解决方案。下图为您应用的各个层级中推荐直接接入 Paging 的 Android 应用架构二、添加依赖根据语言二选一即可,我使用的是kotlin//javaimplementation 'androidx.paging:paging-runtime:3.0.0-原创 2020-11-26 10:52:30 · 4626 阅读 · 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 · 1388 阅读 · 0 评论 -
Android RecyclerView的正确打开方式——DiffUtil、AsyncListDiff以及最新ListAdapter使用
前言自Android5.0以来,RecyclerView渐渐取代ListView成为Android开发中使用最多的列表控件,对于RecyclerView的使用相信大家都不陌生,但对于RecyclerView的高效刷新,却是很多人不知道的。简单粗暴的刷新方式 Adapter.notifyDataSetChanged()这种方式想必是大家曾经用的最多的一种刷新Adapter的方式,它的缺点很明显:无脑刷新整个RecyclerView可视区域,每个item重绘,如果你的onBindViewHolde原创 2020-11-25 16:06:53 · 3789 阅读 · 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 · 677 阅读 · 0 评论 -
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 · 2243 阅读 · 5 评论 -
RecyclerView 列表点击定位到中间位置
实现效果如果我们需要实现点击RecyclerView 列表定位到中间的位置,如下图一般情况下,RecyclerView 的列表滚动到指定位置,我们会使用 RecyclerView 的 smoothScrollToPosition(),但是问题有两个:不会定位到中间位置。当滚动的目标位置在屏幕中时,不会滚动。实现方法新建 CenterLayoutManager 类继承 LinearLayoutManager 类,重写 smoothScrollToPosition() 方法。在此类中,新建 C原创 2020-11-24 11:24:17 · 1144 阅读 · 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 · 3282 阅读 · 2 评论 -
Android之isTaskRoot()——防止应用初始化2次
一、前言在android开发中,难免会遇到各种奇葩的问题。最近在开发中遇到一种情况在app在LoginActivity登陆之后进入到主页面MainActivity,并且将LoginActivity界面已经finish了,按下home键退出回到桌面应用程序列表,又点击该应用的icon重新进入该应用,却发现应用是重新打开,而不是继续上次离开的界面。按道理来说,我都将LoginActivity界面finish,怎么也可能打开上一个界面。并且将app后台清掉之后就不再出现了。开始我怀疑是内存不足导致app被杀,然原创 2020-11-20 10:48:01 · 1600 阅读 · 0 评论 -
ADB 常用命令
安卓调试桥 (Android Debug Bridge, adb),是一种可以用来操作手机设备或模拟器的命令行工具。它存在于 sdk/platform-tools 目录下。1.配置ADB环境自行百度2.链接 ADB首先将手机连接了电脑,并且在开发者选择中开启 USB 调试模式adb devices可以看到C:\Users\liaojp>adb devicesList of devices attached7884b375 device其中,7884b375 是设备原创 2020-10-08 18:56:23 · 363 阅读 · 0 评论 -
Android使用DownloadManager实现下载apk功能
一、前言在Android开发中,经常会使用到文件下载的功能,比如app版本更新等。在api level 9之后,android系统为我们提供了DownLoadManager类,这是android提供的系统服务,整个下载过程全部交给系统负责,不需要我们过多的处理。二、DownloadManager的使用通过API文档,可以看出DownLoadManager包含两个内部类:DownLoadManager.Query:主要用于查询下载信息。DownLoadManager.Request:主要用于发起原创 2020-09-22 09:25:19 · 2277 阅读 · 1 评论