joy keeps flowin'

joy keeps flowin’ - 什么都想写点

TUN模式和TAP模式

VPN # http(s)代理 # 第一种是 RFC 7230 - HTTP/1.1: Message Syntax and Routing(即修订后的 RFC 2616,HTTP/1.1 协议的第一部分)描述的普通代理。这种代理扮演的是「中间人」角色,对于连接到它的客户端来说,它是服务端;对于要连接的服务端来说,它是客户端。它就负责在两端之间来回传送 HTTP 报文。

Toast异常:BadTokenException

在Android版本7.1.2(API25)及以下会有BadTokenException。到了Android 8.0官方修复了这个问题。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 // aapi 25 public void handleShow(IBinder windowToken) { if (localLOGV) Log.v(TAG, "HANDLE SHOW: " + this + " mView=" + mView + " mNextView=" + mNextView); if (mView != mNextView) { // remove the old view if necessary handleHide(); mView = mNextView; Context context = mView.getContext().getApplicationContext(); String packageName = mView.getContext().getOpPackageName(); if (context == null) { context = mView.getContext(); } mWM = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE); // We can resolve the Gravity here by using the Locale for getting // the layout direction final Configuration config = mView.getContext().getResources().getConfiguration(); final int gravity = Gravity.getAbsoluteGravity(mGravity, config.getLayoutDirection()); mParams.gravity = gravity; if ((gravity & Gravity.HORIZONTAL_GRAVITY_MASK) == Gravity.FILL_HORIZONTAL) { mParams.horizontalWeight = 1.0f; } if ((gravity & Gravity.VERTICAL_GRAVITY_MASK) == Gravity.FILL_VERTICAL) { mParams.verticalWeight = 1.0f; } mParams.x = mX; mParams.y = mY; mParams.verticalMargin = mVerticalMargin; mParams.horizontalMargin = mHorizontalMargin; mParams.packageName = packageName; mParams.hideTimeoutMilliseconds = mDuration == Toast.LENGTH_LONG ? LONG_DURATION_TIMEOUT : SHORT_DURATION_TIMEOUT; mParams.token = windowToken; if (mView.getParent() != null) { if (localLOGV) Log.v(TAG, "REMOVE! " + mView + " in " + this); mWM.removeView(mView); } if (localLOGV) Log.v(TAG, "ADD! " + mView + " in " + this); mWM.addView(mView, mParams); trySendAccessibilityEvent(); } } 在Android8.0中官方加上了try…catch

使用SpannableStringBuilder注意事项

需求中有一行文字显示的大小、颜色、下划线、加粗等不同,可以用几个TextView实现,也可以用SpannableStringBuilder在一个TextView上实现,还可以在string的文件中用H5的语法写。

你需要知道的inlcude标签属性

有了解可以通过<include>标签导入其他布局xml以实现服用的效果。但,一直不明白到底是怎么实现的。这篇就是对怎么实现的探索。 官网说明: 如果要使用 <include> 标记来替换布局属性,您必须同时替换 android:layout_height 和 android:layout_width 才能让其他布局属性生效。

Android SharedPreferences源码分析

SharedPreferences源码分析 # 官方提供的保存键值对的方式, 支持存储类型 # null String 基本数据类型 基本数据类型或String数组 list map set 类型源码:XmlUtils#readThisValueXml

Android library模块publish到JitPack完成流程

背景 # 前段时间想要找一个支持Material You主题的FloatingActionButton,几经辗转总算是找到了,但组件是在另一个开源库的基础上封装继承,一直拖到昨天才把该部分抽离出来,放到了单独项目中。

Android Studio的Gradle代理问题

平时为了速度总是习惯给Android Studio设置代理,通过Android Studio的网络请求都走代理。代理总是抽风,代理设置总在"auto-detect proxy settings"和"Manual proxy configuration"之间横跳。还真不知道代理到底用的是哪个,只要能正常拉下来依赖,用哪个不重要。

Linux File System

权限 # Linux 系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。 为了保护系统的安全性,Linux 系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。 常用的命令ls可以简单的列出所有不隐藏的文件,ls -l使用长格式列出文件及目录的详细信息。

Android Studio右侧Gradle面板显示所有Task

Android Studio Gradle Tasks # Giraffe之前版本 # 设置路径:File -> Settings -> Experimental 取消勾选“Do not build Gradle task list during Gradle sync”后,点击“Sync Project with Gradle Files” Giraffe(2022.3.1) # 设置路径同上 不要点击“Layout Inspector”! 勾选后点击“点击Sync Project with Gradle Files”

RecyclerView.shouldIgnore() NPE问题排查日记

背景 # 这周在写商业化需求(广告)时,为了方便复用,简单改了下传入的Bean。第一次运行时没有一切正常,第二次之后再运行时,提示空指针异常,异常的堆栈是RecyclerView,异常信息(当时没有保存日志,找了其他人相同异常的堆栈,原因是同一个):