自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

折翅鵬的博客

虽已折断翅膀,依然渴望飞翔。

  • 博客(43)
  • 收藏
  • 关注

原创 Java进程同步

场景进程A写文件,进程B读文件,进程B需要进程A写完才能读。方案java.nio.channels.FileLock 文件锁FileLock 是进程文件锁,用于进程间并发,控制不同程序(JVM)对同一文件的并发访问。每次通过FileChannel类的lock或tryLock方法获取文件锁时,都会创建一个文件锁对象。文件锁是当前程序所属的JVM实例持有的,一旦获取到文件锁(对文件加锁),要调用release(),或者关闭对应的FileChannel对象,或者当前JVM退出,才会释放这个锁。一旦某个进

2020-05-24 17:05:57 791

原创 从源码角度理解Handler消息机制

Handler是Android中的核心机制。通过Handler可以将Message发送到Handler所在线程对应的MessageQueue中。每一个Handler实例都只会属于唯一一个线程,也只会对应唯一一个MessageQueue。源码解析使用Handler第一步都要实例化,来看看Handler的构造函数://默认构造函数,将会使用当前线程对应的Looper,如果当前线程没有Looper则会抛出异常public Handler() { this(null, false);}//传入

2020-05-17 23:42:15 256

原创 基于NDK验签的方式实现APP重签名校验方案

最近发现有人破解我们的应用,于是研究了一下如何在应用被破解以后,让应用退出的简单实现方案。

2023-12-04 16:21:29 234

原创 Android设置文字颜色渐变

项目中用到了很多文字颜色渐变的设计,因此做一下记录。属性颜色值,否则不会产生预期效果。

2023-11-29 11:35:57 711

原创 Android网络安全配置network_security_config

Android开发过程中,如果出现网络请求错误,测试经常会抓包来查看请求的情况。在Android6.0 及以下系统可以抓包,而 Android7.0 及以上系统不能再抓包了,因为Android7.0及以上系统版本新增了证书验证,所以 app 内不再像原来一样默认信任用户的证书了。为了让测试能在抓包,一般都会在AndroidManifest.xml文件中配置network-security-config来实现。

2023-07-01 22:52:53 2598

原创 Android TextView自定义长按菜单

这样虽然能让TextView支持长按唤起系统菜单栏,但是如果需要定制菜单栏,该怎么做呢?在项目开发中,经常需要对TextView长按操作进行处理,弹出相应的菜单栏。只需要实现ActionMode.Callback重写其方法即可自定义菜单。要想让TextView支持长按弹出菜单栏,需要将。可以对选择的文本高亮的颜色进行更改。在styles.xml的主题中修改。可以对选择器手柄的颜色进行更改。如何自定义选择器样式呢?在TextVIew中添加。

2023-05-29 17:09:30 1674

原创 判断点在任意矩形内

Path反旋转向量乘积

2023-05-13 14:10:06 625

原创 基于顶部对齐进行裁剪的ImageView

最近项目中需要基于顶部对齐,然后对图片进行缩放裁剪的效果,于是就研究了一下,整理代码如下。

2023-04-20 09:54:04 353

原创 Android媒体库不刷新问题追溯和解决

