
android学习
文章平均质量分 69
francisHuang
这个作者很懒,什么都没留下…
展开
-
xlog使用
对移动开发者来说,最头疼的莫过于线上出现问题,本地无法复现又没有任何日志的场景。但是考虑到应用性能,日志又原创 2022-02-16 10:59:23 · 7535 阅读 · 1 评论 -
Android 适配深色模式
Android 深色模式适配Android 10 开始支持配置深色模式,如果系统是深色主题,但是打开APP又是浅色主题就会显得格格不入。下面介绍几种适配深色模式的方法。一、forceDarkAllowed样式中设置 android:forceDarkAllowed 属性,深色主题下系统会自动进行适配。新建 values-v29 目录,因为 android:forceDarkAllowed 属性 Android 10开始才有。设置 android:forceDarkAllowed 属性为tr原创 2021-12-19 21:41:06 · 12688 阅读 · 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 · 660 阅读 · 0 评论 -
Android 屏幕适配
Android 屏幕适配Android设备多种多样,有着不同的屏幕尺寸和像素密度,大大增加了适配的难度。一、基本单位介绍介绍下Android UI中常见的几个单位。pxpx 就是像素点,是屏幕物理上最小显示单位,如手机分辨率 1080 x 1920 表示宽有1080 像素点,高有1920 像素点。分辨率高的屏幕上面像素点(色块)就多,所以屏幕内可以展示的画面就更细致。但是布局的时候不能直接使用px作为单位,因为在不同分辨率的手机上,展示大小会不一样。可以看到相同的px,在不同分辨率上显示的宽原创 2021-09-08 18:03:01 · 328 阅读 · 0 评论 -
Android 实现拖放控件
类似微信朋友圈删除图片效果,示例如下:Android 拖放框架 ,可以让用户使用图形化拖放手势移动数据。监听拖放过程实现 View.OnDragListener 的拖动事件监听器或其 onDragEvent(DragEvent) 回调方法来接收拖动事件。DragEvent 操作类型getAction() 值含义ACTION_DRAG_STARTED当应用调用 startDrag() 并获取拖动阴影后,视图对象的拖动事件监听器会立即收到此事件操作类型。ACTION_DRA原创 2021-07-28 18:23:01 · 1236 阅读 · 0 评论 -
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 · 2616 阅读 · 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 · 3200 阅读 · 2 评论 -
Android 权限申请
https://www.jianshu.com/p/24f79a70025bAndroid的应用权限有助于保护用户隐私,访问一些敏感数据例如原创 2021-05-30 16:28:43 · 2242 阅读 · 2 评论 -
Android修改Dialog样式
Android 对话框支持自定义标题,内容,按钮和点击事件,基本上可以满足我们日常的使用。但有时候我们想要修改对话框的文字,按钮颜色等,系统并没有提供对应的方法,正常情况下只能自定义布局。接下来通过源码解析介绍几种修改 Dialog样式的方法。一、Dialog源码解析...原创 2021-05-23 16:26:29 · 626 阅读 · 0 评论 -
Android 数据存储
一、数据存储方式介绍Android 使用的文件系统类似于其他平台上基于磁盘的文件系统。该系统为您提供了以下几种保存应用数据的选项:应用专属存储空间:存储仅供应用使用的文件,可以存储到内部存储卷中的专属目录或外部存储空间中的其他专属目录。使用内部存储空间中的目录保存其他应用不应访问的敏感信息。共享存储:存储您的应用打算与其他应用共享的文件,包括媒体、文档和其他文件。偏好设置:以键值对形式存储私有原始数据。数据库:使用 Room 持久性库将结构化数据存储在专用数据库中。下表汇总了这些选项的特点:原创 2021-04-23 21:58:29 · 828 阅读 · 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 · 485 阅读 · 0 评论 -
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 · 810 阅读 · 0 评论 -
JNI异常找不到native方法的实现
今天遇到了一个很奇怪的问题,调用 native 方法时,报了下面这个错误:java.lang.UnsatisfiedLinkError: No implementation found for 方法就如同字面上的意思,找不到该 native 方法的实现,头疼的是这个崩溃只有一台手机上会出现。在 JNI_OnLoad 方法中加了日志,发现没有打印。创建新的动态库,发现可以正常调用,只有这个动态库有问题。在组长的提示下,修改了动态库名称,发现正常了。原先动态库的名称是 utils 应该是和系统其他原创 2021-04-04 10:44:15 · 675 阅读 · 0 评论 -
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 · 1634 阅读 · 0 评论 -
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 · 233 阅读 · 0 评论 -
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 · 1144 阅读 · 1 评论 -
MPAndroidChart 自定义 MarkerView
MarkerView 顾名思义就是标记视图,点击图表上的数值时一般都需要一个提示框用于显示数值,MPAndroidChart 也提供了对应的接口,setMarker(MarkerView)。效果图如下:这边画的比较简陋,布局可以自定义:一、绘制图表堆叠柱状图的实现可以参考我的另外一篇文章,MPAndroidChart实现堆叠柱状图。二、自定义 MarkerViewpublic class MyMarkView extends MarkerView { private TextView tv原创 2021-02-28 10:58:03 · 1591 阅读 · 0 评论 -
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 · 790 阅读 · 0 评论 -
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 · 196 阅读 · 1 评论 -
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 · 1441 阅读 · 1 评论 -
Android ContentProvider 基本使用
ContentProvider 虽然是Android四大组件之一,但是对比其他组件,出场频率的确是低了一些。不过它在一些场合上还是非常好用的,比如跨进程传输数据,接下来介绍下它的基本使用。一、创建ContentProvider自定义一个类继承ContentProvider:public class TestProvider extends ContentProvider { @Override public boolean onCreate() { return true; }原创 2021-02-06 20:09:43 · 574 阅读 · 0 评论 -
Android 启动页重复创建问题
最近开发中遇到一个问题,复现流程大概是这样:启动页 -》首页 -》退到后台,休眠一段时间 -》重新点击APP,进入到首页启动页跳转到首页的时候会直接销毁这个时候看日志发现了一个奇怪的地方,MainActivity 竟然有两个。然后加了一些辅助日志后发现,第二个 MainActivity 是启动页跳转过来的,也就是说APP休眠唤醒后,虽然直接显示在首页,但是会重新打开启动页,从而导致首页重复创建。但奇怪的是,我这个时候点击返回键,并不会像预想的一样回退到另一个 MainActivity,百思不得原创 2021-02-06 16:32:32 · 726 阅读 · 0 评论 -
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 · 2345 阅读 · 0 评论 -
Android 切换系统语言
切换系统语言分为下面两个步骤:1. 创建不同语言资源;2. 替换当前页面 Context 所持有的资源;一、创建不同语言资源创建步骤如下:二、替换资源界面需要重新创建,使用 recreate(); 或者 重新打开界面。 在 attachBaseContext(Context) 方法中替换Context的资源。 //可以在 BaseActivity 中使用 @Override protected void attachBaseContext(Contex原创 2021-01-24 22:01:07 · 2811 阅读 · 0 评论 -
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 · 328 阅读 · 0 评论 -
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 · 418 阅读 · 0 评论 -
自定义编译时注解框架完善Android模块间通信参数获取过程
这里为了加深对编译时注解框架的使用同时为了完善之前Android模块间通信参数的获取过程,决定自己写一个简单的编译时注解框架,主要是替代getIntent().getExtras().getSerializable获取参数代码的编写。感兴趣的朋友可以先浏览之前的Android模块化学习和Android编译时注解项目学习。详细代码路径点这里。回顾一下编译时注解框架的大致流程:(1)编写注解代码(2)...原创 2018-04-04 22:38:20 · 435 阅读 · 0 评论 -
Android编译时注解项目学习
前几天在学习Android模块化的时候,对注解有了新的理解,对于模块间通信的问题,可以利用动态代理,反射来获取运行时注解的参数,进而拼接成完整的Uri请求,从而实现不同模块间界面的跳转。感兴趣的朋友可以点击这里。大多数情况下,跳转界面时都会携带一些简单的参数,为了优化这个过程,打算利用编译时注解的技术,类似butterknife,免去获取参数的一系列繁琐的代码。强烈建议先看鸿洋大神的Android...原创 2018-03-21 17:33:09 · 360 阅读 · 0 评论 -
Android模块化学习
参考:Android模块化探索与实践强烈建议先看上面博客,写的十分优秀,为我理解模块化,和真正实践起到了很大的帮助。我的这篇文章仅是我自己的学习笔记,一个知识点如果只是看过那很快就会从大脑中遗忘,我更喜欢自己去写demo,做笔记,这样不仅对我理解这个知识点有很大的帮助,同时在脑中的记忆也更深刻,即便一段时间我有所遗忘,只要翻开自己的笔记也很快可以回忆起。一、模块化分层设计模块化的好处:多团队并行开...原创 2018-03-15 18:40:27 · 639 阅读 · 0 评论 -
解决ScrollView嵌套RecyclerView无法滑动的问题
通过View事件的拦截方法解决ScrollView嵌套RecyclerView无法滑动的问题前提:这里先介绍两个View的方法onInterceptTouchEvent方法(只有ViewGroup才有) 返回true: 代表对事件进行拦截, 拦截后事件就无法传到子View中, 也就是无法调用子View的onTouchEvent等方法, 返回false: 代表不对事件进行拦截, 子View可以接原创 2017-11-27 21:04:54 · 6745 阅读 · 0 评论 -
Android使用Gradle配置构建变体
使用Gradle配置构建变体在一些特殊的情况下,我们可能需要一个应用提供不同的版本配置,但如果为每一个版本都新建一个新的项目管理就显得十分没有必要,这里我们就可以使用Gradle来配置不同的版本。 这里参考的是Android官网上配置构建变体内容; 这里我们先新建一个Android项目,观察项目中的build.gradle文件。主要是在android {} 代码块内部创建和配置构建类型,其中de原创 2017-12-10 18:03:48 · 614 阅读 · 0 评论 -
Fragment界面缓存问题
Fragment界面缓存问题在上一篇博客中, 记录了Fragment中的两个问题, 1.使用replace替换FragmentB时,editext必须显示我给的默认值。 2.当我显示FragmentB时,点击home键,再打开应用时必须保留EditText修改后的值。由于Fragment界面缓存问题, 对界面的修改无法放在onCreateView和onActivityCreated方法中, 因原创 2017-12-01 17:33:38 · 1551 阅读 · 0 评论 -
Fragment显示问题
Fragment显示问题,界面缓存及设置默认值问题最近遇到了一个关于Fragment的显示问题。我的需求是这样的,在一个Activity中我有两个按钮A和B分别控制FragmentA和FragmentB的显示, FragmentB中有一个EditText,当我显示FragmentB时会传一个值给EditText用于默认显示。 我现在的要求是: 1.使用replace替换FragmentB时,e原创 2017-11-29 23:08:09 · 645 阅读 · 0 评论 -
macaca安卓自动化测试搭建
文档:https://macacajs.com/zh/introductionhttps://github.com/alibaba/uirecorder/blob/master/README_zh-cn.mdMacaca 是一套面向用户端软件的测试解决方案,提供了自动化驱动,环境配套,周边工具,集成方案,旨在解决终端上的测试、自动化、性能等方面的问题。Macaca 支持主流的移动技术平台 iOS,...原创 2018-06-16 21:53:54 · 1578 阅读 · 0 评论 -
安卓PopupWindow的基本使用及填坑
安卓PopupWindow的基本使用及填坑PopupWindow用来实现一个弹出框,可以使用任意布局的View作为其内容,这个弹出框是悬浮在当前activity之上的。很早之前就使用过,不过并没有做记录,如今再次使用依然是各种百度,好记性不如烂笔头。基本使用: View popView = getLayoutInflater().inflate(R.layout.menu_searc...原创 2018-07-12 19:34:39 · 1568 阅读 · 0 评论 -
Retrofit基本使用和源码分析
官网:https://square.github.io/retrofit/参考:https://blog.youkuaiyun.com/lmj623565791/article/details/513042041.基本使用(1)定义一个API接口public interface GitHubService { @GET("users/{user}/repos") Ca...原创 2018-09-11 20:39:26 · 284 阅读 · 0 评论 -
Android中的AOP编程
一、什么是AOPAOP是Aspect Oriented Programming的缩写,即面向切面编程。平时我们接触比较多的是OOP,即面向对象编程。OOP提倡的是将功能模块化,对象化,每个模块专心于自己的事情。但是有些功能是每个模块都需要的,比如日志模块,性能监控模块,按照我们平常的做法就是每个模块中再各自加上这些功能代码,这样做一方面显得代码很冗余,另一方面也不利于后期的拓展和维...原创 2018-12-13 11:03:32 · 675 阅读 · 0 评论 -
抓包工具介绍
抓包工具有很多,包括tcpdump,Charles和Wireshark,接下来逐个进行分析TcpdumpTcpdump用于Linux系统,由于安卓系统也是基于Linux的,所以也是可以使用它进行抓包。不过有下面两个前提条件:手机必须有root权限 手机必须导入Tcpdump,使用方法下载Tcpdump工具包,有一点要注意,这个工具包必须要符合你手机的cpu架构,比如ARM或者x...原创 2018-12-13 15:13:12 · 1123 阅读 · 0 评论 -
HttpURLConnection源码解析
参考:HttpURLConnection 源码分析Android 网络(三) HttpURLConnection OkHttpOKHttp源码解析概述在Android应用中大都会使用Http协议来访问网络, Android主要提供了两种方式(HttpURLConnection、HttpClient)来进行Http操作,具体选择哪种可以参考Android访问网络,使用HttpUR...原创 2018-12-19 14:40:07 · 2446 阅读 · 4 评论 -
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 · 7243 阅读 · 0 评论