Pig Cat

Full-Stack, Android, AI

自定义EditText的无障碍描述(不读hint)

探索发现。

问题 我们一般给一个控件设置描述时,会这样: xxxView.setContentDescription("xxx"); 但是,当你给EditText设置这个时,会发现毫无卵用。为什么呢? 搜了下EditText和其直接父类TextView,没有重写setContentDescription方法,那应该不是setXXX时发生改变,而是getXXX的问题。 果然,在TextView中发现: ...

快速修改字节码并重打jar包

探索发现。

背景 不管是做Android项目还是Java后端Web项目,我们一般都会引用各种三方库。遇到特殊需求时,可能需要修改jar包中的代码。本文以实际示例讲解一些基本方法,方便大家快速入坑。 首先我们都知道直接解压jar包的话,都是class二进制文件,打开后是看不见代码的。之所以可以在开发环境中直接查看jar中的代码是因为IDE已经帮你反编译好了,才能看见Java源码。 入坑 如何修改这些jar...

Win10也要愉快地使用Bash

世界那么大。

对于习惯了Linux和Mac的同学来说,Windows自带的终端确实不太好用。其实我们完全可以用Bash取而代之。 安装Windows Terminal 自从巨硬拥抱开源之后,那是骚操作频频。Windows Terminal是一个开源项目,它本身只是一个终端容器,可以装载系统自带的CMD、PowerShell甚至是WSL子系统的终端。 下载安装很简单,可以在应用商店直接搜索Terminal安...

Windows安装repo的真正解决方案

专治各种小毛病。

2020-02-22更新!我发现谷歌在最近几天发布了git-repo 2.4版本,并更新了 Microsoft Windows Details 文档,直接解决了此文问题,比本文以前的三方解决办法简单很多很多。 最新官方解决方案 一、基础设施 安装最新的Git for Windows(参考下面的旧文即可),目前版本是2.25.1 安装Python 3 ,目前版本是3.8.1,不要安装Py...

源码茶舍之如何由Uri找寻ContentProvider

品味AOSP。

引子 我们都知道四大组件之一ContentProvider的用处,它给大家提供一种统一的数据访问格式。调用者无需关心数据源于何处(如DB、XML文件和网络等),只需获取到对应的ContentResolver来进行增删查改即可。 自己实现一个Provider的时候,也会在配置文件中声明如下: <provider android:name=".provider.TestProvid...

源码茶舍之FLAG_EXCLUDE_STOPPED_PACKAGES与广播唤醒

品味AOSP。

