[TOC]
- 为什么String要设计成不可变的
- 请写出代码计算二叉树的最大深度,分别用『递归』和『非递归』的方式实现
- 如何检查内存泄漏,并解决
-
安卓学习笔记
-
An awesome list of tips for android. http://itangqi.me/2015/09/14/android-…
- 自定义View,有这一篇就够了
- Canvas中drawRoundRect()方法介绍
- Android GradientDrawable取代shape的使用
- ViewOutlineProvider实现圆角矩形
- 【Android UI】TextView的垂直方向概念之top,bottom,ascent,descent,baseline
- View的事件体系(一)View的基础知识
- View的事件体系(二)实现View滑动的三种方式
- View的事件体系(三)View的弹性滑动
- View的事件体系(四)View 的事件分发机制
- View的事件体系(五)View滑动冲突的解决方案
- Fragment详解
- 1、《Fragment详解之一——概述》
- 2、《Fragment详解之二——基本使用方法》
- 3、《Fragment详解之三——管理Fragment(1)》
- 4、《Fragment详解之四——管理Fragment(2)》
- 5、《Fragment详解之五——Fragment间参数传递》
- 6、《Fragment详解之六——如何监听fragment中的回退事件与怎样保存fragment状态》
- Fragment的四种跳转
- 1、从同一个Activiy的一个Fragment跳转到另外一个Fragment
- 2、从一个Activity的Fragment跳转到另外一个Activity
- 3、从一个Activity跳转到另外一个Activity的Fragment上
- 4、从一个Activity的Fragment跳转到另外一个Activity的Fragment上
- YoKeyword/Fragmentation
A powerful library that manage Fragment for Android!
特性
1、可以快速开发出各种嵌套设计的Fragment App
2、悬浮球/摇一摇实时查看Fragment的栈视图Dialog,降低开发难度
3、增加启动模式、startForResult等类似Activity方法
4、类似Android事件分发机制的Fragment回退方法:onBackPressedSupport(),轻松为每个Fragment实现Back按键事件
5、提供onSupportVisible()等生命周期方法,简化嵌套Fragment的开发过程; 提供统一的onLazyInitView()懒加载方法
6、提供 Fragment转场动画 系列解决方案,动态更换动画
7、更强的兼容性, 解决多点触控、重叠等问题
8、支持SwipeBack滑动边缘退出(需要使用Fragmentation_SwipeBack库,详情README)
-
vlc无法全屏的问题解决方案
注:首推第一个
-
MVP Android Example
-
MindorksOpenSource/android-mvp-architecture
This repository contains a detailed sample app that implements MVP architecture using Dagger2, GreenDao, RxJava2, FastAndroidNetworking and PlaceholderView https://mindorks.com/open-source-proj…
-
android10/Android-CleanArchitecture
MVVM模式一个干净的设计框架
-
组件化之后组件间activity跳转,如果完全解耦需使用ActivityRouter以及阿里巴巴路由框架ARouter
-
tianzhijiexian/SelectorInjection
一个强大的selector注入器,它可以让view自动产生selector状态,免去了写selector文件的麻烦。
-
一个支持多种状态的自定义View,可以方便的切换到:加载中视图、错误视图、空数据视图、网络异常视图、内容视图。
-
简单实用的页面多状态布局(content,loading,empty,error)
-
App公共组件:加载数据Layout,高效开发必备!
-
有可能是最实战的dagger2教程,手把手教你使用。更多精彩,关注公众号:代码GG之家 欢迎
-
Fragment懒加载和ViewPager的坑
-
Activity嵌套多个fragment时,onResume的处理
解决方法:
不在fragmentA的onResume里写,而改成下面这样写,不可见时不操作,可见时再操作。
参考资料:http://blog.csdn.net/binbin_1989/article/details/64437995
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if (hidden) {
UtilsTools.Log_e(TAG, " --- 不可见()");
} else {
initData();
UtilsTools.Log_e(TAG, " --- 当前可见()");
}
}
-
Activity被回收后Fragment嵌套的Fragment不显示问题
解决方法:
getFragmentManager()是所在fragment 父容器的碎片管理
getChildFragmentManager()是在fragment 里面子容器的碎片管理
参考资料:[http://blog.csdn.net/u012224845/article/details/50344199](http://blog.csdn.net/u012224845/article/details/50344199) -
Android资源文件夹下面values/style.xml、values-v19/style.xml、values-v21/style.xml主题调用规则
-
人民币符号适配(主要是¥中划线一横与两横的问题)
char cny = (char)165; -
关于数据库的操作,由于默认每次写操作(读操作可以不用)都会开启一个事务,大量数据的写操作需要用开启事务避免每次写操作都创建一个事务以提高app性能 最常见的场景:for循环插入数据库execSQL,需要开启事务。 伪代码:
db.beginTransaction(); //手动设置开始事务 try{ //批量处理操作 for(Collection c:colls){ insert(db, c); } db.setTransactionSuccessful(); //设置事务处理成功,不设置会自动回滚不提交。 //在setTransactionSuccessful和endTransaction之间不进行任何数据库操作 }catch(Exception e){ MyLog.printStackTraceString(e); }finally{ db.endTransaction(); //处理完成 }
-
比较两个List集合中相同(不同)元素性能最高的方法 参考文章:获取两个List中的不同元素,4种方法,逐步优化,学习使用
-
Butterknife出现Bindview空指针异常主要有2个问题点需要排查: 1.butterknife的gradle配置有问题; 2.butterknife的binding过程是顶级布局往下一层一层绑定,一旦parent id绑定失败(一般是类型转换错误),该父布局的子布局所有view都会绑定失败,error log通常只会提示子view的空指针异常,需要继续往上查找log查看父布局哪个view类型转换异常。
-
xshell执行远程虚拟机上的程序,需要xshell退出后远程虚拟机上的程序继续在后台执行 1.nohup ./Demo.sh &
-
Java调用kotlin扩展函数报参数错误解决方案(vararg)
//文件名为ViewKt.kt fun Activity.setOnClickListener(listener: View.OnClickListener, vararg ids: Int) { for (id in ids) { findViewById<View>(id).setOnClickListener(listener) } } ViewKt.setOnClickListener( this, new OnFastDoubleClickListener(this), R.id.album_btn, R.id.capture_btn);
/**
* 检查权限是否被授予,此方法主要针对checkSelfPermission总是返回PERMISSION_GRANTED的问题
* @param permission
* @param context
* @return
*/
public static boolean selfPermissionGranted(String permission, Context context) {
// For Android < Android M, self permissions are always granted.
boolean result = true;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (getTargetSdkVersion(context) >= Build.VERSION_CODES.M) {
// targetSdkVersion >= Android M, we can
// use Context#checkSelfPermission
result = context.checkSelfPermission(permission)
== PackageManager.PERMISSION_GRANTED;
} else {
// targetSdkVersion < Android M, we have to use PermissionChecker
result = PermissionChecker.checkSelfPermission(context, permission)
== PermissionChecker.PERMISSION_GRANTED;
}
}
return result;
}
public static int getTargetSdkVersion(Context context) {
int targetSdkVersion = 0;
try {
final PackageInfo info = context.getPackageManager().getPackageInfo(
context.getPackageName(), 0);
targetSdkVersion = info.applicationInfo.targetSdkVersion;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return targetSdkVersion;
}
git push origin eas_local:eas_sync
git checkout -b eas_local origin/eas_sync
git pull
git pull origin eas_sync:eas_local
git pull origin master:dev
git checkout -b dev//基于本地创建分支
git checkout -b dev origin/dev //基于远程分支创建本地分支
git clone https://git.oschina.net/telneter/iscs_calendar.git
git checkout -b eas_local
git pull origin eas_sync:eas_local
git push origin eas_local:eas_sync
git tag
git tag -a v1.4 -m 'my version 1.4'
git show v1.4
参考:[Git 基础 - 打标签](https://git-scm.com/book/zh/v1/Git-%E5%9F%BA%E7%A1%80-%E6%89%93%E6%A0%87%E7%AD%BE)
[git同步远程已删除的分支和删除本地多余的分支](https://www.cnblogs.com/saysmy/p/9166331.html)
git remote prune origin
1. git init
2. git add .
3. git commit -am "###" -------以上3步只是本地提交
4. git remote add origin git@xx.xx.xx.xx:repos/xxx/xxx/xxx.git
5. git push origin 本地分支:远程分支
1. git clone -b 远程分支名 远程库url --depth 1 //仅下载最新版本的代码
[现象] git clone 一个大的项目时失败,错误类似fatal: The remote end hung up unexpectedly | fatal: early EOF | fatal: index-pack failed
[原因]项目过大,受硬件限制(类似过载保护),clone过程中会中断
[解决] a、先做一个浅:git clone --depth 1 <repo_URI>;
b、将浅repo回复完全:git fetch --unshallow
c、then do regular pull :git pull --all
注:参考连接:git&gerrit 使用过程中遇到的问题及解决方法
分两步走:
1.git checkout dev
2. git merege origin/master
cd existing_repo
git remote rename origin old-origin
git remote add origin http://172.16.90.180/netposa_whapp/vid.git
git push -u origin --all
git push -u origin --tag
git代码已push到服务器,如何进行回退
a、在client 端撤消错误的提交:回到之前的一个提交
git reset --hard HEAD^
b、将新的提交 强制推到 git 服务器上:
git push -f origin master
- 加快访问GitHub的速度
- 打开码云,然后从github上导入进去,再下载速度贼快,大工程都这么下载
-
ADB 清除Android手机缓存区域日志 adb logcat -c -b main -b events -b radio -b system adb logcat -c
-
ADB logcat 过滤方法(抓取日志) adb logcat | grep -–color=auto $pid
-
- 查看所有应用pid
adb shell ps
- 查看指定应用的pid
adb shell "ps | grep com.antelope.app"
-
在windows上不能使用grep关键字,而是应该用findstr
如何只查看某个app日志的方法
-
adb shell pm list packages -3 查看非系统第三方应用包名
-
adb shell ps | findstr vchat.A 查看包名进程
-
根据进程来查看过滤app的日志
adb logcat | findstr vchat.A
注:CHCP 65001就设置成utf-8编码的了
-
-
查看log并保存到本地
-
adb logcat -c
-
adb logcat |find "13696" > C:\Users\Admin\Desktop\aaaa.txt
-
-
Android adb push后相册没有立马更新,需要刷新media库
adb push C:\Users\ygq\Pictures\123.jpg sdcard/DCIM
adb shell am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d file:///sdcard/DCIM/123.jpg- Android Studio查看第三方库依赖树
- Android Studio版本与Gradle版本的对应关系
- Gradle本地缓存文件过大,修改到D盘缓存的办法(不配置的话,Windows中默认是在C:\Users<username>.gradle),新建系统环境变量GRADLE_USER_HOME=D:\android.gradle
- AndroidX 版本 google版
- AndroidX 版本 国内版
gradlew命令会执行gradle-wrapper.properties中的gradle版本,gradle命令必须指定某个版本,而gradle会经常升级,所以最好用gradlew命令
-
多moduleAndroid库提交到Maven最佳实践
-
[ttps://www.jianshu.com/p/d778f96a1e93](gradle 发布jar或者aar到maven私服时pom文件缺少依赖)
-
https://docs.gradle.org/5.4.1/userguide/publishing_maven.html#publishing_maven
-
开了ss后发现依然没法上传到
https://bintray.com/,此时需要在Project的gradle.properties中添加以下proxy内容systemProp.http.proxyHost=127.0.0.1 systemProp.http.proxyPort=1080 systemProp.https.proxyHost=127.0.0.1 systemProp.https.proxyPort=1080
-
多Module Project需要单独发布某一个module时Gradle>
ModuleName>Tasks>publishing>bintrayUpload即可单独发布某一个module
https://bintray.com/ username yeguoqiang6 apikey 1809887721a2eee40615c2faf30e495136c6f8ed
-
【Android源码解析】View.post()到底干了啥 主要是分析HandlerActionQueue.post()方法以及view的原理
- Flutter 第三方包 https://pub.flutter-io.cn/
第一步:Android安装Charles证书(华为手机测试)
注意:可以使用电脑浏览器访问chls.pro/ssl,下载charles-proxy-ssl-proxying-certificate.pem文件然后adb push到sd卡
第二步:Charles抓https显示unknown解决方法
注意:Charles的SSL Proxying Settings,添加所有的域名这一步一定要有,否则就算信任了证书也全都是unknown
第三步:如何解决 Android7.0之后部分手机无法抓包 注意:关键代码
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" overridePins="true" />
<certificates src="user" overridePins="true" />
</trust-anchors>
</base-config>
</network-security-config>
Android 7.0以上抓取Https请求还需要添加网络安全配置
网络安全配置,具体可以参考网络安全配置
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application android:networkSecurityConfig="@xml/network_security_config"
... >
...
</application>
</manifest>其中network_security_config.xml具体为以下内容
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config>
<trust-anchors>
<certificates src="user" />
</trust-anchors>
</base-config>
</network-security-config>-
markdown神器 -Typora
-
抓包神器 -Charles、Fiddler
-
远程协助工具 -Teamviewer/向日葵
-
API测试工具 -Postman
-
后台API展示-Swigger
-
google浏览器插件-谷歌访问助手
-
PAC过滤规则
"github.com", "gist.github.com", "assets-cdn.github.com", "raw.githubusercontent.com", "gist.githubusercontent.com", "cloud.githubusercontent.com", "user-images.githubusercontent.com", "camo.githubusercontent.com", "avatars0.githubusercontent.com", "avatars1.githubusercontent.com", "avatars2.githubusercontent.com", "avatars3.githubusercontent.com", "avatars4.githubusercontent.com", "avatars5.githubusercontent.com", "avatars6.githubusercontent.com", "avatars7.githubusercontent.com", "avatars8.githubusercontent.com", "github-cloud.s3.amazonaws.com", "stackoverflow.com", "flutter.dev"
-
自建v2ray服务器教程
-
https://ssr.tools/1026 https://tlanyan.me/v2ray-clients-download/
-
https://github.com/233boy/v2ray/wiki
bash <(curl -s -L https://git.io/v2ray.sh) v2ray info 查看 V2Ray 配置信息 v2ray config 修改 V2Ray 配置 v2ray link 生成 V2Ray 配置文件链接 v2ray infolink 生成 V2Ray 配置信息链接 v2ray qr 生成 V2Ray 配置二维码链接 v2ray ss 修改 Shadowsocks 配置 v2ray ssinfo 查看 Shadowsocks 配置信息 v2ray ssqr 生成 Shadowsocks 配置二维码链接 v2ray status 查看 V2Ray 运行状态 v2ray start 启动 V2Ray v2ray stop 停止 V2Ray v2ray restart 重启 V2Ray v2ray log 查看 V2Ray 运行日志 v2ray update 更新 V2Ray v2ray update.sh 更新 V2Ray 管理脚本 v2ray uninstall 卸载 V2Ray # firewalld放行端口(适用于CentOS7/8) firewall-cmd --permanent --add-port=23581/tcp # 23581改成你配置文件中的端口号 firewall-cmd --reload # ufw放行端口(适用于ubuntu) ufw allow 23581/tcp # 23581改成你的端口号 # iptables 放行端口(适用于CentOS 6/7) iptables -I INPUT -p tcp --dport 23581 -j ACCEPT # 设置开机启动 systemctl enable v2ray # 运行v2ray systemctl start v2ray
-
脚本一:CentOS 6和7/Debian6+/Ubuntu14+ ShadowsocksR一键部署管理脚本
yum -y install wget wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/ssr.sh && chmod +x ssr.sh && bash ssr.sh脚本二:谷歌BBR加速
yum -y install wget wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh chmod +x bbr.sh ./bbr.sh查看加速bbr进程
- 输入命令lsmod | grep bbr 如果出现tcp_bbr字样表示bbr已安装并启动成功
-
电脑共享科学上网给手机,谷歌验证通过
1、ss客户端选项设置-本地代理-勾选“允许来自局域网的连接”
2、手机连接此电脑共享的wifi
3、连接好之后长按此wifi,勾选“显示高级选项”
4、代理服务器选择“手动”
5、代理主机名填写你自己电脑的ip地址,代理端口一般是1080
6、连接上之后,电脑上务必关掉防火墙!我就因为没关防火墙浪费半天时间!
7、如果你的电脑可以爬梯,那么手机应该也就没问题了。
-
vps地址:https://www.vultr.com
