- 博客(64)
- 收藏
- 关注
原创 Android 适配深色模式
Android 深色模式适配Android 10 开始支持配置深色模式,如果系统是深色主题,但是打开APP又是浅色主题就会显得格格不入。下面介绍几种适配深色模式的方法。一、forceDarkAllowed样式中设置 android:forceDarkAllowed 属性,深色主题下系统会自动进行适配。新建 values-v29 目录,因为 android:forceDarkAllowed 属性 Android 10开始才有。设置 android:forceDarkAllowed 属性为tr
2021-12-19 21:41:06
11126
1
原创 数据结构和算法一一链表
什么是链表链表也是一种线性表,它和数组最大的差异在于它不需要连续的内存空间进行存储,而是通过 “指针” 将一组零散的内存块串联起来使用。其中,我们把内存块称为链表的“结点”。为了将所有的结点串起来,每个链表的结点除了存储数据之外,还需要记录链上的下一个结点的地址。常见的链表结构:单链表其中有两个结点是比较特殊的,它们分别是第一个结点和最后一个结点。我们习惯性地把第一个结点叫作头结点,把最后一个结点叫作尾结点。其中,头结点用来记录链表的基地址。有了它,我们就可以遍历得到整条链表。而尾结点特殊的地
2021-09-29 00:16:03
697
原创 数据结构和算法一一数组
基本每一种编程语言中,都会有数组这种数据结构,虽然平时开发中用的很多,但并没有掌握它的精髓。数组的特点数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。这句话中有三个关键字 “线性表”,“连续的内存空间”,“相同类型的数据”。线性表顾名思义,线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表结构。而与它相对立的概念是非线性表,比如二叉树、堆、图等。之所以叫非线性,是因为,在非线性表
2021-09-27 22:47:50
336
1
原创 约束布局ConstraintLayout 使用
ConstraintLayout 和 RelativeLayout 相似,其中所有的视图均根据同级视图与父布局之间的关系进行布局,但其灵活性要高于 RelativeLayout,适合创建复杂的大型布局。官方教程地址:https://developer.android.google.cn/training/constraint-layout一、基本使用1.1 添加到项目中在项目根目录的 build.gradle文件中声明: repositories { google()
2021-09-22 10:48:34
591
原创 Android 屏幕适配
Android 屏幕适配Android设备多种多样,有着不同的屏幕尺寸和像素密度,大大增加了适配的难度。一、基本单位介绍介绍下Android UI中常见的几个单位。pxpx 就是像素点,是屏幕物理上最小显示单位,如手机分辨率 1080 x 1920 表示宽有1080 像素点,高有1920 像素点。分辨率高的屏幕上面像素点(色块)就多,所以屏幕内可以展示的画面就更细致。但是布局的时候不能直接使用px作为单位,因为在不同分辨率的手机上,展示大小会不一样。可以看到相同的px,在不同分辨率上显示的宽
2021-09-08 18:03:01
210
原创 Android 实现拖放控件
类似微信朋友圈删除图片效果,示例如下:Android 拖放框架 ,可以让用户使用图形化拖放手势移动数据。监听拖放过程实现 View.OnDragListener 的拖动事件监听器或其 onDragEvent(DragEvent) 回调方法来接收拖动事件。DragEvent 操作类型getAction() 值含义ACTION_DRAG_STARTED当应用调用 startDrag() 并获取拖动阴影后,视图对象的拖动事件监听器会立即收到此事件操作类型。ACTION_DRA
2021-07-28 18:23:01
1136
原创 Android 获取设备名称
Android 设备名称,例如:通过Build获取Build.DEVICE结果是:deviceName: HWLLD-H明显不是设备名称,查看该参数介绍,指的是工业设计的名称。Global.DEVICE_NAMESettings.Global.getString(getContentResolver(), Global.DEVICE_NAME)测试多个手机后发现,只有google pixel 手机获取是正常的,其他华为、小米等手机获取到的是手机型号://华为、小米等手机获取到的是手
2021-07-21 09:20:53
2198
1
原创 Android 获取位置信息
Android 提供 LocationManager 等相关API用于获取位置信息。一、权限申请1.1 APP申请定位权限Manifest 文件中添加以下权限: <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
2021-07-19 18:02:24
2788
2
原创 Android 权限申请
https://www.jianshu.com/p/24f79a70025bAndroid的应用权限有助于保护用户隐私,访问一些敏感数据例如
2021-05-30 16:28:43
2061
2
原创 Android修改Dialog样式
Android 对话框支持自定义标题,内容,按钮和点击事件,基本上可以满足我们日常的使用。但有时候我们想要修改对话框的文字,按钮颜色等,系统并没有提供对应的方法,正常情况下只能自定义布局。接下来通过源码解析介绍几种修改 Dialog样式的方法。一、Dialog源码解析...
2021-05-23 16:26:29
536
原创 Android 数据存储
一、数据存储方式介绍Android 使用的文件系统类似于其他平台上基于磁盘的文件系统。该系统为您提供了以下几种保存应用数据的选项:应用专属存储空间:存储仅供应用使用的文件,可以存储到内部存储卷中的专属目录或外部存储空间中的其他专属目录。使用内部存储空间中的目录保存其他应用不应访问的敏感信息。共享存储:存储您的应用打算与其他应用共享的文件,包括媒体、文档和其他文件。偏好设置:以键值对形式存储私有原始数据。数据库:使用 Room 持久性库将结构化数据存储在专用数据库中。下表汇总了这些选项的特点:
2021-04-23 21:58:29
774
4
原创 Android ViewBinding 使用
最近Android Studio 升级后 butterknife 发现一个警告:Resource IDs will be non-final in Android Gradle Plugin version 5.0, avoid using them as annotation attributes查看官网发现:butterknife已经弃用,建议使用 view binding 替换。一、什么是view binding官方介绍:通过视图绑定功能,您可以更轻松地编写可与视图交互的代码。在模
2021-04-11 15:14:19
446
原创 JNI创建线程
作为一个Android开发,或多或少都会接触到JNI,有时候需要创建线程做一些特别的操作。一、创建线程#include <jni.h>#include <android/log.h>//添加头文件#include <pthread.h>#define LOG_TAG "nativethread"#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS_
2021-04-04 13:38:34
738
原创 JNI异常找不到native方法的实现
今天遇到了一个很奇怪的问题,调用 native 方法时,报了下面这个错误:java.lang.UnsatisfiedLinkError: No implementation found for 方法就如同字面上的意思,找不到该 native 方法的实现,头疼的是这个崩溃只有一台手机上会出现。在 JNI_OnLoad 方法中加了日志,发现没有打印。创建新的动态库,发现可以正常调用,只有这个动态库有问题。在组长的提示下,修改了动态库名称,发现正常了。原先动态库的名称是 utils 应该是和系统其他
2021-04-04 10:44:15
581
原创 Android Studio 动态调试apk
一、什么是动态调试其实是动态调试 Smail文件 ,一种逆向分析的方式,通过 jdwp 调试相关进程。一般在做竞品分析时会用到类似的手段。Android studio支持apk分析,所以操作起来还是比较简单的。二、前期准备2.1 使apk可调试正常情况下release包是不允许调试的,所以必须先让apk可调试,一般有两种方法:使用 apktool 工具反编译apk,修改 AndroidManifest.xml 文件,然后再重签名二次打包: <!-- application标签加上a
2021-03-21 20:16:46
1549
原创 Android 通知栏
不同版本通知栏的创建方式不尽相同,当前官方推荐使用 NotificationCompat 相关的API,兼容到Android 4.0,但是部分新功能,比如内嵌回复操作,旧版本是无法支持的。一、设置通知内容 //CHANNEL_ID,渠道ID,Android 8.0及更高版本必须要设置 NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID) //设置小图标
2021-03-14 23:23:29
184
原创 MPAndroidChart 修改柱状图高亮效果
MPAndroidChart 默认的选中背景如下:只是颜色加深,然后设计想要实现下面这种效果:类似阴影效果,且显示的宽度需要增加。一、MPAndroidChart 是否支持查看该框架对外的接口,发现下面两个方法: BarDataSet set1 = new BarDataSet(yValues, ""); set1.setHighLightColor(ContextCompat.getColor(this, R.color.black)); set1.setHighLightAlpha(4
2021-03-07 19:20:29
989
1
原创 MPAndroidChart 自定义 MarkerView
MarkerView 顾名思义就是标记视图,点击图表上的数值时一般都需要一个提示框用于显示数值,MPAndroidChart 也提供了对应的接口,setMarker(MarkerView)。效果图如下:这边画的比较简陋,布局可以自定义:一、绘制图表堆叠柱状图的实现可以参考我的另外一篇文章,MPAndroidChart实现堆叠柱状图。二、自定义 MarkerViewpublic class MyMarkView extends MarkerView { private TextView tv
2021-02-28 10:58:03
1357
原创 enum 实现 Parcelable 接口
Parcelable是Android提供的序列化接口,对比Serializable它的使用方式更为复杂,但是效率更高,经常用于AIDL通信等。一、Parcelable基本实现//实现 Parcelable接口public class Person implements android.os.Parcelable { private int age; private String na...
2021-02-21 20:25:03
85
原创 enum实现Parcelable接口
Parcelable是Android提供的序列化的接口,对比Serializable它的使用方式更为复杂,但是效率更高,经常用于AIDL通信等。一、Parcelable基本实现//实现 Parcelable接口public class Person implements android.os.Parcelable { private int age; private String name; @Override public int describeContents() {
2021-02-21 20:22:12
683
原创 Android Room 使用
官网介绍:https://developer.android.google.cn/training/data-storage/roomRoom 是在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库。Room 包含 3 个重要部分:数据库:包含数据库持有者,并作为应用已保留的持久关系型数据的底层连接的主要接入点。Entity:表示数据库中的表。DAO:包含用于访问数据库的方法。基本使用步骤:1、导入配置dependencies {
2021-02-17 16:46:12
149
1
原创 MPAndroidChart 实现堆叠柱状图
效果图如下:微信截图_20210210215434.png一、导入MPAndroidChartrepositories { maven { url 'https://jitpack.io' }}dependencies { implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'}二、布局中使用Ba...
2021-02-13 20:48:23
83
原创 MPAndroidChart实现堆叠柱状图
效果图如下:一、导入MPAndroidChartrepositories { maven { url 'https://jitpack.io' }}dependencies { implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'}二、布局中使用BarChart <com.github.mikephil.charting.charts.BarChart android:layout_width=
2021-02-13 20:46:13
1301
1
原创 Android ContentProvider 基本使用
ContentProvider 虽然是Android四大组件之一,但是对比其他组件,出场频率的确是低了一些。不过它在一些场合上还是非常好用的,比如跨进程传输数据,接下来介绍下它的基本使用。一、创建ContentProvider自定义一个类继承ContentProvider:public class TestProvider extends ContentProvider { @Override public boolean onCreate() { return true; }
2021-02-06 20:09:43
530
原创 Android 启动页重复创建问题
最近开发中遇到一个问题,复现流程大概是这样:启动页 -》首页 -》退到后台,休眠一段时间 -》重新点击APP,进入到首页启动页跳转到首页的时候会直接销毁这个时候看日志发现了一个奇怪的地方,MainActivity 竟然有两个。然后加了一些辅助日志后发现,第二个 MainActivity 是启动页跳转过来的,也就是说APP休眠唤醒后,虽然直接显示在首页,但是会重新打开启动页,从而导致首页重复创建。但奇怪的是,我这个时候点击返回键,并不会像预想的一样回退到另一个 MainActivity,百思不得
2021-02-06 16:32:32
611
原创 Android fragment 重复创建问题
如何显示Fragment基本有两种方式:replaceFragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction transaction = fragmentManager.beginTransaction();transaction.replace(R.id.fl_container, currentFragment).commit();多个 fragment 互相切换时,本质上
2021-01-31 15:37:10
2136
原创 Android 切换系统语言
切换系统语言分为下面两个步骤:1. 创建不同语言资源;2. 替换当前页面 Context 所持有的资源;一、创建不同语言资源创建步骤如下:二、替换资源界面需要重新创建,使用 recreate(); 或者 重新打开界面。 在 attachBaseContext(Context) 方法中替换Context的资源。 //可以在 BaseActivity 中使用 @Override protected void attachBaseContext(Contex
2021-01-24 22:01:07
2649
原创 Android 软键盘
软键盘弹出和隐藏弹出软键盘:InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);inputManager.showSoftInput(editText, 0);隐藏软键盘:InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INP
2021-01-24 20:07:38
284
原创 JNI 静态注册与动态注册
一、JNI 注册方式1.1 静态注册原理:根据函数名来建立 java 方法与 JNI 函数的一一对应关系;实现流程:编写 java 代码;public class TestNdkTools { static { System.loadLibrary("ndkdemotest-jni"); } //声明native方法,主要是native关键字 public static native String getStringFromNdk();}利用 javah 指
2020-07-02 20:36:55
368
原创 Android Studio信息大全
一、Android Studio下载地址官网地址:https://developer.android.com/studio国内下载地址:http://www.android-studio.org/index.php/download/hisversion历史版本下载地址:https://developer.android.google.cn/studio/archive.html#android...
2020-03-29 20:24:46
35
原创 Android识别多点触控
正常开发中,单点触控场景遇到的比较多,比如识别 ACTION_DOWN、ACTION_UP、ACTION_MOVE 事件等。接下来我要介绍的是如何识别多点触控,即多个手指触摸屏幕。一、MotionEvent事件的分类官方文档:https://developer.android.com/training/gestures/multi?hl=zh_cn属性说明:ACTION_DOWN:轻触屏...
2019-11-27 09:28:59
97
原创 Android自定义Gradle插件
一、Gradle介绍gradle是Android Studio默认的构建工具,它不仅继承了maven中仓库,坐标,依赖这些核心概念,还继承了ant中target的概念,可定义自己的任务task。在build.gradle文件中我们可以看到下面的代码:apply plugin: 'com.android.application''com.android.application' 就是插...
2019-03-13 23:34:15
209
原创 Android NDK开发
参考:Android JNI(一)——NDK与JNI基础NDK 入门指南Android NDK开发(一) 入门向您的项目添加 C 和 C++ 代码https://developer.android.com/studio/projects/add-native-code#configure-gradle一、概述原生开发工具包 (NDK:Native Develop Ki...
2018-12-21 15:01:22
307
原创 Android实现HTTPS请求
参考:聊聊 Android HTTPS 的使用姿势https://developer.android.com/training/articles/security-sslhttps://developer.android.com/reference/java/net/HttpURLConnectionHTTPS关于HTTPS的介绍可以参考我的另一篇文章,HTTPS和SSLA...
2018-12-19 16:56:10
6813
原创 HttpURLConnection源码解析
参考:HttpURLConnection 源码分析Android 网络(三) HttpURLConnection OkHttpOKHttp源码解析概述在Android应用中大都会使用Http协议来访问网络, Android主要提供了两种方式(HttpURLConnection、HttpClient)来进行Http操作,具体选择哪种可以参考Android访问网络,使用HttpUR...
2018-12-19 14:40:07
2318
4
原创 Android通过Socket实现TCP、UDP通信
参考:《深入理解Android网络编程》https://www.jianshu.com/p/089fb79e308b一、TCP,UDP基本介绍1. TCP传输控制协议(Transmission Control Protocol,TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP的可靠体现在它的三次握手和四次挥手上,不熟悉的可以参考下我的另外一篇文章,HTTP请...
2018-12-18 15:19:56
3161
原创 HTTP代理模式学习
强烈推荐下这篇文章,把代理模式说的很清楚了。这里我自己整理了一下并添加了一些其他的内容。常用的代理技术分为正向代理,反向代理和透明代理。一、正向代理正向代理是一个位于客户端【用户A】和原始服务器【服务器B】之间的服务器【代理服务器Z】,为了从原始服务器取得内容,用户A向代理服务器Z发送一个请求并指定目标(服务器B),然后代理服务器Z向服务器B转交请求并将获得的内容返回给客户端。其中原始...
2018-12-13 18:46:57
2001
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人