最近项目中需要通过ContentProvider获取某种类型的文件列表进行展示,然后在展示列表中可以对文件进行复制,移动和删除操作。在开发过程中,对文件操作以后,再次拉取列表,发现还是原来的旧数据,数据并没有刷新,于是做了一下追溯和解决。查询文件ContentProvider private List<File> findFile(Context context, List<String> extensions) { String[] mineTypes

2022-05-14 20:02:57 1057

原创 组件化:合并清单文件

最近做项目,在集成第三方aar以后,本来请求读写权限允许以后应该是权限授予成功了,但是结果却是读权限授予成功了,但是写权限未授权。主项目清单文件权限声明如下:<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />然后通过Andr

2022-05-01 21:42:19 562

原创 Navigation重建Fragment问题分析及解决

最近项目中使用到了BottomNavigationView结合Navigation实现底部导航栏切换页面业务。NavigationUI.setupWithNavController(bottomNavigationView, navController);结果发现每次点击底部导航栏切换的时候都会重建Fragment,于是分析了源码,并研究了解决方案。源码分析setupWithNavControllerNavigation源码分析解决方案自定义Navigator...

2022-05-01 18:35:16 3200 14

原创 完整Activity和Fragment生命周期

参考:https://github.com/xxv/android-lifecycle

2022-04-23 22:53:34 284

原创 EditText选中全部无效问题排查

最近项目有需求,EditText第一次获取焦点以后弹出软键盘并且选中所有文本,于是想到将android:selectAllOnFocus设置为true就能实现。<androidx.appcompat.widget.AppCompatEditText android:layout_width="match_parent" android:layout_height="50dp" android:maxLines="1" android:s

2022-04-17 22:57:21 2481

原创 Intent.ACTION_VIEW无法跳转问题排查

项目中文本链接(包括网址和邮箱)点击以后使用的是Intent.ACTION_VIEW打开,但是有用户反馈在三星Galaxy Tab S7上点击以后无法跳转,于是做了问题的排查,最后确定为Android 11以上软件包可见性未设置。链接点击跳转代码如下: public static void openBrowser(Context context, String url) { final Intent intent = new Intent(Intent.ACTION_VIEW, U

2022-04-09 14:48:08 5036 2

原创 Android底部弹窗实现方案

项目中经常会遇到底部弹窗,今天就来把底部弹窗实现方案总结一下。BottomSheetDialog自定义DialogWindowManager

2022-03-20 12:22:26 7785 1

原创 顺序显示多个弹窗方案-责任链模式

在应用中,用户进入应用首页以后经常会遇到顺序弹出多个弹窗的业务。例如进入首页以后,首先弹出运营活动弹窗,然后弹出应用评分或反馈弹窗,最后弹出应用更新弹窗等等。于是想到封装一套代码可以控制弹窗流程执行。DialogChainOwner弹窗链持有者。负责弹窗链节点的加入和展示入口。/** * 弹窗链拥有者,用于控制链节点的添加和展示以及取消,销毁 */public class DialogChainOwner implements LifecycleEventObserver { priv

2022-03-19 22:20:00 1230

原创 Java Comparable与Comparator的区别

Java 提供了两个接口来使用类的数据成员对对象进行排序:Comparable和Comparator。Comparable一个Comparable对象能够将自己与另一个对象进行比较。类本身必须实现java.lang.Comparable接口来比较它的实例。考虑一个Movie类,它的成员喜欢、评级、名称、年份。假设希望根据发行年份对电影列表进行排序。可以用Movie类实现Comparable接口,重写Comparable接口的compareTo()方法。 class Movie implemen

2022-01-16 14:22:36 1473

原创 Google Play结算服务开发

Google Play结算平台开发指导

2022-01-09 22:57:50 2912 2

原创 Android截图方式

Android中实现截图的方案集锦

2021-12-26 22:31:28 3478

原创 顺序显示多个弹窗方案-RxJava

项目中经常会遇到依次显示多个弹窗的情况,例如进入首页以后先弹出更新提示弹窗,关闭以后再弹出运营弹窗,然后弹出其他业务弹窗等等。常见的做法是嵌套调用:dialogA.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { //trigger B

2021-12-19 12:44:20 1479

原创 色度抠图之取色

最近做音视频项目中的色度抠图功能,用吸管进行当前帧取色,然后进行强度和阴影调节进行取色,具体效果可查看剪映的色度抠图功能。这篇文章就讲述了如何对视频当前帧的某个位置进行取色。首先需要获取视频对应的当前帧: /** * 获取当前帧对应的Bitmap * * @param clip 媒体片段对象 * @param position 当前位置 * @return */ private Bitmap getCurrentBitmap

2021-12-19 12:22:34 771

原创 android PendingIntent理解

public static void startActivityForService(Context context, MediaInfo mediaInfo) {Intent intent = new Intent(context, ScreenshotResultActivity.class);intent.putExtra(EXTRA_MEDIA_INFO, mediaInfo);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.add

2021-10-31 23:27:31 8771 1

原创 android绘图之Canvas和Bitmap结合

Rect和RectFMatrixCanvasBitmap

2021-10-31 12:11:01 4246

原创 Android离散选择控件

最近做项目中需要用到拖动条,并且拖动条只能在某些值之间,于是找了点资料。SeekBarSeekBar通过设置Widget.AppCompat.SeekBar.Discrete主题可以实现离散值选择。 <androidx.appcompat.widget.AppCompatSeekBar android:id="@+id/seekBar" style="@style/Widget.AppCompat.SeekBar.Discrete" andr

2021-10-23 12:45:14 1300

原创 Java枚举结合位运算实现多配置

项目中经常会碰到配置参数,根据参数配置不同作出不同的处理,枚举可以对参数的取值进行限制,也能清晰的知道应该传哪些参数,如果参数支持多个枚举值,通常可以采用数组或者可变长度参数,但是这样传参每次都需要进行遍历,然后进行对比来判断究竟传入了那些枚举值,不优雅。枚举序数每个枚举类都会有一个ordinal属性,这个属性代表着当前枚举值在枚举类中的序号。public enum Gravity { LEFT, //ordinal=0 TOP,

2021-07-10 11:53:57 847

原创 Gson高级进阶用法

Gson是一个可以实现Java对象和json格式数据进行相互转换的Java库。dependencies { implementation 'com.google.code.gson:gson:2.8.6'}导火线最近项目需要做多语言,多语言由后台统一配置TypeAdapterFactoryTypeAdapterJsonDeserializerJsonSerializer...

2021-01-30 16:57:18 489 1

原创 数据库开发之Room

Room 在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库。

2021-01-24 13:45:26 657

原创 Java创建对象流程

在创建Java对象之前,必须将类字节码(.class文件)从文件系统加载到内存中。找到给定类名的字节码并将该代码转换为Java类实例称为类加载。每种类型的Java类都会对应创建一个类。

2021-01-17 23:45:47 193 2

原创 OkHttp缓存使用

缓存可以不用每次请求时都去服务器拉取数据,可以快速响应数据,提升用户体验,并且还能节省流量。相关知识ETag资源的特定版本的标识符。在ETag和If-Match头部的帮助下,可以检测到"空中碰撞"的编辑冲突。客户端将ETag作为If-None-Match字段的值一起发送给服务器并与服务器当前版本的资源的ETag进行比较,如果两个值匹配(即资源未更改),客户端继续使用缓存,如果两个值不匹配,则表示资源有更新,客户端需要更新缓存的资源。ETag: W/"<etag_value>"‘W/’

2021-01-10 23:24:02 646 2

原创 Android断点续传实践

最近公司项目要做断点续传,于是研究了一下。

2020-12-06 10:42:33 345

原创 安卓NDK开发入门手册

NDK是让开发者能在Android应用中使用C/C++代码的一套开发工具。运行效率高将C/C++源代码直接编译成机器码代码安全性好APK的Java层代码很容易被反编译,而C/C++库 反编译难度大跨平台用C/C++写得库可以方便在其他的嵌入式平台上再次使用核心概念本地共享库:以扩展名.so构建的库,在运行时是共享和动态链接的本地静态库:以扩展名.a构建的库,这类库实际上是在编译时静态链接的JNI:将Java中对native方法的调用引导到C/C++编写的本地库

2020-11-25 19:55:13 323

原创 理解FragmentTransaction#setMaxLifecycle方法

androidx中**Fragment#setUserVisibleHint(boolean)方法已经被淘汰了,取而代之的是FragmentTransaction#setMaxLifecycle(Fragment, Lifecycle.State)**方法,该方法可以直接干预Fragment生命周期执行。FragmentTransaction中方法setMaxLifecycle实现源码如下: @NonNull public FragmentTransaction setMaxLifecyc

2020-11-21 14:09:46 3795

原创 探索Handler源码之等待任务执行

问题如何在子线程中通过主线程的Handler向主线程发布任务,然后等待主线程将任务处理完成以后再继续执行子线程?Handler#runWithScissorsHandler源码中提供了方法runWithScissors就是用来处理上面问题的,但是开发者无法调用,因为被标记为**@hide**了,但是实现方法可以借鉴。 public final boolean runWithScissors(@NonNull Runnable r, long timeout) { if (r == n

2020-11-14 15:09:40 409

原创 Android视图“挖孔”研究

本文来看看如何在视图上挖一个孔,让视图层下层的视图可以展示出来。核心方法clipRect(@NonNull RectF rect, @NonNull Region.Op op)clipRect(@NonNull Rect rect, @NonNull Region.Op op)clipRect(@NonNull Rect rect)clipOutRect(@NonNull Rect rect)clipPath(@NonNull Path path, @NonNull Region.Op op)

2020-11-09 21:11:23 1090

原创 Android图文居中显示控件

最近项目中用到了文字图标的按钮,需要居中显示,如果用TextView实现的方式,必须同时设置padding和drawablePadding。如下:<androidx.appcompat.widget.AppCompatTextView android:layout_width="200dp" android:layout_height="wrap_content" android:drawableLeft="@drawable/ic_xxx"

2020-09-03 20:30:37 298

原创 从任务栈理解Activity启动模式

启动模式允许定义Activity的新实例与当前任务的关联方式。可以通过两种方式定义不同的启动模式:使用AndroidManifest.xml文件:在清单文件中声明activity时,可以指定activity在启动时应如何与任务关联。使用Intent的flags:当调用startActivity()时,可以在Intent中包含一个标志,该标志声明新activity应如何(或是否)与当前任务关联。注意:清单文件可用的某些启动模式不可用作intent的标志,同样,某些启用模式可用作intent的标志,

2020-05-24 17:10:01 372

原创 Android实现H5与Native交互的几种方式

Android中使用控件WebView来承载展示H5,那么Java本地方法调用H5中的Js方法同样也要用到WebView对应的Api。Java本地方法调js通过WebView调用loadUrl(String)方法执行jsevaluateJavascript(String, ValueCallback)执行js,注意:此方法只支持android.os.Build.VERSION_CODES.N及以上利用JsBridge引用第三方库lzyzsd/JsBridgejs调用Java本地方法通过W

2020-05-24 17:07:44 628

原创 MD5加密算法入门及改进

MD5消息摘要算法,属Hash算法一类。MD5算法对输入任意长度的信息变换产生一个128位的消息摘要。原理1、数据填充对信息进行数据填充,使信息的长度对512取模得448,设信息长度为X,即满足X mod 512=448。根据此公式得出需要填充的数据长度。填充方法是在信息后面填充第一位为1,其余为0。填充完后,信息的长度就为N*512+448(bit)。2、填充信息长度原信息长度(二进制位数)用64位表示。如果信息长度大于264,则只使用其低64位的值,即(信息长度对264取模),并且填充到前面一

2020-05-24 17:04:23 786

原创 Android编程风格以及命名规范

编程风格代码中尽量不要出现中文。注释和除外。代码中通过strings.xml引用来显示中文控件声明放在activity级别,这样在activity其他地方可以使用不要重用父类的handler,对应一个类的handler也不应该让其子类用到,否则会导致message.what冲突在一个View.OnClickListener中处理所有的点击事件逻辑,这样看起来很集中和直观strings.xml中使用%1$s等实现字符串的通配布局文件中的字体大小,都定义在dimens.xml中有关marg

2020-05-24 17:00:01 422

原创 Android开发个人笔记

这个笔记主要记录了开发中遇到的问题和解决方案,还有一些源码技巧。• ImageView方法setImageUri导致OOM获取到本地图片的Uri以后直接通过setImageUri导致了OutOfMemoryError分析: 使用setImageUri是直接对uri对应的图片进行加载的,如果图片过大,就会造成OOM解决: 使用Glide加载,或者对图片进行压缩处理后再设置• 一个HashCode的生成方法public class Actor { private final int i

2020-05-24 16:59:12 600

空空如也

空空如也

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

TA关注的人

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