发现 我们先随便实现一个BroadcastReceiver,静态注册: class TestReceiver : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { Log.w("TEST-1", "onReceive ${i...

走进各大语言的协程世界

开阔眼界。

想聊聊C++、C#、JS、Kotlin等语言中的协程实现与应用。 挖坑待填,未完待续……

Android神经网络(Neural Networks API)初探

见微知著。

谷歌早在Android 8.0就推出了神经网络API,不过现在网上资料仍旧不多,随着TensorFlow Lite的成熟,底层API更是无人问津。 前言 Android Neural Networks API (NNAPI) 是一个 Android C API,专为在 Android 设备上运行计算密集型运算从而实现机器学习而设计。NNAPI 旨在为更高层级的机器学习框架(如 Tenso...

RecyclerView中DiffUtil的一些注意事项

见微知著。

节能刷新 移动设备屏幕大小有限(不得不说我是顽固的小屏爱好者,大于5.5寸难以接受,时代已经抛弃我了哈哈),列表(List)可以说是一个出现非常高频的交互设计。大多数情况下我们的列表不仅仅是一次性加载本地数据,而要应付来自网络的各种动态内容,可能是增加、删除等操作。 在Android开发中,一个耳熟能详的方法就是 notifyDataSetChanged ,在适配器(Adapter)的设计模...

MTK设备上DuraSpeed导致Service无法启动的问题

知其所以然。

没想到联发科还会改framework,有点小惊讶…… 背景 问题的起因是我们的系统应用无法调起与其他部门联动的某个Service组件了。查日志发现有这么一行: 1276-2330/system_process D/ActivityManager: bringUpServiceLocked, suppress to start service! 提示内容大概是说Service的启动被禁止...

Win10家庭版如何正确关闭自动更新

专治各种小毛病。

之所以不更新,是因为你太好用,舍不得你出问题。哈哈哈哈哈哈啊哈哈哈! 背景 Windows10还是很漂亮很好用的,大部分同学购买的品牌机也都会预装正版Win10,不过是家庭版的(个人用户一般也不需要专业版,比如我这种装双系统的只把Win10拿来打游戏),然而,家庭版系统要用常规手段是没法彻底关闭自动更新的。 微软也非常不给面子,各种给你悄悄打开,当你关机时,你会吃惊地发现“更新并关机”...

避免Android定制ROM中的EditText出现pop弹窗

知其所以然。

问题 可能看到标题的同学一头雾水,这是什么东西,其实类似于你长按文本时出现的复制粘贴pop弹窗。在一些定制ROM中,厂商为了某些方便用户的特殊功能会增加文本输入检测和自定义弹窗,举例: 比如在你输入一些邮箱时,会自动弹出这种pop(并不需要你长按),且这个并非系统应用才有的,而是直接影响了所有EditText。 对于一些高度定制化UI的应用来说,这个可能影响用户体验。下面给出两种解决办法(...

为何点击推送通知打不开Activity?Calling startActivity() from outside……

知其所以然。

小米推送Android SDK有这么一个耳熟能详的方法: /** * 接收服务器向客户端发送的通知消息,在用户手动点击通知后触发 */ public void onNotificationMessageClicked(Context context, MiPushMessage message) { ... context.startActivity(intent); } 如果在其...

源码茶舍之PackageManager获取注册Service数量问题

多查查,也不难。

问题 今天有朋友遇到个问题,说bindService失败了,查了几步发现是由于PackageManager获取不到对应的Service组件导致的。具体示例代码如下: val serviceInfos = packageManager.getPackageInfo("com.xxx.xxx", PackageManager.GET_SERVICES).services Log.d("TEST"...

Deepin系统add-apt-repository失败的问题

专治各种小毛病。

不只是安装software-properties-common那么简单…… 问题 目前Deepin系统版本为15.11,貌似在15.10时切到了Debain的软件仓库,而不再是Ubuntu了,虽说比较稳定,但还不够新,比如git,版本就没有官方的新。 于是我尝试 git官方的办法: sudo add-apt-repository ppa:git-core/ppa 报错,提示未找到命令...

Gradle命令编译失败NoClassDefFoundError和VerifyError

多加思索。

问题 不知道大家在编译gradle项目的时候习惯直接在Android Studio这种IDE里面还是命令行操作。 今天在Deepin系统里面用命令编译: ./gradlew assembleDebug 直接报错: Exception in thread "main" java.lang.NoClassDefFoundError: org.gradle.wrapper....

Deepin标题栏太高的解决办法(自定义高度)

专治各种小毛病。

Deepin 15.11已经发布一段时间了,前段时间折腾了一下,把我的Ubuntu换成了Deepin(有兴趣可以看看我的另一篇:Deepin15.11初体验及问题解决),总体感觉非常好。 依我个人习惯,目前有两点不是很能接受: 第一就是软件源貌似是debian stable的,所以很多软件版本比较老,比如git版本,远低于官方版本,这个还是有一些解决办法的,具体的我就没去折腾了,Deepi...

Deepin15.11初体验及问题解决

专治各种小毛病。

Deepin发展也有不少年了,最近还和华为的笔记本合作预装。之前我一直都用Ubuntu做日常开发,现在心血来潮也想折腾一下Deepin哈哈, 本文主要讲从Ubuntu无痛迁移到Deepin的安装过程、N卡显卡驱动等一系列小坑的解决。权当总结吧! 下载和制作启动盘 这个就不讲了哈,直接在官网下就行了,包括启动盘制作工具。 http://www.deepin.org/download/ 保留...

Docker安装Ubuntu镜像并保存且修改IP及Mac地址

入坑易,出坑难。

本文仅作为一个Docker入坑笔记。 主要介绍: 1、Docker在Linux上的安装配置; 2、在Docker容器中安装一个Ubuntu镜像并保存更改; 3、以任意IP地址和Mac地址启动刚才安装的Ubuntu镜像。 运行环境 简介一下我的环境,方便参考:Linux 4.15.0-64-generic #73~16.04.1-Ubuntu SMP Fri Sep 13 09:56:18...

OkHttp自定义重试拦截器出现IllegalStateException: cannot make a new request……异常

拦截器玩出花。

问题 OkHttp自定义重试拦截器常见实现方式: private static class RetryInterceptor implements Interceptor { @Override public okhttp3.Response intercept(Chain chain) throws IOException { int retryCount ...