Android开发
文章平均质量分 74
feng海涛
这个作者很懒,什么都没留下…
展开
-
Android性能优化(四):内存优化
Android性能优化(四):内存优化前言在讲内存优化之前,我们先讲一下GC回收机制。Java相比于C语言不同的地方在于,Java不需要手动释放对象内存,JVM中的垃圾回收器会自动回收。但是这种自动回收是会出错的,而这种出错就会导致内存的泄漏。1.垃圾回收1.1 什么是垃圾?Java中的垃圾是指在内存中没有被调用的对象。JVM中使用“可达性分析”的算法来判断对象是否可以被回收。通过一组名为“GC Root”的对象作为起点,直接或者间接被“GC Root”引用的为不可回收对象,否则为可回收对象。如下原创 2020-07-14 19:08:31 · 504 阅读 · 0 评论 -
Android性能优化(三):响应优化
Android性能优化(三):响应优化1、为什么要进行响应优化?我在[布局优化]的文章中说过,Android系统每隔16ms会发出一个VSYNC信号来触发UI的渲染,如果在16ms内不能完成UI的渲染,界面就出现卡顿的情况。页面如果5秒钟之内无法响应屏幕触摸事件或者键盘输入事件就会出现ANR,而BroadcastReceiver如果10秒钟之内还未执行完操作也会出现ANR。为了避免ANR,我们需要进行响应速度的优化。(https://blog.csdn.net/weixin_42574892/artic原创 2020-07-07 10:11:10 · 1167 阅读 · 0 评论 -
Google针对非 SDK 接口的限制
最近在项目中遇到一个问题,非系统签名应用预装到android sdk为28的系统vender或者system分区下,调用隐藏api时,程序崩溃。报错信息如下:主要原因在于: Accessing hidden method Landroid/view/RenderNode;>getClipToOutline(),不能访问隐藏的getClipToOutline()方法。预装到系统的应用为什么会受到这种限制呢?从 Android 9(API 级别 28)开始,Android 平台对应用能使用的非 SDK 接口实原创 2022-07-11 14:31:44 · 3302 阅读 · 1 评论 -
Paging3 分页库的使用
Paging3 分页库的使用及踩坑经历简介Paging 库可帮助您加载和显示来自本地存储或网络中更大的数据集中的数据页面。此方法可让您的应用更高效地利用网络带宽和系统资源。Paging库分为Paging2和Paging3,因为Paging2使用不太友好,这里着重介绍Paging3。使用Paging3的优势分页数据的内存中缓存。该功能可确保您的应用在处理分页数据时高效利用系统资源。内置的请求重复信息删除功能,可确保您的应用高效利用网络带宽和系统资源。可配置的 RecyclerView 适配器,原创 2022-05-17 16:01:43 · 1550 阅读 · 0 评论 -
Android ViewBinding使用及原理
Android ViewBinding使用及原理一、定义ViewBinding主要是Google用来findViewById的,作用跟Butterknife差不多。只不过Butterknife是通过扫描注解生成相应代码,而ViewBinding是通过扫描layout布局文件生成相应代码。而且ViewBinding是Google开发,深度集成在idea上。二、使用在模块build.gradle文件中添加配置:android { ... viewBinding{ ena原创 2022-01-05 16:25:50 · 4466 阅读 · 0 评论 -
Android 反编译Apk修改资源文件并重新打包
Android 反编译Apk修改资源文件并重新打包 当前文章只是讲解如何修改资源文件再打包,Java文件修改暂时不支持。一 、工具介绍apktool : 用来反编译apk,以及重新打包;signapk.jar :用于签名,将重新打包的apk签名;Jadx-gui:用于查看源码,可以用其他查看源码的工具代替。二、工具使用apktool的使用将需要反编译的apk放到apktool工具的根目录。然后进入到apktool工具根目录,输入指令:apktool d -f [待反编译的ap原创 2021-11-01 16:58:25 · 5858 阅读 · 0 评论 -
无障碍服务AccessibilityService详解
无障碍服务什么是无障碍?为什么需要无障碍?让应用使用起来没有障碍。Android应用的目标是让所有人都可以使用,包括但不限于视力受损、色盲、听力受损、精细动作失能的人。要想这些有无障碍需求的用户有更好的体验,那么开发应用就要多考虑无障碍功能。Android无障碍服务无障碍服务是 Android框架的一项功能,旨在为了给使用Android设备的残障人士提供交互反馈,让他们能够更方便的使用Android设备。常见无障碍服务示例开关访问:允许行动不便的 Android 用户使用一个或多个开关与设备进原创 2021-09-14 15:22:45 · 16100 阅读 · 1 评论 -
Android 用广播监听home键
Android 用广播监听home键最近有需求要监听home,网上找了几个方法都不行,不知道是不是过时了。只有用广播监听的才可以,但是好像只能监听,不能拦截。1.新建广播类HomeKeyReceiver.java;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.util.Log;/** * @author原创 2021-07-29 21:07:30 · 983 阅读 · 0 评论 -
ContentObserver监听系统属性变化
ContentObserver监听系统属性变化有时候我们需要监听系统属性变化,或者通过修改系统属性的值来通知其它应用做相应的操作。以无障碍服务的属性为例,通过ContentObserver监听其变化:Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES1、新建MyContentObserver.java类继承ContentObserver;import android.database.ContentObserver;import android.os.H原创 2021-07-19 19:43:34 · 3422 阅读 · 1 评论 -
Android 绘制产生重影(重叠)
Android 绘制产生重影(重叠)今天遇到一个比较奇葩的问题,控件设置的文字、背景、图片等一直重叠在一起,不刷新的问题。如TextView控件,调用setText()方法时,新的文字会覆盖在旧的文字上面,旧的文字没有消失,就这样一直覆盖,最后变成一坨。设置背景也是一样,不断调用setBackgroundResource()方法,背景会一层一层覆盖。后面才发现是页面背景导致的,当你的页面背景设置为null时,没有背景就会出现这个问题。我的页面代码是这样的:<?xml version="1.0"原创 2020-08-31 20:40:44 · 4620 阅读 · 1 评论 -
AS运行main()方法报错:SourceSet with name ‘main‘ not found
AS运行main()方法报错:SourceSet with name ‘main’ not found记录一下在AS上运行Java文件的main()方法时报错,报错如下:解决方法:在.idea文件夹下的gradle.xml文件中添加<option name="delegatedBuild" value="false" />,然后重新运行就可以了......原创 2020-08-10 13:53:46 · 29253 阅读 · 28 评论 -
Java反射以及简单应用
Java反射以及简单应用1.什么是反射机制?Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。2.什么是字节码文件?.java文件经过虚拟机编译成.class文件,也叫字节码文件。对于一个字节码文件.class,虽然表面上我们对该字节码文件一无所知,但该文件本身却记原创 2020-08-08 14:18:24 · 854 阅读 · 0 评论 -
Android IPC(跨进程通信)之AIDL
Android IPC(跨进程通信)之AIDLIPC——跨进程通信,是指两个进程之间的数据交换过程。在说IPC的同时我们要知道什么是进程,什么是线程。线程是CPU调度的最小单元,进程可以理解为一个程序或者一个应用。一个进程中可以运行多个线程,而在Android程序中有一个主线程,也叫UI线程。在Android上,一个应用代表一个进程,当你运行应用的是时候,Android会为你分配一个独立的虚拟机,这也就相当于给你分配一块独立的内存,程序中使用的对象以及数据可以在这里共享的。但当你开启多进程时,这个进程的原创 2020-08-01 14:44:17 · 2085 阅读 · 2 评论 -
Android实现文字滚动播放效果
Android实现文字滚动播放效果在开发时,我们会遇到文字过长,TextView不能完全展示,但又不想文字换行展示,这样有时会影响美观。这时我们就需要文字滚动播放,让用户可以看到所有的文字。话不多说,直接上代码:import android.content.Context;import android.util.AttributeSet;import android.widget.TextView;public class MarqueTextView extends TextView {原创 2020-07-23 10:02:38 · 4982 阅读 · 0 评论 -
Android性能优化(二):UI布局优化
Android性能优化(二):UI布局优化一、前言人眼在看画面时,画面帧率高于每秒10-12帧(即每秒播放10-12张图片)的时候,就会认为是连贯的。一般电影的拍摄及播放帧数是每秒24帧。按道理说,画面帧率越高,用户体验越好,但这也代表着成本越高。Android APP的性能标准是60fps,即1秒之内要达到60帧,这样我们就只有1000/60 = 16 毫秒的时间来处理任务。Android系统每隔16ms会发出一个VSYNC信号来触发UI的渲染。如果在16ms内不能完成UI的渲染,界面就出现卡顿的情原创 2020-06-04 17:12:41 · 1394 阅读 · 0 评论 -
解决AS编译报错:Failed to apply plugin [id com.android.application]
解决AS编译报错:Caused by: org.gradle.api.internal.plugins.PluginApplicationException: Failed to apply plugin [id ‘com.android.application’]编译Android项目时总是遇到以上报错,所以记录一下。解决方法:添加android.overridePathCheck=true就可以了。其实解决的方法可以在Event Log窗口中找到,如图下:从日志第一句可以看出,应该是项目路径包原创 2020-05-25 08:30:25 · 82038 阅读 · 13 评论 -
Android在页面设置背景图片
Android在页面设置背景图片在页面上设置背景,不需要在布局中设置。在onCreate方法中加入代码:getWindow().setBackgroundDrawableResource(R.drawable.a);R.drawable.a为res资源文件夹下的资源图片a原创 2020-05-21 13:46:28 · 5827 阅读 · 3 评论 -
Android性能优化(一):APP启动优化
App启动的方式有三种: 1. 冷启动:App没有启动过或App进程被killed, 系统中不存在该App进程, 此时启动App即为冷启动。 2. 热启动:热启动意味着你的App进程只是处于后台, 系统只是将其从后台带到前台, 展示给用户。 3. 介于冷启动和热启动之间, 一般来说在以下两种情况下发生: (1)用户back退出了App, 然后又启动, App进程可能还在运行,但是activity需要重建。 (2)用户退出App后, 系统可能由于内存原因将App杀死, 进程和activity都.原创 2020-05-20 13:41:57 · 2455 阅读 · 0 评论 -
Android实现APP黑白化
Android实现APP黑白化使用硬件加速的方法来达到黑白化效果。先上效果图吧黑白化之前:黑白化之后:实现代码:Paint mPaint = new Paint();ColorMatrix cm = new ColorMatrix();cm.setSaturation(0);mPaint.setColorFilter(new ColorMatrixColorFilter(cm));getWindow().getDecorView().setLayerType(View.LAYER_T原创 2020-05-15 18:00:16 · 4196 阅读 · 0 评论 -
Android屏幕适配(二):AutoSize今日头条屏幕适配方案
Android屏幕适配(二):AutoSize今日头条屏幕适配方案AutoSize是今日头条使用的屏幕适配方案。原理:调用Android API,根据设备某一维度(宽或高)的真实长度(单位是px)与这一维度在UI设计图上的dp值之间的关系,重新计算density来实现。优点:1.支持以宽或者高任意一个维度去适配,保持该维度上和设计图一致;2.支持dp和sp单位,控制迁移成本到最小。集成方法:1.添加gradle配置代码:implementation 'me.jessyan:autosize:1原创 2020-05-15 10:23:36 · 5239 阅读 · 4 评论 -
Android屏幕适配(一):ScreenMatch官方屏幕适配方案
Android ScreenMatch官方屏幕适配方案Screenmatch屏幕适配是Google退出的适配方法,只需要使用官方的Screenmatch插件。原理:Screenmatch是拿dp值来进行等比例缩放来适配的。根据你的配置生成需要适配的屏幕尺寸的dimens.xml文件,运行时,系统会找到对应尺寸的dimens.xml文件。优点:1.对文字缩放更友好;2.可以一键生成需要适配的尺寸;1、在AS中点击File→Settings,找到Plugins输入screenmatch安装ScreenM原创 2020-05-14 13:59:46 · 5586 阅读 · 0 评论 -
Android Q读写共享目录媒体文件
Android Q读取公共目录媒体文件有些人通过文件名称去查找公共目录下媒体文件却获取不到,可能是由于查询条件写错了。注意下MediaStore.Video.Media.DISPLAY_NAME 参数,我用MediaStore.Video.Media.BUCKET_DISPLAY_NAME这个就查询不到,具体这两个有什么不同,可以自己去查资料。1.读取公共目录下的图片/** * 读......原创 2020-04-29 15:26:28 · 3628 阅读 · 4 评论 -
Android多渠道打包
Android多渠道打包Android多渠道打包就是一次性打出多个不同命名的apk。我这里是使用Android Studio3.6版本打包的,低版本的可能有点差异。先上效果图吧:1.在androidManifest.xml中进行配置。<meta-data android:name="CHANNEL" android:value="${CHANNEL_VALUE}"/&......原创 2020-04-24 14:00:58 · 1068 阅读 · 2 评论 -
Android将so库封装到jar包中并加载其中的so库
Android将so库封装到jar包中并加载之前写过将jar包和so库封装到jar包中的文章,但是没有考虑别人调用时需要加载so库的问题。因为so库放入jar之后,so就不是一个独立的.so文件了,用System.load()加载就会提示找不到这个库,所以要想加载这个so 就需要把so 从jar 中提取出来,保存为临时文件,然后再加载。但是不能直接提取.so文件,需要把.so文件改成.jet文件......原创 2020-04-23 15:37:10 · 7301 阅读 · 21 评论 -
Android热点、WiFi、蓝牙等功能开启和关闭
Android热点、WiFi、蓝牙等功能开启和关闭1、需要添加权限,选择自己需要的添加,热点的开启和关闭可能还需要权限;<!--设备(亮屏)权限--><user-permission android:name="android.permission.DEVICE_POWER" /><!--息屏权限--><uses-permission andro......原创 2020-04-09 11:11:22 · 5665 阅读 · 0 评论 -
Android中socket通信简单实现
Android中socket通信简单实现socket通信需要有一个服务器和客户端,可以把同一个APP作为服务器跟客户端,也可以分开成两个APP。先上个图:这里以一个APP作为服务器跟客户端为示例1、添加网络访问权限<uses-permission android:name="android.permission.INTERNET" />2、写服务器,在APP上启动im......原创 2020-04-02 15:29:10 · 15711 阅读 · 5 评论 -
Android 在应用中使用用户凭证(PIN码、密码)
Android 在应用中使用用户凭证(PIN码、密码)在Android开发过程需要使用到用户凭证来验证用户身份,验证成功用户才能继续操作。需要注意的是:minSdkVersion 必须大于或等于23,否则APP会报错。先上效果图(在30s内不操作,点击确认按钮需要进行身份验证):以下是activity代码import android.app.Activity;import androi......原创 2020-02-18 09:27:02 · 5132 阅读 · 0 评论 -
Android如何使用自定义字体
Android使用自定义字体有时候开发需要使用多种字体样式,使界面更加的好看,但是APP开发中一般使用的是Android的默认字体。如何使用自定义字体呢?先看效果图,使用了3种字体:实现方法1.把下载的字体放到assets资源文件夹中;2.在代码中加载指定字体;import android.graphics.Typeface;import android.support.v7.a...原创 2020-02-13 16:05:27 · 843 阅读 · 0 评论 -
Android动态申请权限(一次申请多个动态权限)
Android动态申请权限(一次申请多个动态权限)Android 6.0也就是API等级23之后,获取权限需要动态申请,否则程序无法正常使用。录像需要多个权限,下面是一次申请多个权限的代码,单个权限申请也是差不多的:package com.barrage.barragetest;import android.Manifest;import android.content.DialogI...原创 2019-07-08 15:46:24 · 11021 阅读 · 2 评论 -
Android应用层读写设备节点
Android应用层如何读写设备节点1、什么是设备节点(设备文件)?Linux中设备节点是通过“mknod”命令来创建的。一个设备节点其实就是一个文件,Linux中称为设备文件。有一点必要说明的是,在Linux中,所有的设备访问都是通过文件的方式,一般的数据文件程序普通文件,设备节点称为设备文件。所以读写设备节点即读取更改文件数据。2、读取设备节点例如节点路径为:/sys/wenjian/...原创 2019-07-13 15:20:33 · 7958 阅读 · 6 评论 -
如何对APK进行反编译查看相关代码
如何对APK进行反编译查看相关代码反编译只能用于一般的没有进行过加固的APK,如果是加固过的APK需要进行脱壳等处理,这种博主暂时也还没研究过。对apk进行反编译并查看代码需要两款工具:dex2jar 和 jd-gui 。我已经把两款工具上传到github上,可以通过以下链接下载:https://github.com/HaiTaoFeng/Tool下面介绍下这两款工具的作用:dex2j.........原创 2019-07-10 15:03:15 · 7666 阅读 · 1 评论 -
Android开发类似直播APP的弹幕和悬浮窗播放功能
Android开发类似直播APP的弹幕和悬浮窗播放功能闲来无事,最近自己查网上资料开发可以发送弹幕和悬浮窗播放功能的APP,写的不好,轻喷。一、弹幕功能主要使用哔哩哔哩的弹幕库进行开发的,可以发送自己输入的弹幕文字,还做了弹幕是否显示的开关。上代码:package com.barrage.barragetest.activity;import android.app.Activity;...原创 2019-07-15 15:19:19 · 3243 阅读 · 4 评论 -
处理Android Studio 编译报错:compileDebugJavaWithJavac问题
处理compileDebugJavaWithJavac编译问题使用Android Studio 编译代码总是报错:Execution failed for task ‘:app:compileDebugJavaWithJavac’. 却又没有显示错误原因,找不到报错原因无从下手。可以在Terminal窗口输入命令 gradlew compileDebugJavaWithJavac 进行编......原创 2019-07-11 17:29:28 · 12150 阅读 · 1 评论 -
Android延时执行方法
Android延时执行方法1、使用线程,利用线程休眠达到延时效果。new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(10 * 1000); //线程休眠10秒执行 //TODO todo somthing h...原创 2019-07-18 20:17:16 · 8475 阅读 · 0 评论 -
Android应用层实现恢复出厂设置功能
Android应用层实现恢复出厂设置功能1、通过APP跳转到系统的恢复出厂设置界面,间接实现功能。Intent intent =new Intent(Settings.ACTION_PRIVACY_SETTINGS);startActivity(intent);2、通过发出广播直接实现恢复出厂设置,不用跳转到系统原生界面。Android 9.0之前Intent intent = n...原创 2019-07-27 16:38:14 · 2514 阅读 · 0 评论 -
Android获取视频首帧图片
Android获取视频首帧图片或第n秒的图片这里介绍如何获取视频首帧或者第n秒的图片并保存在本地,直接上代码:import android.graphics.Bitmap;import android.media.MediaMetadataRetriever;import android.os.Bundle;import android.os.Environment;import an...原创 2019-08-08 11:32:40 · 1649 阅读 · 0 评论 -
Android在文件中写日志
Android在文件中写日志有时候我们在程序需要打印日志,但是使用Log打印在控制台很容易就被刷过去,或者打的是签名安装包不方便在控制台输出日志,那就需要我们把日志写到文件中,方便我们自己查看。第一种、追加日志输出文件。就是每次输出的日志都在原先的日志文件中追加,不会覆盖上一次输出的日志。/** * 追加文件:使用FileWriter * @param fileName * @para...原创 2019-08-07 10:06:00 · 2254 阅读 · 0 评论 -
Android使用Opengl录像时添加(动态)水印
最近需要开发一个类似行车记录仪的app,其中需要给录制的视频添加动态水印。我使用的是OpenGL开发的,刚开始实现的是静态水印,后面才实现的动态水印。1、静态水印实现原理:录像时是通过OpenGL把图像渲染到GLSurfaceView上的,通俗的讲,就是把图片画到一块画布,然后展示出来。添加图片水印,就是把水印图片跟录制的图像一起画到画布上。这是加载纹理跟阴影的Java类package c...原创 2020-12-08 13:22:48 · 9842 阅读 · 79 评论 -
解决使用MaterialButton报错:Error inflating class android.support.design.button.MaterialButton
**解决使用MaterialButton报错:Error inflating class android.support.design.button.MaterialButton**在使用的控件上添加主题:android:theme="@style/Theme.MaterialComponents.Light"<android.support.design.button.Materi...原创 2019-07-08 14:07:43 · 4004 阅读 · 0 评论