From 9468a6427fddb49f0b1be9c53412545d5db26e9f Mon Sep 17 00:00:00 2001
From: Blankj <625783482@qq.com>
Date: Fri, 21 Apr 2017 17:29:10 +0800
Subject: [PATCH] see 04/21 log
---
README-CN.md | 1513 +++++++++--------
README.md | 1501 ++++++++--------
app/build.gradle | 4 +-
.../activity/SpannableActivity.java | 44 +-
app/src/main/res/values/dimens.xml | 2 +-
app/src/main/res/values/styles.xml | 7 +-
update_log.md | 3 +-
utilcode/project.properties | 10 +-
.../com/blankj/utilcode/util/BarUtils.java | 1 +
.../blankj/utilcode/util/PermissionUtils.java | 138 ++
.../utilcode/util/SpannableStringUtils.java | 124 +-
.../com/blankj/utilcode/util/TimeUtils.java | 514 ++++--
.../utilcode/util/EncryptUtilsTest.java | 2 +-
.../blankj/utilcode/util/FileUtilsTest.java | 8 +-
.../com/blankj/utilcode/util/TestUtils.java | 47 +-
.../blankj/utilcode/util/TimeUtilsTest.java | 6 +-
.../blankj/utilcode/util/ZipUtilsTest.java | 10 +-
17 files changed, 2220 insertions(+), 1714 deletions(-)
create mode 100644 utilcode/src/main/java/com/blankj/utilcode/util/PermissionUtils.java
diff --git a/README-CN.md b/README-CN.md
index 5353ca07ac..9e1f926c1d 100644
--- a/README-CN.md
+++ b/README-CN.md
@@ -1,753 +1,760 @@
-# Android开发人员不得不收集的代码([持续更新中][update_log.md])
-
-## [README of English][readme.md]
-
-## API
-
-* ### Activity相关→[ActivityUtils.java][activity.java]→[Demo][activity.demo]
-```
-isActivityExists : 判断是否存在Activity
-launchActivity : 打开Activity
-getLauncherActivity: 获取入口activity
-```
-
-* ### App相关→[AppUtils.java][app.java]→[Demo][app.demo]
-```
-isInstallApp : 判断App是否安装
-installApp : 安装App(支持6.0)
-installAppSilent : 静默安装App
-uninstallApp : 卸载App
-uninstallAppSilent : 静默卸载App
-isAppRoot : 判断App是否有root权限
-launchApp : 打开App
-getAppPackageName : 获取App包名
-getAppDetailsSettings: 获取App具体设置
-getAppName : 获取App名称
-getAppIcon : 获取App图标
-getAppPath : 获取App路径
-getAppVersionName : 获取App版本号
-getAppVersionCode : 获取App版本码
-isSystemApp : 判断App是否是系统应用
-isAppDebug : 判断App是否是Debug版本
-getAppSignature : 获取App签名
-getAppSignatureSHA1 : 获取应用签名的的SHA1值
-isAppForeground : 判断App是否处于前台
-getForegroundApp : 获取前台应用包名
-getAppInfo : 获取App信息
-getAppsInfo : 获取所有已安装App信息
-cleanAppData : 清除App所有数据
-```
-
-* ### 栏相关→[BarUtils.java][bar.java]
-```
-setTransparentStatusBar: 设置透明状态栏(api大于19方可使用)
-hideStatusBar : 隐藏状态栏
-getStatusBarHeight : 获取状态栏高度
-isStatusBarExists : 判断状态栏是否存在
-getActionBarHeight : 获取ActionBar高度
-showNotificationBar : 显示通知栏
-hideNotificationBar : 隐藏通知栏
-```
-
-* ### 清除相关→[CleanUtils.java][clean.java]→[Demo][clean.demo]
-```
-cleanInternalCache : 清除内部缓存
-cleanInternalFiles : 清除内部文件
-cleanInternalDbs : 清除内部数据库
-cleanInternalDbByName: 根据名称清除数据库
-cleanInternalSP : 清除内部SP
-cleanExternalCache : 清除外部缓存
-cleanCustomCache : 清除自定义目录下的文件
-```
-
-* ### 剪贴板相关→[ClipboardUtils.java][clipboard.java]
-```
-copyText : 复制文本到剪贴板
-getText : 获取剪贴板的文本
-copyUri : 复制uri到剪贴板
-getUri : 获取剪贴板的uri
-copyIntent: 复制意图到剪贴板
-getIntent : 获取剪贴板的意图
-```
-
-* ### 关闭相关→[CloseUtils.java][close.java]
-```
-closeIO : 关闭IO
-closeIOQuietly: 安静关闭IO
-```
-
-* ### 转换相关→[ConvertUtils.java][convert.java]→[Test][convert.test]
-```
-bytes2HexString, hexString2Bytes : byteArr与hexString互转
-chars2Bytes, bytes2Chars : charArr与byteArr互转
-memorySize2Byte, byte2MemorySize : 以unit为单位的内存大小与字节数互转
-byte2FitMemorySize : 字节数转合适内存大小
-timeSpan2Millis, millis2TimeSpan : 以unit为单位的时间长度与毫秒时间戳互转
-millis2FitTimeSpan : 毫秒时间戳转合适时间长度
-bytes2Bits, bits2Bytes : bytes与bits互转
-input2OutputStream, output2InputStream : inputStream与outputStream互转
-inputStream2Bytes, bytes2InputStream : inputStream与byteArr互转
-outputStream2Bytes, bytes2OutputStream : outputStream与byteArr互转
-inputStream2String, string2InputStream : inputStream与string按编码互转
-outputStream2String, string2OutputStream: outputStream与string按编码互转
-bitmap2Bytes, bytes2Bitmap : bitmap与byteArr互转
-drawable2Bitmap, bitmap2Drawable : drawable与bitmap互转
-drawable2Bytes, bytes2Drawable : drawable与byteArr互转
-view2Bitmap : view转Bitmap
-dp2px, px2dp : dp与px互转
-sp2px, px2sp : sp与px互转
-```
-
-* ### 崩溃相关→[CrashUtils.java][crash.java]
-```
-getInstance: 获取单例
-init : 初始化
-```
-
-* ### 设备相关→[DeviceUtils.java][device.java]→[Demo][device.demo]
-```
-isDeviceRooted : 判断设备是否rooted
-getSDKVersion : 获取设备系统版本号
-getAndroidID : 获取设备AndroidID
-getMacAddress : 获取设备MAC地址
-getManufacturer : 获取设备厂商
-getModel : 获取设备型号
-shutdown : 关机
-reboot : 重启
-reboot2Recovery : 重启到recovery
-reboot2Bootloader: 重启到bootloader
-```
-
-* ### 判空相关→[EmptyUtils.java][empty.java]→[Test][empty.test]
-```
-isEmpty : 判断对象是否为空
-isNotEmpty: 判断对象是否非空
-```
-
-* ### 编码解码相关→[EncodeUtils.java][encode.java]→[Test][encode.test]
-```
-urlEncode : URL编码
-urlDecode : URL解码
-base64Encode : Base64编码
-base64Encode2String: Base64编码
-base64Decode : Base64解码
-base64UrlSafeEncode: Base64URL安全编码
-htmlEncode : Html编码
-htmlDecode : Html解码
-```
-
-* ### 加密解密相关→[EncryptUtils.java][encrypt.java]→[Test][encrypt.test]
-```
-encryptMD2, encryptMD2ToString : MD2加密
-encryptMD5, encryptMD5ToString : MD5加密
-encryptMD5File, encryptMD5File2String : MD5加密文件
-encryptSHA1, encryptSHA1ToString : SHA1加密
-encryptSHA224, encryptSHA224ToString : SHA224加密
-encryptSHA256, encryptSHA256ToString : SHA256加密
-encryptSHA384, encryptSHA384ToString : SHA384加密
-encryptSHA512, encryptSHA512ToString : SHA512加密
-encryptHmacMD5, encryptHmacMD5ToString : HmacMD5加密
-encryptHmacSHA1, encryptHmacSHA1ToString : HmacSHA1加密
-encryptHmacSHA224, encryptHmacSHA224ToString : HmacSHA224加密
-encryptHmacSHA256, encryptHmacSHA256ToString : HmacSHA256加密
-encryptHmacSHA384, encryptHmacSHA384ToString : HmacSHA384加密
-encryptHmacSHA512, encryptHmacSHA512ToString : HmacSHA512加密
-encryptDES, encryptDES2HexString, encryptDES2Base64 : DES加密
-decryptDES, decryptHexStringDES, decryptBase64DES : DES解密
-encrypt3DES, encrypt3DES2HexString, encrypt3DES2Base64: 3DES加密
-decrypt3DES, decryptHexString3DES, decryptBase64_3DES : 3DES解密
-encryptAES, encryptAES2HexString, encryptAES2Base64 : AES加密
-decryptAES, decryptHexStringAES, decryptBase64AES : AES解密
-```
-
-* ### 文件相关→[FileUtils.java][file.java]→[Test][file.test]
-```
-getFileByPath : 根据文件路径获取文件
-isFileExists : 判断文件是否存在
-rename : 重命名文件
-isDir : 判断是否是目录
-isFile : 判断是否是文件
-createOrExistsDir : 判断目录是否存在,不存在则判断是否创建成功
-createOrExistsFile : 判断文件是否存在,不存在则判断是否创建成功
-createFileByDeleteOldFile: 判断文件是否存在,存在则在创建之前删除
-copyDir : 复制目录
-copyFile : 复制文件
-moveDir : 移动目录
-moveFile : 移动文件
-deleteDir : 删除目录
-deleteFile : 删除文件
-listFilesInDir : 获取目录下所有文件
-listFilesInDir : 获取目录下所有文件包括子目录
-listFilesInDirWithFilter : 获取目录下所有后缀名为suffix的文件
-listFilesInDirWithFilter : 获取目录下所有后缀名为suffix的文件包括子目录
-listFilesInDirWithFilter : 获取目录下所有符合filter的文件
-listFilesInDirWithFilter : 获取目录下所有符合filter的文件包括子目录
-searchFileInDir : 获取目录下指定文件名的文件包括子目录
-writeFileFromIS : 将输入流写入文件
-writeFileFromString : 将字符串写入文件
-readFile2List : 指定编码按行读取文件到链表中
-readFile2String : 指定编码按行读取文件到字符串中
-readFile2Bytes : 读取文件到字符数组中
-getFileLastModified : 获取文件最后修改的毫秒时间戳
-getFileCharsetSimple : 简单获取文件编码格式
-getFileLines : 获取文件行数
-getDirSize : 获取目录大小
-getFileSize : 获取文件大小
-getDirLength : 获取目录长度
-getFileLength : 获取文件长度
-getFileMD5 : 获取文件的MD5校验码
-getFileMD5ToString : 获取文件的MD5校验码
-getDirName : 根据全路径获取最长目录
-getFileName : 根据全路径获取文件名
-getFileNameNoExtension : 根据全路径获取文件名不带拓展名
-getFileExtension : 根据全路径获取文件拓展名
-```
-
-* ### Fragment相关→[FragmentUtils.java][fragment.java]→[Demo][fragment.demo]
-```
-addFragment : 新增fragment
-hideAddFragment : 先隐藏后新增fragment
-addFragments : 新增多个fragment
-removeFragment : 移除fragment
-removeToFragment : 移除到指定fragment
-removeFragments : 移除同级别fragment
-removeAllFragments : 移除所有fragment
-replaceFragment : 替换fragment
-popFragment : 出栈fragment
-popToFragment : 出栈到指定fragment
-popFragments : 出栈同级别fragment
-popAllFragments : 出栈所有fragment
-popAddFragment : 先出栈后新增fragment
-hideFragment : 隐藏fragment
-hideFragments : 隐藏同级别fragment
-showFragment : 显示fragment
-hideShowFragment : 先隐藏后显示fragment
-getLastAddFragment : 获取同级别最后加入的fragment
-getLastAddFragmentInStack: 获取栈中同级别最后加入的fragment
-getTopShowFragment : 获取顶层可见fragment
-getTopShowFragmentInStack: 获取栈中顶层可见fragment
-getFragments : 获取同级别fragment
-getFragmentsInStack : 获取栈中同级别fragment
-getAllFragments : 获取所有fragment
-getAllFragmentsInStack : 获取栈中所有fragment
-getPreFragment : 获取目标fragment的前一个fragment
-findFragment : 查找fragment
-dispatchBackPress : 处理fragment回退键
-setBackgroundColor : 设置背景色
-setBackgroundResource : 设置背景资源
-setBackground : 设置背景
-```
-
-* ### Handler相关→[HandlerUtils.java][handler.java]→[Demo][handler.demo]
-```
-HandlerHolder: 使用必读
-```
-
-* ### 图片相关→[ImageUtils.java][image.java]→[Demo][image.demo]
-```
-bitmap2Bytes, bytes2Bitmap : bitmap与byteArr互转
-drawable2Bitmap, bitmap2Drawable: drawable与bitmap互转
-drawable2Bytes, bytes2Drawable : drawable与byteArr互转
-getBitmap : 获取bitmap
-scale : 缩放图片
-clip : 裁剪图片
-skew : 倾斜图片
-rotate : 旋转图片
-getRotateDegree : 获取图片旋转角度
-toRound : 转为圆形图片
-toRoundCorner : 转为圆角图片
-fastBlur : 快速模糊
-renderScriptBlur : renderScript模糊图片
-stackBlur : stack模糊图片
-addFrame : 添加颜色边框
-addReflection : 添加倒影
-addTextWatermark : 添加文字水印
-addImageWatermark : 添加图片水印
-toAlpha : 转为alpha位图
-toGray : 转为灰度图片
-save : 保存图片
-isImage : 根据文件名判断文件是否为图片
-getImageType : 获取图片类型
-compressByScale : 按缩放压缩
-compressByQuality : 按质量压缩
-compressBySampleSize : 按采样大小压缩
-```
-
-* ### 意图相关→[IntentUtils.java][intent.java]
-```
-getInstallAppIntent : 获取安装App(支持6.0)的意图
-getUninstallAppIntent : 获取卸载App的意图
-getLaunchAppIntent : 获取打开App的意图
-getAppDetailsSettingsIntent: 获取App具体设置的意图
-getShareTextIntent : 获取分享文本的意图
-getShareImageIntent : 获取分享图片的意图
-getComponentIntent : 获取其他应用组件的意图
-getShutdownIntent : 获取关机的意图
-getCaptureIntent : 获取拍照的意图
-```
-
-* ### 键盘相关→[KeyboardUtils.java][keyboard.java]→[Demo][keyboard.demo]
-```
-hideSoftInput : 动态隐藏软键盘
-clickBlankArea2HideSoftInput: 点击屏幕空白区域隐藏软键盘
-showSoftInput : 动态显示软键盘
-toggleSoftInput : 切换键盘显示与否状态
-```
-
-* ### 定位相关→[LocationUtils.java][location.java]→[Demo][location.demo]
-```
-isGpsEnabled : 判断Gps是否可用
-isLocationEnabled: 判断定位是否可用
-openGpsSettings : 打开Gps设置界面
-register : 注册
-unregister : 注销
-getAddress : 根据经纬度获取地理位置
-getCountryName : 根据经纬度获取所在国家
-getLocality : 根据经纬度获取所在地
-getStreet : 根据经纬度获取所在街道
-```
-
-* ### 日志相关→[LogUtils.java][log.java]→[Demo][log.demo]
-```
-Builder.setLogSwitch : 设置log总开关
-Builder.setGlobalTag : 设置log全局tag
-Builder.setLogHeadSwitch : 设置log头开关
-Builder.setLog2FileSwitch: 设置log文件开关
-Builder.setBorderSwitch : 设置log边框开关
-Builder.setLogFilter : 设置log过滤器
-
-v : Verbose日志
-d : Debug日志
-i : Info日志
-w : Warn日志
-e : Error日志
-a : Assert日志
-file: log到文件
-json: log字符串之json
-xml : log字符串之xml
-```
-
-* ### 网络相关→[NetworkUtils.java][network.java]→[Demo][network.demo]
-```
-openWirelessSettings : 打开网络设置界面
-isConnected : 判断网络是否连接
-isAvailableByPing : 判断网络是否可用
-getDataEnabled : 判断移动数据是否打开
-setDataEnabled : 打开或关闭移动数据
-is4G : 判断网络是否是4G
-getWifiEnabled : 判断wifi是否打开
-setWifiEnabled : 打开或关闭wifi
-isWifiConnected : 判断wifi是否连接状态
-isWifiAvailable : 判断wifi数据是否可用
-getNetworkOperatorName: 获取移动网络运营商名称
-getNetworkType : 获取当前网络类型
-getIPAddress : 获取IP地址
-getDomainAddress : 获取域名ip地址
-```
-
-* ### 手机相关→[PhoneUtils.java][phone.java]→[Demo][phone.demo]
-```
-isPhone : 判断设备是否是手机
-getIMEI : 获取IMEI码
-getIMSI : 获取IMSI码
-getPhoneType : 获取移动终端类型
-isSimCardReady : 判断sim卡是否准备好
-getSimOperatorName : 获取Sim卡运营商名称
-getSimOperatorByMnc: 获取Sim卡运营商名称
-getPhoneStatus : 获取手机状态信息
-dial : 跳至拨号界面
-call : 拨打phoneNumber
-sendSms : 跳至发送短信界面
-sendSmsSilent : 发送短信
-getAllContactInfo : 获取手机联系人
-getContactNum : 打开手机联系人界面点击联系人后便获取该号码
-getAllSMS : 获取手机短信并保存到xml中
-```
-
-* ### 拼音相关→[PinyinUtils.java][pinyin.java]→[Test][pinyin.test]
-```
-ccs2Pinyin : 汉字转拼音
-ccs2Pinyin : 汉字转拼音
-getPinyinFirstLetter : 获取第一个汉字首字母
-getPinyinFirstLetters: 获取所有汉字的首字母
-getSurnamePinyin : 根据名字获取姓氏的拼音
-getSurnameFirstLetter: 根据名字获取姓氏的首字母
-```
-
-* ### 进程相关→[ProcessUtils.java][process.java]→[Demo][process.demo]
-```
-getForegroundProcessName : 获取前台线程包名
-killAllBackgroundProcesses: 杀死所有的后台服务进程
-killBackgroundProcesses : 杀死后台服务进程
-```
-
-* ### 正则相关→[RegexUtils.java][regex.java]→[Test][regex.test]
-```
-isMobileSimple : 验证手机号(简单)
-isMobileExact : 验证手机号(精确)
-isTel : 验证电话号码
-isIDCard15 : 验证身份证号码15位
-isIDCard18 : 验证身份证号码18位
-isEmail : 验证邮箱
-isURL : 验证URL
-isZh : 验证汉字
-isUsername : 验证用户名
-isDate : 验证yyyy-MM-dd格式的日期校验,已考虑平闰年
-isIP : 验证IP地址
-isMatch : 判断是否匹配正则
-getMatches : 获取正则匹配的部分
-getSplits : 获取正则匹配分组
-getReplaceFirst: 替换正则匹配的第一部分
-getReplaceAll : 替换所有正则匹配的部分
-```
-
-* ### 屏幕相关→[ScreenUtils.java][screen.java]
-```
-getScreenWidth : 获取屏幕的宽度(单位:px)
-getScreenHeight : 获取屏幕的高度(单位:px)
-setLandscape : 设置屏幕为横屏
-setPortrait : 设置屏幕为竖屏
-isLandscape : 判断是否横屏
-isPortrait : 判断是否竖屏
-getScreenRotation : 获取屏幕旋转角度
-captureWithStatusBar : 获取当前屏幕截图,包含状态栏
-captureWithoutStatusBar: 获取当前屏幕截图,不包含状态栏
-isScreenLock : 判断是否锁屏
-```
-
-* ### SD卡相关→[SDCardUtils.java][sdcard.java]→[Demo][sdcard.demo]
-```
-isSDCardEnable: 判断SD卡是否可用
-getSDCardPath : 获取SD卡路径
-getDataPath : 获取SD卡Data路径
-getFreeSpace : 计算SD卡的剩余空间
-getSDCardInfo : 获取SD卡信息
-```
-
-* ### 服务相关→[ServiceUtils.java][service.java]
-```
-getAllRunningService: 获取所有运行的服务
-startService : 启动服务
-stopService : 停止服务
-bindService : 绑定服务
-unbindService : 解绑服务
-isServiceRunning : 判断服务是否运行
-```
-
-* ### Shell相关→[ShellUtils.java][shell.java]
-```
-execCmd: 是否是在root下执行命令
-```
-
-* ### 尺寸相关→[SizeUtils.java][size.java]
-```
-dp2px, px2dp : dp与px转换
-sp2px, px2sp : sp与px转换
-applyDimension : 各种单位转换
-forceGetViewSize : 在onCreate中获取视图的尺寸
-measureView : 测量视图尺寸
-getMeasuredWidth : 获取测量视图宽度
-getMeasuredHeight: 获取测量视图高度
-```
-
-* ### Snackbar相关→[SnackbarUtils.java][snackbar.java]→[Demo][snackbar.demo]
-```
-showShortSnackbar : 显示短时snackbar
-showLongSnackbar : 显示长时snackbar
-showIndefiniteSnackbar: 显示自定义时长snackbar
-addView : 为SnackBar添加布局
-dismissSnackbar : 取消snackbar显示
-```
-
-* ### SpannableString相关→[SpannableStringUtils.java][spannable.java]→[Demo][spannable.demo]
-```
-getBuilder : 获取建造者
-setFlag : 设置标识
-setForegroundColor: 设置前景色
-setBackgroundColor: 设置背景色
-setQuoteColor : 设置引用线的颜色
-setLeadingMargin : 设置缩进
-setBullet : 设置列表标记
-setProportion : 设置字体比例
-setXProportion : 设置字体横向比例
-setStrikethrough : 设置删除线
-setUnderline : 设置下划线
-setSuperscript : 设置上标
-setSubscript : 设置下标
-setBold : 设置粗体
-setItalic : 设置斜体
-setBoldItalic : 设置粗斜体
-setFontFamily : 设置字体
-setAlign : 设置对齐
-setBitmap : 设置图片
-setDrawable : 设置图片
-setUri : 设置图片
-setResourceId : 设置图片
-setClickSpan : 设置点击事件
-setUrl : 设置超链接
-setBlur : 设置模糊
-append : 追加样式字符串
-create : 创建样式字符串
-```
-
-* ### SP相关→[SPUtils.java][sp.java]→[Test][sp.test]
-```
-SPUtils : SPUtils构造函数
-put : SP中写入数据
-getString : SP中读取String
-putInt : SP中写入int类型value
-getInt : SP中读取int
-putLong : SP中写入long类型value
-getLong : SP中读取long
-putFloat : SP中写入float类型value
-getFloat : SP中读取float
-putBoolean: SP中写入boolean类型value
-getBoolean: SP中读取boolean
-getAll : SP中获取所有键值对
-remove : SP中移除该key
-contains : SP中是否存在该key
-clear : SP中清除所有数据
-```
-
-* ### 字符串相关→[StringUtils.java][string.java]→[Test][string.test]
-```
-isEmpty : 判断字符串是否为null或长度为0
-isTrimEmpty : 判断字符串是否为null或全为空格
-isSpace : 判断字符串是否为null或全为空白字符
-equals : 判断两字符串是否相等
-equalsIgnoreCase: 判断两字符串忽略大小写是否相等
-null2Length0 : null转为长度为0的字符串
-length : 返回字符串长度
-upperFirstLetter: 首字母大写
-lowerFirstLetter: 首字母小写
-reverse : 反转字符串
-toDBC : 转化为半角字符
-toSBC : 转化为全角字符
-```
-
-* ### 线程池相关→[ThreadPoolUtils.java][thread_pool.java]
-```
-ThreadPoolUtils : ThreadPoolUtils构造函数
-execute : 在未来某个时间执行给定的命令
-execute : 在未来某个时间执行给定的命令链表
-shutDown : 待以前提交的任务执行完毕后关闭线程池
-shutDownNow : 试图停止所有正在执行的活动任务
-isShutDown : 判断线程池是否已关闭
-isTerminated : 关闭线程池后判断所有任务是否都已完成
-awaitTermination : 请求关闭、发生超时或者当前线程中断
-submit : 提交一个Callable任务用于执行
-submit : 提交一个Runnable任务用于执行
-invokeAll, invokeAny : 执行给定的任务
-schedule : 延迟执行Runnable命令
-schedule : 延迟执行Callable命令
-scheduleWithFixedRate : 延迟并循环执行命令
-scheduleWithFixedDelay: 延迟并以固定休息时间循环执行命令
-```
-
-* ### 时间相关→[TimeUtils.java][time.java]→[Test][time.test]
-```
-millis2String : 将时间戳转为时间字符串
-string2Millis : 将时间字符串转为时间戳
-string2Date : 将时间字符串转为Date类型
-date2String : 将Date类型转为时间字符串
-date2Millis : 将Date类型转为时间戳
-millis2Date : 将时间戳转为Date类型
-getTimeSpan : 获取两个时间差(单位:unit)
-getFitTimeSpan : 获取合适型两个时间差
-getNowTimeMills : 获取当前毫秒时间戳
-getNowTimeString : 获取当前时间字符串
-getNowTimeDate : 获取当前Date
-getTimeSpanByNow : 获取与当前时间的差(单位:unit)
-getFitTimeSpanByNow : 获取合适型与当前时间的差
-getFriendlyTimeSpanByNow: 获取友好型与当前时间的差
-isSameDay : 判断是否同一天
-isLeapYear : 判断是否闰年
-getWeek, getWeekIndex : 获取星期
-getWeekOfMonth : 获取月份中的第几周
-getWeekOfYear : 获取年份中的第几周
-getChineseZodiac : 获取生肖
-getZodiac : 获取星座
-```
-
-* ### 吐司相关→[ToastUtils.java][toast.java]→[Demo][toast.demo]
-```
-init : 吐司初始化
-showShortToastSafe: 安全地显示短时吐司
-showLongToastSafe : 安全地显示长时吐司
-showShortToast : 显示短时吐司
-showLongToast : 显示长时吐司
-cancelToast : 取消吐司显示
-```
-
-* ### 压缩相关→[ZipUtils.java][zip.java]→[Test][zip.test]
-```
-zipFiles : 批量压缩文件
-zipFile : 压缩文件
-unzipFiles : 批量解压文件
-unzipFile : 解压文件
-unzipFileByKeyword: 解压带有关键字的文件
-getFilesPath : 获取压缩文件中的文件路径链表
-getComments : 获取压缩文件中的注释链表
-getEntries : 获取压缩文件中的文件对象
-```
-
-* ### 更新Log→[update_log.md][update_log.md]
-
-***
-
-## About
-
-* 做这份整理是想把它作为Android开发的小字典,当遇到一些琐碎问题时,不用再面向百度或者谷歌查询API的使用,费时费力,这里有的话,大家尽管撸走;同时也希望它能逐日壮大起来,期待大家的Star和完善,当然我也会一直更新发布版本和日志,为了方便大家导入,现已上传jcenter;其中很多代码也是汇四方之精华,谢谢前辈们的提供,当然最终还是要通过单元测试的,如有错误,请及时告之。
-* QQ群提供讨论,1群:74721490(已满)2群:25206533,至于验证问题对大家来说肯定都是小case。关于群:[在别人生活里低调地做配角(我和466个程序员的故事)][group]。
-* 我的[微博][weibo],求个关注哈。
-
-## Download
-
-Gradle:
-``` groovy
-compile 'com.blankj:utilcode:1.3.8'
-```
-
-## How to use
-
-```
-Utils.init(context);
-```
-
-## Proguard
-
-```
--keep class com.blankj.utilcode.** { *; }
--keepclassmembers class com.blankj.utilcode.** { *; }
--dontwarn com.blankj.utilcode.**
-```
-
-## License
-
-```
-Copyright 2016 Blankj
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-```
-
-[update_log.md]: https://github.com/Blankj/AndroidUtilCode/blob/master/update_log.md
-
-[readme.md]: https://github.com/Blankj/AndroidUtilCode
-[readme-cn.md]: https://github.com/Blankj/AndroidUtilCode/blob/master/README-CN.md
-
-[activity.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ActivityUtils.java
-[activity.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/ActivityActivity.java
-
-[app.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/AppUtils.java
-[app.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/AppActivity.java
-
-[bar.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/BarUtils.java
-
-[clean.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/CleanUtils.java
-[clean.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/CleanActivity.java
-
-[clipboard.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ClipboardUtils.java
-
-[close.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/CloseUtils.java
-
-[convert.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ConvertUtils.java
-[convert.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/ConvertUtilsTest.java
-
-[crash.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/CrashUtils.java
-
-[device.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/DeviceUtils.java
-[device.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/DeviceActivity.java
-
-[empty.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/EmptyUtils.java
-[empty.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/EmptyUtilsTest.java
-
-[encode.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/EncodeUtils.java
-[encode.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/EncodeUtilsTest.java
-
-[encrypt.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/EncryptUtils.java
-[encrypt.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/EncryptUtilsTest.java
-
-[file.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/FileUtils.java
-[file.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/FileUtilsTest.java
-
-[fragment.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/FragmentUtils.java
-[fragment.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/FragmentActivity.java
-
-[handler.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/HandlerUtils.java
-[handler.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/HandlerActivity.java
-
-[image.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ImageUtils.java
-[image.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/ImageActivity.java
-
-[intent.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/IntentUtils.java
-
-[keyboard.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/KeyboardUtils.java
-[keyboard.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/KeyboardActivity.java
-
-[location.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/LocationUtils.java
-[location.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/LocationActivity.java
-
-[log.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/LogUtils.java
-[log.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/LogActivity.java
-
-[network.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/NetworkUtils.java
-[network.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/NetworkActivity.java
-
-[phone.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/PhoneUtils.java
-[phone.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/PhoneActivity.java
-
-[pinyin.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/PinyinUtils.java
-[pinyin.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/PinyinUtilsTest.java
-
-[process.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ProcessUtils.java
-[process.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/ProcessActivity.java
-
-[regex.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/RegexUtils.java
-[regex.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/RegexUtilsTest.java
-
-[screen.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ScreenUtils.java
-
-[sdcard.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SDCardUtils.java
-[sdcard.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/SDCardActivity.java
-
-[service.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ServiceUtils.java
-
-[shell.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ShellUtils.java
-
-[size.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SizeUtils.java
-
-[snackbar.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SnackbarUtils.java
-[snackbar.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/SnackbarActivity.java
-
-[spannable.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SpannableStringUtils.java
-[spannable.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/SpannableActivity.java
-
-[sp.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SPUtils.java
-[sp.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/SPUtilsTest.java
-
-[string.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/StringUtils.java
-[string.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/StringUtilsTest.java
-
-[thread_pool.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ThreadPoolUtils.java
-
-[time.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/TimeUtils.java
-[time.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/TimeUtilsTest.java
-
-[toast.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ToastUtils.java
-[toast.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/ToastActivity.java
-
-[zip.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ZipUtils.java
-[zip.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/ZipUtilsTest.java
-
-[group]: http://www.jianshu.com/p/8938015df951
-[weibo]: http://weibo.com/blankcmj
+# Android开发人员不得不收集的代码([持续更新中][update_log.md])
+
+## [README of English][readme.md]
+
+## API
+
+* ### Activity相关→[ActivityUtils.java][activity.java]→[Demo][activity.demo]
+```
+isActivityExists : 判断是否存在Activity
+launchActivity : 打开Activity
+getLauncherActivity: 获取入口activity
+```
+
+* ### App相关→[AppUtils.java][app.java]→[Demo][app.demo]
+```
+isInstallApp : 判断App是否安装
+installApp : 安装App(支持6.0)
+installAppSilent : 静默安装App
+uninstallApp : 卸载App
+uninstallAppSilent : 静默卸载App
+isAppRoot : 判断App是否有root权限
+launchApp : 打开App
+getAppPackageName : 获取App包名
+getAppDetailsSettings: 获取App具体设置
+getAppName : 获取App名称
+getAppIcon : 获取App图标
+getAppPath : 获取App路径
+getAppVersionName : 获取App版本号
+getAppVersionCode : 获取App版本码
+isSystemApp : 判断App是否是系统应用
+isAppDebug : 判断App是否是Debug版本
+getAppSignature : 获取App签名
+getAppSignatureSHA1 : 获取应用签名的的SHA1值
+isAppForeground : 判断App是否处于前台
+getForegroundApp : 获取前台应用包名
+getAppInfo : 获取App信息
+getAppsInfo : 获取所有已安装App信息
+cleanAppData : 清除App所有数据
+```
+
+* ### 栏相关→[BarUtils.java][bar.java]
+```
+setTransparentStatusBar: 设置透明状态栏(api大于19方可使用)
+hideStatusBar : 隐藏状态栏
+getStatusBarHeight : 获取状态栏高度
+isStatusBarExists : 判断状态栏是否存在
+getActionBarHeight : 获取ActionBar高度
+showNotificationBar : 显示通知栏
+hideNotificationBar : 隐藏通知栏
+```
+
+* ### 清除相关→[CleanUtils.java][clean.java]→[Demo][clean.demo]
+```
+cleanInternalCache : 清除内部缓存
+cleanInternalFiles : 清除内部文件
+cleanInternalDbs : 清除内部数据库
+cleanInternalDbByName: 根据名称清除数据库
+cleanInternalSP : 清除内部SP
+cleanExternalCache : 清除外部缓存
+cleanCustomCache : 清除自定义目录下的文件
+```
+
+* ### 剪贴板相关→[ClipboardUtils.java][clipboard.java]
+```
+copyText : 复制文本到剪贴板
+getText : 获取剪贴板的文本
+copyUri : 复制uri到剪贴板
+getUri : 获取剪贴板的uri
+copyIntent: 复制意图到剪贴板
+getIntent : 获取剪贴板的意图
+```
+
+* ### 关闭相关→[CloseUtils.java][close.java]
+```
+closeIO : 关闭IO
+closeIOQuietly: 安静关闭IO
+```
+
+* ### 转换相关→[ConvertUtils.java][convert.java]→[Test][convert.test]
+```
+bytes2HexString, hexString2Bytes : byteArr与hexString互转
+chars2Bytes, bytes2Chars : charArr与byteArr互转
+memorySize2Byte, byte2MemorySize : 以unit为单位的内存大小与字节数互转
+byte2FitMemorySize : 字节数转合适内存大小
+timeSpan2Millis, millis2TimeSpan : 以unit为单位的时间长度与毫秒时间戳互转
+millis2FitTimeSpan : 毫秒时间戳转合适时间长度
+bytes2Bits, bits2Bytes : bytes与bits互转
+input2OutputStream, output2InputStream : inputStream与outputStream互转
+inputStream2Bytes, bytes2InputStream : inputStream与byteArr互转
+outputStream2Bytes, bytes2OutputStream : outputStream与byteArr互转
+inputStream2String, string2InputStream : inputStream与string按编码互转
+outputStream2String, string2OutputStream: outputStream与string按编码互转
+bitmap2Bytes, bytes2Bitmap : bitmap与byteArr互转
+drawable2Bitmap, bitmap2Drawable : drawable与bitmap互转
+drawable2Bytes, bytes2Drawable : drawable与byteArr互转
+view2Bitmap : view转Bitmap
+dp2px, px2dp : dp与px互转
+sp2px, px2sp : sp与px互转
+```
+
+* ### 崩溃相关→[CrashUtils.java][crash.java]
+```
+getInstance: 获取单例
+init : 初始化
+```
+
+* ### 设备相关→[DeviceUtils.java][device.java]→[Demo][device.demo]
+```
+isDeviceRooted : 判断设备是否rooted
+getSDKVersion : 获取设备系统版本号
+getAndroidID : 获取设备AndroidID
+getMacAddress : 获取设备MAC地址
+getManufacturer : 获取设备厂商
+getModel : 获取设备型号
+shutdown : 关机
+reboot : 重启
+reboot2Recovery : 重启到recovery
+reboot2Bootloader: 重启到bootloader
+```
+
+* ### 判空相关→[EmptyUtils.java][empty.java]→[Test][empty.test]
+```
+isEmpty : 判断对象是否为空
+isNotEmpty: 判断对象是否非空
+```
+
+* ### 编码解码相关→[EncodeUtils.java][encode.java]→[Test][encode.test]
+```
+urlEncode : URL编码
+urlDecode : URL解码
+base64Encode : Base64编码
+base64Encode2String: Base64编码
+base64Decode : Base64解码
+base64UrlSafeEncode: Base64URL安全编码
+htmlEncode : Html编码
+htmlDecode : Html解码
+```
+
+* ### 加密解密相关→[EncryptUtils.java][encrypt.java]→[Test][encrypt.test]
+```
+encryptMD2, encryptMD2ToString : MD2加密
+encryptMD5, encryptMD5ToString : MD5加密
+encryptMD5File, encryptMD5File2String : MD5加密文件
+encryptSHA1, encryptSHA1ToString : SHA1加密
+encryptSHA224, encryptSHA224ToString : SHA224加密
+encryptSHA256, encryptSHA256ToString : SHA256加密
+encryptSHA384, encryptSHA384ToString : SHA384加密
+encryptSHA512, encryptSHA512ToString : SHA512加密
+encryptHmacMD5, encryptHmacMD5ToString : HmacMD5加密
+encryptHmacSHA1, encryptHmacSHA1ToString : HmacSHA1加密
+encryptHmacSHA224, encryptHmacSHA224ToString : HmacSHA224加密
+encryptHmacSHA256, encryptHmacSHA256ToString : HmacSHA256加密
+encryptHmacSHA384, encryptHmacSHA384ToString : HmacSHA384加密
+encryptHmacSHA512, encryptHmacSHA512ToString : HmacSHA512加密
+encryptDES, encryptDES2HexString, encryptDES2Base64 : DES加密
+decryptDES, decryptHexStringDES, decryptBase64DES : DES解密
+encrypt3DES, encrypt3DES2HexString, encrypt3DES2Base64: 3DES加密
+decrypt3DES, decryptHexString3DES, decryptBase64_3DES : 3DES解密
+encryptAES, encryptAES2HexString, encryptAES2Base64 : AES加密
+decryptAES, decryptHexStringAES, decryptBase64AES : AES解密
+```
+
+* ### 文件相关→[FileUtils.java][file.java]→[Test][file.test]
+```
+getFileByPath : 根据文件路径获取文件
+isFileExists : 判断文件是否存在
+rename : 重命名文件
+isDir : 判断是否是目录
+isFile : 判断是否是文件
+createOrExistsDir : 判断目录是否存在,不存在则判断是否创建成功
+createOrExistsFile : 判断文件是否存在,不存在则判断是否创建成功
+createFileByDeleteOldFile: 判断文件是否存在,存在则在创建之前删除
+copyDir : 复制目录
+copyFile : 复制文件
+moveDir : 移动目录
+moveFile : 移动文件
+deleteDir : 删除目录
+deleteFile : 删除文件
+listFilesInDir : 获取目录下所有文件
+listFilesInDir : 获取目录下所有文件包括子目录
+listFilesInDirWithFilter : 获取目录下所有后缀名为suffix的文件
+listFilesInDirWithFilter : 获取目录下所有后缀名为suffix的文件包括子目录
+listFilesInDirWithFilter : 获取目录下所有符合filter的文件
+listFilesInDirWithFilter : 获取目录下所有符合filter的文件包括子目录
+searchFileInDir : 获取目录下指定文件名的文件包括子目录
+writeFileFromIS : 将输入流写入文件
+writeFileFromString : 将字符串写入文件
+readFile2List : 指定编码按行读取文件到链表中
+readFile2String : 指定编码按行读取文件到字符串中
+readFile2Bytes : 读取文件到字符数组中
+getFileLastModified : 获取文件最后修改的毫秒时间戳
+getFileCharsetSimple : 简单获取文件编码格式
+getFileLines : 获取文件行数
+getDirSize : 获取目录大小
+getFileSize : 获取文件大小
+getDirLength : 获取目录长度
+getFileLength : 获取文件长度
+getFileMD5 : 获取文件的MD5校验码
+getFileMD5ToString : 获取文件的MD5校验码
+getDirName : 根据全路径获取最长目录
+getFileName : 根据全路径获取文件名
+getFileNameNoExtension : 根据全路径获取文件名不带拓展名
+getFileExtension : 根据全路径获取文件拓展名
+```
+
+* ### Fragment相关→[FragmentUtils.java][fragment.java]→[Demo][fragment.demo]
+```
+addFragment : 新增fragment
+hideAddFragment : 先隐藏后新增fragment
+addFragments : 新增多个fragment
+removeFragment : 移除fragment
+removeToFragment : 移除到指定fragment
+removeFragments : 移除同级别fragment
+removeAllFragments : 移除所有fragment
+replaceFragment : 替换fragment
+popFragment : 出栈fragment
+popToFragment : 出栈到指定fragment
+popFragments : 出栈同级别fragment
+popAllFragments : 出栈所有fragment
+popAddFragment : 先出栈后新增fragment
+hideFragment : 隐藏fragment
+hideFragments : 隐藏同级别fragment
+showFragment : 显示fragment
+hideShowFragment : 先隐藏后显示fragment
+getLastAddFragment : 获取同级别最后加入的fragment
+getLastAddFragmentInStack: 获取栈中同级别最后加入的fragment
+getTopShowFragment : 获取顶层可见fragment
+getTopShowFragmentInStack: 获取栈中顶层可见fragment
+getFragments : 获取同级别fragment
+getFragmentsInStack : 获取栈中同级别fragment
+getAllFragments : 获取所有fragment
+getAllFragmentsInStack : 获取栈中所有fragment
+getPreFragment : 获取目标fragment的前一个fragment
+findFragment : 查找fragment
+dispatchBackPress : 处理fragment回退键
+setBackgroundColor : 设置背景色
+setBackgroundResource : 设置背景资源
+setBackground : 设置背景
+```
+
+* ### Handler相关→[HandlerUtils.java][handler.java]→[Demo][handler.demo]
+```
+HandlerHolder: 使用必读
+```
+
+* ### 图片相关→[ImageUtils.java][image.java]→[Demo][image.demo]
+```
+bitmap2Bytes, bytes2Bitmap : bitmap与byteArr互转
+drawable2Bitmap, bitmap2Drawable: drawable与bitmap互转
+drawable2Bytes, bytes2Drawable : drawable与byteArr互转
+getBitmap : 获取bitmap
+scale : 缩放图片
+clip : 裁剪图片
+skew : 倾斜图片
+rotate : 旋转图片
+getRotateDegree : 获取图片旋转角度
+toRound : 转为圆形图片
+toRoundCorner : 转为圆角图片
+fastBlur : 快速模糊
+renderScriptBlur : renderScript模糊图片
+stackBlur : stack模糊图片
+addFrame : 添加颜色边框
+addReflection : 添加倒影
+addTextWatermark : 添加文字水印
+addImageWatermark : 添加图片水印
+toAlpha : 转为alpha位图
+toGray : 转为灰度图片
+save : 保存图片
+isImage : 根据文件名判断文件是否为图片
+getImageType : 获取图片类型
+compressByScale : 按缩放压缩
+compressByQuality : 按质量压缩
+compressBySampleSize : 按采样大小压缩
+```
+
+* ### 意图相关→[IntentUtils.java][intent.java]
+```
+getInstallAppIntent : 获取安装App(支持6.0)的意图
+getUninstallAppIntent : 获取卸载App的意图
+getLaunchAppIntent : 获取打开App的意图
+getAppDetailsSettingsIntent: 获取App具体设置的意图
+getShareTextIntent : 获取分享文本的意图
+getShareImageIntent : 获取分享图片的意图
+getComponentIntent : 获取其他应用组件的意图
+getShutdownIntent : 获取关机的意图
+getCaptureIntent : 获取拍照的意图
+```
+
+* ### 键盘相关→[KeyboardUtils.java][keyboard.java]→[Demo][keyboard.demo]
+```
+hideSoftInput : 动态隐藏软键盘
+clickBlankArea2HideSoftInput: 点击屏幕空白区域隐藏软键盘
+showSoftInput : 动态显示软键盘
+toggleSoftInput : 切换键盘显示与否状态
+```
+
+* ### 定位相关→[LocationUtils.java][location.java]→[Demo][location.demo]
+```
+isGpsEnabled : 判断Gps是否可用
+isLocationEnabled: 判断定位是否可用
+openGpsSettings : 打开Gps设置界面
+register : 注册
+unregister : 注销
+getAddress : 根据经纬度获取地理位置
+getCountryName : 根据经纬度获取所在国家
+getLocality : 根据经纬度获取所在地
+getStreet : 根据经纬度获取所在街道
+```
+
+* ### 日志相关→[LogUtils.java][log.java]→[Demo][log.demo]
+```
+Builder.setLogSwitch : 设置log总开关
+Builder.setGlobalTag : 设置log全局tag
+Builder.setLogHeadSwitch : 设置log头开关
+Builder.setLog2FileSwitch: 设置log文件开关
+Builder.setBorderSwitch : 设置log边框开关
+Builder.setLogFilter : 设置log过滤器
+
+v : Verbose日志
+d : Debug日志
+i : Info日志
+w : Warn日志
+e : Error日志
+a : Assert日志
+file: log到文件
+json: log字符串之json
+xml : log字符串之xml
+```
+
+* ### 网络相关→[NetworkUtils.java][network.java]→[Demo][network.demo]
+```
+openWirelessSettings : 打开网络设置界面
+isConnected : 判断网络是否连接
+isAvailableByPing : 判断网络是否可用
+getDataEnabled : 判断移动数据是否打开
+setDataEnabled : 打开或关闭移动数据
+is4G : 判断网络是否是4G
+getWifiEnabled : 判断wifi是否打开
+setWifiEnabled : 打开或关闭wifi
+isWifiConnected : 判断wifi是否连接状态
+isWifiAvailable : 判断wifi数据是否可用
+getNetworkOperatorName: 获取移动网络运营商名称
+getNetworkType : 获取当前网络类型
+getIPAddress : 获取IP地址
+getDomainAddress : 获取域名ip地址
+```
+
+* ### 手机相关→[PhoneUtils.java][phone.java]→[Demo][phone.demo]
+```
+isPhone : 判断设备是否是手机
+getIMEI : 获取IMEI码
+getIMSI : 获取IMSI码
+getPhoneType : 获取移动终端类型
+isSimCardReady : 判断sim卡是否准备好
+getSimOperatorName : 获取Sim卡运营商名称
+getSimOperatorByMnc: 获取Sim卡运营商名称
+getPhoneStatus : 获取手机状态信息
+dial : 跳至拨号界面
+call : 拨打phoneNumber
+sendSms : 跳至发送短信界面
+sendSmsSilent : 发送短信
+getAllContactInfo : 获取手机联系人
+getContactNum : 打开手机联系人界面点击联系人后便获取该号码
+getAllSMS : 获取手机短信并保存到xml中
+```
+
+* ### 拼音相关→[PinyinUtils.java][pinyin.java]→[Test][pinyin.test]
+```
+ccs2Pinyin : 汉字转拼音
+ccs2Pinyin : 汉字转拼音
+getPinyinFirstLetter : 获取第一个汉字首字母
+getPinyinFirstLetters: 获取所有汉字的首字母
+getSurnamePinyin : 根据名字获取姓氏的拼音
+getSurnameFirstLetter: 根据名字获取姓氏的首字母
+```
+
+* ### 进程相关→[ProcessUtils.java][process.java]→[Demo][process.demo]
+```
+getForegroundProcessName : 获取前台线程包名
+killAllBackgroundProcesses: 杀死所有的后台服务进程
+killBackgroundProcesses : 杀死后台服务进程
+```
+
+* ### 正则相关→[RegexUtils.java][regex.java]→[Test][regex.test]
+```
+isMobileSimple : 验证手机号(简单)
+isMobileExact : 验证手机号(精确)
+isTel : 验证电话号码
+isIDCard15 : 验证身份证号码15位
+isIDCard18 : 验证身份证号码18位
+isEmail : 验证邮箱
+isURL : 验证URL
+isZh : 验证汉字
+isUsername : 验证用户名
+isDate : 验证yyyy-MM-dd格式的日期校验,已考虑平闰年
+isIP : 验证IP地址
+isMatch : 判断是否匹配正则
+getMatches : 获取正则匹配的部分
+getSplits : 获取正则匹配分组
+getReplaceFirst: 替换正则匹配的第一部分
+getReplaceAll : 替换所有正则匹配的部分
+```
+
+* ### 屏幕相关→[ScreenUtils.java][screen.java]
+```
+getScreenWidth : 获取屏幕的宽度(单位:px)
+getScreenHeight : 获取屏幕的高度(单位:px)
+setLandscape : 设置屏幕为横屏
+setPortrait : 设置屏幕为竖屏
+isLandscape : 判断是否横屏
+isPortrait : 判断是否竖屏
+getScreenRotation : 获取屏幕旋转角度
+captureWithStatusBar : 获取当前屏幕截图,包含状态栏
+captureWithoutStatusBar: 获取当前屏幕截图,不包含状态栏
+isScreenLock : 判断是否锁屏
+```
+
+* ### SD卡相关→[SDCardUtils.java][sdcard.java]→[Demo][sdcard.demo]
+```
+isSDCardEnable: 判断SD卡是否可用
+getSDCardPath : 获取SD卡路径
+getDataPath : 获取SD卡Data路径
+getFreeSpace : 计算SD卡的剩余空间
+getSDCardInfo : 获取SD卡信息
+```
+
+* ### 服务相关→[ServiceUtils.java][service.java]
+```
+getAllRunningService: 获取所有运行的服务
+startService : 启动服务
+stopService : 停止服务
+bindService : 绑定服务
+unbindService : 解绑服务
+isServiceRunning : 判断服务是否运行
+```
+
+* ### Shell相关→[ShellUtils.java][shell.java]
+```
+execCmd: 是否是在root下执行命令
+```
+
+* ### 尺寸相关→[SizeUtils.java][size.java]
+```
+dp2px, px2dp : dp与px转换
+sp2px, px2sp : sp与px转换
+applyDimension : 各种单位转换
+forceGetViewSize : 在onCreate中获取视图的尺寸
+measureView : 测量视图尺寸
+getMeasuredWidth : 获取测量视图宽度
+getMeasuredHeight: 获取测量视图高度
+```
+
+* ### Snackbar相关→[SnackbarUtils.java][snackbar.java]→[Demo][snackbar.demo]
+```
+showShortSnackbar : 显示短时snackbar
+showLongSnackbar : 显示长时snackbar
+showIndefiniteSnackbar: 显示自定义时长snackbar
+addView : 为SnackBar添加布局
+dismissSnackbar : 取消snackbar显示
+```
+
+* ### SpannableString相关→[SpannableStringUtils.java][spannable.java]→[Demo][spannable.demo]
+```
+Builder.getBuilder : 获取建造者
+Builder.setFlag : 设置标识
+Builder.setForegroundColor: 设置前景色
+Builder.setBackgroundColor: 设置背景色
+Builder.setQuoteColor : 设置引用线的颜色
+Builder.setLeadingMargin : 设置缩进
+Builder.setBullet : 设置列表标记
+Builder.setFontSize : 设置字体尺寸
+Builder.setFontProportion : 设置字体比例
+Builder.setFontXProportion: 设置字体横向比例
+Builder.setStrikethrough : 设置删除线
+Builder.setUnderline : 设置下划线
+Builder.setSuperscript : 设置上标
+Builder.setSubscript : 设置下标
+Builder.setBold : 设置粗体
+Builder.setItalic : 设置斜体
+Builder.setBoldItalic : 设置粗斜体
+Builder.setFontFamily : 设置字体
+Builder.setAlign : 设置对齐
+Builder.setBitmap : 设置图片
+Builder.setDrawable : 设置图片
+Builder.setUri : 设置图片
+Builder.setResourceId : 设置图片
+Builder.setClickSpan : 设置点击事件
+Builder.setUrl : 设置超链接
+Builder.setBlur : 设置模糊
+Builder.append : 追加样式字符串
+Builder.create : 创建样式字符串
+```
+
+* ### SP相关→[SPUtils.java][sp.java]→[Test][sp.test]
+```
+SPUtils : SPUtils构造函数
+put : SP中写入数据
+getString : SP中读取String
+putInt : SP中写入int类型value
+getInt : SP中读取int
+putLong : SP中写入long类型value
+getLong : SP中读取long
+putFloat : SP中写入float类型value
+getFloat : SP中读取float
+putBoolean: SP中写入boolean类型value
+getBoolean: SP中读取boolean
+getAll : SP中获取所有键值对
+remove : SP中移除该key
+contains : SP中是否存在该key
+clear : SP中清除所有数据
+```
+
+* ### 字符串相关→[StringUtils.java][string.java]→[Test][string.test]
+```
+isEmpty : 判断字符串是否为null或长度为0
+isTrimEmpty : 判断字符串是否为null或全为空格
+isSpace : 判断字符串是否为null或全为空白字符
+equals : 判断两字符串是否相等
+equalsIgnoreCase: 判断两字符串忽略大小写是否相等
+null2Length0 : null转为长度为0的字符串
+length : 返回字符串长度
+upperFirstLetter: 首字母大写
+lowerFirstLetter: 首字母小写
+reverse : 反转字符串
+toDBC : 转化为半角字符
+toSBC : 转化为全角字符
+```
+
+* ### 线程池相关→[ThreadPoolUtils.java][thread_pool.java]
+```
+ThreadPoolUtils : ThreadPoolUtils构造函数
+execute : 在未来某个时间执行给定的命令
+execute : 在未来某个时间执行给定的命令链表
+shutDown : 待以前提交的任务执行完毕后关闭线程池
+shutDownNow : 试图停止所有正在执行的活动任务
+isShutDown : 判断线程池是否已关闭
+isTerminated : 关闭线程池后判断所有任务是否都已完成
+awaitTermination : 请求关闭、发生超时或者当前线程中断
+submit : 提交一个Callable任务用于执行
+submit : 提交一个Runnable任务用于执行
+invokeAll, invokeAny : 执行给定的任务
+schedule : 延迟执行Runnable命令
+schedule : 延迟执行Callable命令
+scheduleWithFixedRate : 延迟并循环执行命令
+scheduleWithFixedDelay: 延迟并以固定休息时间循环执行命令
+```
+
+* ### 时间相关→[TimeUtils.java][time.java]→[Test][time.test]
+```
+millis2String : 将时间戳转为时间字符串
+string2Millis : 将时间字符串转为时间戳
+string2Date : 将时间字符串转为Date类型
+date2String : 将Date类型转为时间字符串
+date2Millis : 将Date类型转为时间戳
+millis2Date : 将时间戳转为Date类型
+getTimeSpan : 获取两个时间差(单位:unit)
+getFitTimeSpan : 获取合适型两个时间差
+getNowMills : 获取当前毫秒时间戳
+getNowString : 获取当前时间字符串
+getNowDate : 获取当前Date
+getTimeSpanByNow : 获取与当前时间的差(单位:unit)
+getFitTimeSpanByNow : 获取合适型与当前时间的差
+getFriendlyTimeSpanByNow: 获取友好型与当前时间的差
+getMillis : 获取与给定时间等于时间差的时间戳
+getString : 获取与给定时间等于时间差的时间字符串
+getDate : 获取与给定时间等于时间差的Date
+getMillisByNow : 获取与当前时间等于时间差的时间戳
+getStringByNow : 获取与当前时间等于时间差的时间字符串
+getDateByNow : 获取与当前时间等于时间差的Date
+isSameDay : 判断是否同一天
+isLeapYear : 判断是否闰年
+getWeek, getWeekIndex : 获取星期
+getWeekOfMonth : 获取月份中的第几周
+getWeekOfYear : 获取年份中的第几周
+getChineseZodiac : 获取生肖
+getZodiac : 获取星座
+```
+
+* ### 吐司相关→[ToastUtils.java][toast.java]→[Demo][toast.demo]
+```
+init : 吐司初始化
+showShortToastSafe: 安全地显示短时吐司
+showLongToastSafe : 安全地显示长时吐司
+showShortToast : 显示短时吐司
+showLongToast : 显示长时吐司
+cancelToast : 取消吐司显示
+```
+
+* ### 压缩相关→[ZipUtils.java][zip.java]→[Test][zip.test]
+```
+zipFiles : 批量压缩文件
+zipFile : 压缩文件
+unzipFiles : 批量解压文件
+unzipFile : 解压文件
+unzipFileByKeyword: 解压带有关键字的文件
+getFilesPath : 获取压缩文件中的文件路径链表
+getComments : 获取压缩文件中的注释链表
+getEntries : 获取压缩文件中的文件对象
+```
+
+* ### 更新Log→[update_log.md][update_log.md]
+
+***
+
+## About
+
+* 做这份整理是想把它作为Android开发的小字典,当遇到一些琐碎问题时,不用再面向百度或者谷歌查询API的使用,费时费力,这里有的话,大家尽管撸走;同时也希望它能逐日壮大起来,期待大家的Star和完善,当然我也会一直更新发布版本和日志,为了方便大家导入,现已上传jcenter;其中很多代码也是汇四方之精华,谢谢前辈们的提供,当然最终还是要通过单元测试的,如有错误,请及时告之。
+* QQ群提供讨论,1群:74721490(已满)2群:25206533,至于验证问题对大家来说肯定都是小case。关于群:[在别人生活里低调地做配角(我和466个程序员的故事)][group]。
+* 我的[微博][weibo],求个关注哈。
+
+## Download
+
+Gradle:
+``` groovy
+compile 'com.blankj:utilcode:1.4.0'
+```
+
+## How to use
+
+```
+Utils.init(context);
+```
+
+## Proguard
+
+```
+-keep class com.blankj.utilcode.** { *; }
+-keepclassmembers class com.blankj.utilcode.** { *; }
+-dontwarn com.blankj.utilcode.**
+```
+
+## License
+
+```
+Copyright 2016 Blankj
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+```
+
+[update_log.md]: https://github.com/Blankj/AndroidUtilCode/blob/master/update_log.md
+
+[readme.md]: https://github.com/Blankj/AndroidUtilCode
+[readme-cn.md]: https://github.com/Blankj/AndroidUtilCode/blob/master/README-CN.md
+
+[activity.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ActivityUtils.java
+[activity.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/ActivityActivity.java
+
+[app.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/AppUtils.java
+[app.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/AppActivity.java
+
+[bar.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/BarUtils.java
+
+[clean.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/CleanUtils.java
+[clean.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/CleanActivity.java
+
+[clipboard.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ClipboardUtils.java
+
+[close.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/CloseUtils.java
+
+[convert.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ConvertUtils.java
+[convert.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/ConvertUtilsTest.java
+
+[crash.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/CrashUtils.java
+
+[device.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/DeviceUtils.java
+[device.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/DeviceActivity.java
+
+[empty.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/EmptyUtils.java
+[empty.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/EmptyUtilsTest.java
+
+[encode.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/EncodeUtils.java
+[encode.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/EncodeUtilsTest.java
+
+[encrypt.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/EncryptUtils.java
+[encrypt.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/EncryptUtilsTest.java
+
+[file.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/FileUtils.java
+[file.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/FileUtilsTest.java
+
+[fragment.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/FragmentUtils.java
+[fragment.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/FragmentActivity.java
+
+[handler.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/HandlerUtils.java
+[handler.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/HandlerActivity.java
+
+[image.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ImageUtils.java
+[image.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/ImageActivity.java
+
+[intent.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/IntentUtils.java
+
+[keyboard.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/KeyboardUtils.java
+[keyboard.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/KeyboardActivity.java
+
+[location.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/LocationUtils.java
+[location.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/LocationActivity.java
+
+[log.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/LogUtils.java
+[log.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/LogActivity.java
+
+[network.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/NetworkUtils.java
+[network.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/NetworkActivity.java
+
+[phone.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/PhoneUtils.java
+[phone.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/PhoneActivity.java
+
+[pinyin.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/PinyinUtils.java
+[pinyin.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/PinyinUtilsTest.java
+
+[process.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ProcessUtils.java
+[process.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/ProcessActivity.java
+
+[regex.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/RegexUtils.java
+[regex.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/RegexUtilsTest.java
+
+[screen.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ScreenUtils.java
+
+[sdcard.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SDCardUtils.java
+[sdcard.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/SDCardActivity.java
+
+[service.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ServiceUtils.java
+
+[shell.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ShellUtils.java
+
+[size.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SizeUtils.java
+
+[snackbar.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SnackbarUtils.java
+[snackbar.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/SnackbarActivity.java
+
+[spannable.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SpannableStringUtils.java
+[spannable.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/SpannableActivity.java
+
+[sp.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SPUtils.java
+[sp.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/SPUtilsTest.java
+
+[string.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/StringUtils.java
+[string.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/StringUtilsTest.java
+
+[thread_pool.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ThreadPoolUtils.java
+
+[time.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/TimeUtils.java
+[time.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/TimeUtilsTest.java
+
+[toast.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ToastUtils.java
+[toast.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/ToastActivity.java
+
+[zip.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ZipUtils.java
+[zip.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/ZipUtilsTest.java
+
+[group]: http://www.jianshu.com/p/8938015df951
+[weibo]: http://weibo.com/blankcmj
diff --git a/README.md b/README.md
index ef4af395aa..e72030acfc 100644
--- a/README.md
+++ b/README.md
@@ -1,743 +1,758 @@
-# Android developers should collect the following utils
-
-## [README of Chinese][readme-cn.md]
-
-Directory is shown below:
-
-> - **About Activity→[ActivityUtils.java][activity.java]→[Demo][activity.demo]**
- ```
-isActivityExists
-launchActivity
-getLauncherActivity
- ```
-
-> - **About App→[AppUtils.java][app.java]→[Demo][app.demo]**
- ```
-isInstallApp
-installApp
-installAppSilent
-uninstallApp
-uninstallAppSilent
-isAppRoot
-launchApp
-getAppPackageName
-getAppDetailsSettings
-getAppName
-getAppIcon
-getAppPath
-getAppVersionName
-getAppVersionCode
-isSystemApp
-isAppDebug
-getAppSignature
-getAppSignatureSHA1
-isAppForeground
-getForegroundApp
-getAppInfo
-getAppsInfo
-cleanAppData
- ```
-
-> - **About Bar→[BarUtils.java][bar.java]**
- ```
-setTransparentStatusBar
-hideStatusBar
-getStatusBarHeight
-isStatusBarExists
-getActionBarHeight
-showNotificationBar
-hideNotificationBar
- ```
-
-> - **About Clean→[CleanUtils.java][clean.java]→[Demo][clean.demo]**
- ```
-cleanInternalCache
-cleanInternalFiles
-cleanInternalDbs
-cleanInternalDbByName
-cleanInternalSP
-cleanExternalCache
-cleanCustomCache
- ```
-
-> - **About Clipboard→[ClipboardUtils.java][clipboard.java]**
- ```
-copyText
-getText
-copyUri
-getUri
-copyIntent
-getIntent
- ```
-
-> - **About Close→[CloseUtils.java][close.java]**
- ```
-closeIO
-closeIOQuietly
- ```
-
-> - **About Convert→[ConvertUtils.java][convert.java]→[Test][convert.test]**
- ```
-bytes2HexString, hexString2Bytes
-chars2Bytes, bytes2Chars
-memorySize2Byte, byte2MemorySize
-byte2FitMemorySize
-timeSpan2Millis, millis2TimeSpan
-millis2FitTimeSpan
-bytes2Bits, bits2Bytes
-input2OutputStream, output2InputStream
-inputStream2Bytes, bytes2InputStream
-outputStream2Bytes, bytes2OutputStream
-inputStream2String, string2InputStream
-outputStream2String, string2OutputStream
-bitmap2Bytes, bytes2Bitmap
-drawable2Bitmap, bitmap2Drawable
-drawable2Bytes, bytes2Drawable
-view2Bitmap
-dp2px, px2dp
-sp2px, px2sp
- ```
-
-> - **About Crash→[CrashUtils.java][crash.java]**
- ```
-getInstance
-init
- ```
-
-> - **About Device→[DeviceUtils.java][device.java]→[Demo][device.demo]**
- ```
-isDeviceRooted
-getSDKVersion
-getAndroidID
-getMacAddress
-getManufacturer
-getModel
-shutdown
-reboot
-reboot2Recovery
-reboot2Bootloader
- ```
-
-> - **About Empty→[EmptyUtils.java][empty.java]→[Test][empty.test]**
- ```
-isEmpty
-isNotEmpty
- ```
-
-> - **About Encode→[EncodeUtils.java][encode.java]→[Test][encode.test]**
- ```
-urlEncode
-urlDecode
-base64Encode
-base64Encode2String
-base64Decode
-base64UrlSafeEncode
-htmlEncode
-htmlDecode
- ```
-
-> - **About Encrypt→[EncryptUtils.java][encrypt.java]→[Test][encrypt.test]**
- ```
-encryptMD2, encryptMD2ToString
-encryptMD5, encryptMD5ToString
-encryptMD5File, encryptMD5File2String
-encryptSHA1, encryptSHA1ToString
-encryptSHA224, encryptSHA224ToString
-encryptSHA256, encryptSHA256ToString
-encryptSHA384, encryptSHA384ToString
-encryptSHA512, encryptSHA512ToString
-encryptHmacMD5, encryptHmacMD5ToString
-encryptHmacSHA1, encryptHmacSHA1ToString
-encryptHmacSHA224, encryptHmacSHA224ToString
-encryptHmacSHA256, encryptHmacSHA256ToString
-encryptHmacSHA384, encryptHmacSHA384ToString
-encryptHmacSHA512, encryptHmacSHA512ToString
-encryptDES, encryptDES2HexString, encryptDES2Base64
-decryptDES, decryptHexStringDES, decryptBase64DES
-encrypt3DES, encrypt3DES2HexString, encrypt3DES2Base64
-decrypt3DES, decryptHexString3DES, decryptBase64_3DES
-encryptAES, encryptAES2HexString, encryptAES2Base64
-decryptAES, decryptHexStringAES, decryptBase64AES
- ```
-
-> - **About File→[FileUtils.java][file.java]→[Test][file.test]**
- ```
-getFileByPath
-isFileExists
-rename
-isDir
-isFile
-createOrExistsDir
-createOrExistsFile
-createFileByDeleteOldFile
-copyDir
-copyFile
-moveDir
-moveFile
-deleteDir
-deleteFile
-listFilesInDir
-listFilesInDir
-listFilesInDirWithFilter
-listFilesInDirWithFilter
-listFilesInDirWithFilter
-listFilesInDirWithFilter
-searchFileInDir
-writeFileFromIS
-writeFileFromString
-readFile2List
-readFile2String
-readFile2Bytes
-getFileLastModified
-getFileCharsetSimple
-getFileLines
-getDirSize
-getFileSize
-getDirLength
-getFileLength
-getFileMD5
-getFileMD5ToString
-getDirName
-getFileName
-getFileNameNoExtension
-getFileExtension
- ```
-
-> - **About Fragment→[FragmentUtils.java][fragment.java]→[Demo][fragment.demo]**
- ```
-addFragment
-addFragments
-removeFragment
-removeToFragment
-removeFragments
-removeAllFragments
-replaceFragment
-popFragment
-popToFragment
-popFragments
-popAllFragments
-popAddFragment
-hideFragment
-hideFragments
-showFragment
-hideShowFragment
-getLastAddFragment
-getLastAddFragmentInStack
-getTopShowFragment
-getTopShowFragmentInStack
-getFragments
-getFragmentsInStack
-getAllFragments
-getAllFragmentsInStack
-getPreFragment
-findFragment
-dispatchBackPress
-setBackgroundColor
-setBackgroundResource
-setBackground
- ```
-
-> - **About Handler→[HandlerUtils.java][handler.java]→[Demo][handler.demo]**
- ```
-HandlerHolder
- ```
-
-> - **About Image→[ImageUtils.java][image.java]→[Demo][image.demo]**
- ```
-bitmap2Bytes, bytes2Bitmap
-drawable2Bitmap, bitmap2Drawable
-drawable2Bytes, bytes2Drawable
-getBitmap
-scale
-clip
-skew
-rotate
-getRotateDegree
-toRound
-toRoundCorner
-fastBlur
-renderScriptBlur
-stackBlur
-addFrame
-addReflection
-addTextWatermark
-addImageWatermark
-toAlpha
-toGray
-save
-isImage
-getImageType
-compressByScale
-compressByQuality
-compressBySampleSize
- ```
-
-> - **About Intent→[IntentUtils.java][intent.java]**
- ```
-getInstallAppIntent
-getUninstallAppIntent
-getLaunchAppIntent
-getAppDetailsSettingsIntent
-getShareTextIntent
-getShareImageIntent
-getComponentIntent
-getShutdownIntent
-getCaptureIntent
- ```
-
-> - **About Keyboard→[KeyboardUtils.java][keyboard.java]→[Demo][keyboard.demo]**
- ```
-hideSoftInput
-clickBlankArea2HideSoftInput
-showSoftInput
-toggleSoftInput
- ```
-
-> - **About Location→[LocationUtils.java][location.java]→[Demo][location.demo]**
- ```
-isGpsEnabled
-isLocationEnabled
-openGpsSettings
-register
-unregister
-getAddress
-getCountryName
-getLocality
-getStreet
- ```
-
-> - **About Log→[LogUtils.java][log.java]→[Demo][log.demo]**
- ```
-v
-d
-i
-w
-e
-a
-file
-json
-xml
- ```
-
-> - **About Network→[NetworkUtils.java][network.java]→[Demo][network.demo]**
- ```
-openWirelessSettings
-isConnected
-isAvailableByPing
-getDataEnabled
-setDataEnabled
-is4G
-getWifiEnabled
-setWifiEnabled
-isWifiConnected
-isWifiAvailable
-getNetworkOperatorName
-getNetworkType
-getIPAddress
-getDomainAddress
- ```
-
-> - **About Phone→[PhoneUtils.java][phone.java]→[Demo][phone.demo]**
- ```
-isPhone
-getIMEI
-getIMSI
-getPhoneType
-isSimCardReady
-getSimOperatorName
-getSimOperatorByMnc
-getPhoneStatus
-dial
-call
-sendSms
-sendSmsSilent
-getAllContactInfo
-getContactNum
-getAllSMS
- ```
-
-> - **About Pinyin→[PinyinUtils.java][pinyin.java]→[Test][pinyin.test]**
- ```
-ccs2Pinyin
-ccs2Pinyin
-getPinyinFirstLetter
-getPinyinFirstLetters
-getSurnamePinyin
-getSurnameFirstLetter
- ```
-
-> - **About Process→[ProcessUtils.java][process.java]→[Demo][process.demo]**
- ```
-getForegroundProcessName
-killAllBackgroundProcesses
-killBackgroundProcesses
- ```
-
-> - **About Regex→[RegexUtils.java][regex.java]→[Test][regex.test]**
- ```
-isMobileSimple
-isMobileExact
-isTel
-isIDCard15
-isIDCard18
-isEmail
-isURL
-isZh
-isUsername
-isDate
-isIP
-isMatch
-getMatches
-getSplits
-getReplaceFirst
-getReplaceAll
- ```
-
-> - **About Screen→[ScreenUtils.java][screen.java]**
- ```
-getScreenWidth
-getScreenHeight
-setLandscape
-setPortrait
-isLandscape
-isPortrait
-getScreenRotation
-captureWithStatusBar
-captureWithoutStatusBar
-isScreenLock
- ```
-
-> - **About SDCard→[SDCardUtils.java][sdcard.java]→[Demo][sdcard.demo]**
- ```
-isSDCardEnable
-getSDCardPath
-getDataPath
-getFreeSpace
-getSDCardInfo
- ```
-
-> - **About Service→[ServiceUtils.java][service.java]**
- ```
-getAllRunningService
-startService
-stopService
-bindService
-unbindService
-isServiceRunning
- ```
-
-> - **About Shell→[ShellUtils.java][shell.java]**
- ```
-execCmd
- ```
-
-> - **About Size→[SizeUtils.java][size.java]**
- ```
-dp2px, px2dp
-sp2px, px2sp
-applyDimension
-forceGetViewSize
-measureView
-getMeasuredWidth
-getMeasuredHeight
- ```
-
-> - **About Snackbar→[SnackbarUtils.java][snackbar.java]→[Demo][snackbar.demo]**
- ```
-showShortSnackbar
-showLongSnackbar
-showIndefiniteSnackbar
-addView
-dismissSnackbar
- ```
-
-> - **About SpannableString→[SpannableStringUtils.java][spannable.java]→[Demo][spannable.demo]**
- ```
-getBuilder
-setFlag
-setForegroundColor
-setBackgroundColor
-setQuoteColor
-setLeadingMargin
-setBullet
-setProportion
-setXProportion
-setStrikethrough
-setUnderline
-setSuperscript
-setSubscript
-setBold
-setItalic
-setBoldItalic
-setFontFamily
-setAlign
-setBitmap
-setDrawable
-setUri
-setResourceId
-setClickSpan
-setUrl
-setBlur
-append
-create
- ```
-
-> - **About SP→[SPUtils.java][sp.java]→[Test][sp.test]**
- ```
-SPUtils
-put
-getString
-putInt
-getInt
-putLong
-getLong
-putFloat
-getFloat
-putBoolean
-getBoolean
-getAll
-remove
-contains
-clear
- ```
-
-> - **About String→[StringUtils.java][string.java]→[Test][string.test]**
- ```
-isEmpty
-isTrimEmpty
-isSpace
-equals
-equalsIgnoreCase
-null2Length0
-length
-upperFirstLetter
-lowerFirstLetter
-reverse
-toDBC
-toSBC
- ```
-
-> - **About ThreadPool→[ThreadPoolUtils.java][thread_pool.java]**
- ```
-ThreadPoolUtils
-execute
-execute
-shutDown
-shutDownNow
-isShutDown
-isTerminated
-awaitTermination
-submit
-submit
-invokeAll, invokeAny
-schedule
-schedule
-scheduleWithFixedRate
-scheduleWithFixedDelay
- ```
-
-> - **About Time→[TimeUtils.java][time.java]→[Test][time.test]**
- ```
-millis2String
-string2Millis
-string2Date
-date2String
-date2Millis
-millis2Date
-getTimeSpan
-getFitTimeSpan
-getNowTimeMills
-getNowTimeString
-getNowTimeDate
-getTimeSpanByNow
-getFitTimeSpanByNow
-getFriendlyTimeSpanByNow
-isSameDay
-isLeapYear
-getWeek, getWeekIndex
-getWeekOfMonth
-getWeekOfYear
-getChineseZodiac
-getZodiac
- ```
-
-> - **About Toast→[ToastUtils.java][toast.java]→[Demo][toast.demo]**
- ```
-init
-showShortToastSafe
-showLongToastSafe
-showShortToast
-showLongToast
-cancelToast
- ```
-
-> - **About Zip→[ZipUtils.java][zip.java]→[Test][zip.test]**
- ```
-zipFiles
-zipFile
-unzipFiles
-unzipFile
-unzipFileByKeyword
-getFilesPath
-getComments
-getEntries
- ```
-
-> - **更新Log→[update_log.md][update_log.md]**
-
-***
-
-## About
-
-**I'm so sorry for that the code is annotated with Chinese.**
-
-## Download
-
-Gradle:
-``` groovy
-compile 'com.blankj:utilcode:1.3.7'
-```
-
-## How to use
-
-```
-Utils.init(context);
-```
-
-## Proguard
-
-```
--keep class com.blankj.utilcode.** { *; }
--keepclassmembers class com.blankj.utilcode.** { *; }
--dontwarn com.blankj.utilcode.**
-```
-
-## License
-
-```
-Copyright 2016 Blankj
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-```
-
-[update_log.md]: https://github.com/Blankj/AndroidUtilCode/blob/master/update_log.md
-
-[readme.md]: https://github.com/Blankj/AndroidUtilCode
-[readme-cn.md]: https://github.com/Blankj/AndroidUtilCode/blob/master/README-CN.md
-
-[activity.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ActivityUtils.java
-[activity.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/ActivityActivity.java
-
-[app.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/AppUtils.java
-[app.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/AppActivity.java
-
-[bar.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/BarUtils.java
-
-[clean.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/CleanUtils.java
-[clean.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/CleanActivity.java
-
-[clipboard.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ClipboardUtils.java
-
-[close.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/CloseUtils.java
-
-[convert.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ConvertUtils.java
-[convert.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/ConvertUtilsTest.java
-
-[crash.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/CrashUtils.java
-
-[device.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/DeviceUtils.java
-[device.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/DeviceActivity.java
-
-[empty.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/EmptyUtils.java
-[empty.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/EmptyUtilsTest.java
-
-[encode.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/EncodeUtils.java
-[encode.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/EncodeUtilsTest.java
-
-[encrypt.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/EncryptUtils.java
-[encrypt.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/EncryptUtilsTest.java
-
-[file.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/FileUtils.java
-[file.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/FileUtilsTest.java
-
-[fragment.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/FragmentUtils.java
-[fragment.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/FragmentActivity.java
-
-[handler.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/HandlerUtils.java
-[handler.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/HandlerActivity.java
-
-[image.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ImageUtils.java
-[image.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/ImageActivity.java
-
-[intent.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/IntentUtils.java
-
-[keyboard.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/KeyboardUtils.java
-[keyboard.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/KeyboardActivity.java
-
-[location.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/LocationUtils.java
-[location.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/LocationActivity.java
-
-[log.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/LogUtils.java
-[log.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/LogActivity.java
-
-[network.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/NetworkUtils.java
-[network.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/NetworkActivity.java
-
-[phone.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/PhoneUtils.java
-[phone.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/PhoneActivity.java
-
-[pinyin.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/PinyinUtils.java
-[pinyin.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/PinyinUtilsTest.java
-
-[process.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ProcessUtils.java
-[process.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/ProcessActivity.java
-
-[regex.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/RegexUtils.java
-[regex.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/RegexUtilsTest.java
-
-[screen.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ScreenUtils.java
-
-[sdcard.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SDCardUtils.java
-[sdcard.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/SDCardActivity.java
-
-[service.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ServiceUtils.java
-
-[shell.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ShellUtils.java
-
-[size.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SizeUtils.java
-
-[snackbar.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SnackbarUtils.java
-[snackbar.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/SnackbarActivity.java
-
-[spannable.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SpannableStringUtils.java
-[spannable.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/SpannableActivity.java
-
-[sp.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SPUtils.java
-[sp.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/SPUtilsTest.java
-
-[string.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/StringUtils.java
-[string.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/StringUtilsTest.java
-
-[thread_pool.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ThreadPoolUtils.java
-
-[time.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/TimeUtils.java
-[time.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/TimeUtilsTest.java
-
-[toast.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ToastUtils.java
-[toast.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/ToastActivity.java
-
-[zip.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ZipUtils.java
-[zip.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/ZipUtilsTest.java
-
-[group]: http://www.jianshu.com/p/8938015df951
-[weibo]: http://weibo.com/blankcmj
+# Android developers should collect the following utils
+
+## [README of Chinese][readme-cn.md]
+
+## API
+
+* ### About Activity→[ActivityUtils.java][activity.java]→[Demo][activity.demo]
+```
+isActivityExists
+launchActivity
+getLauncherActivity
+```
+
+* ### About App→[AppUtils.java][app.java]→[Demo][app.demo]
+```
+isInstallApp
+installApp
+installAppSilent
+uninstallApp
+uninstallAppSilent
+isAppRoot
+launchApp
+getAppPackageName
+getAppDetailsSettings
+getAppName
+getAppIcon
+getAppPath
+getAppVersionName
+getAppVersionCode
+isSystemApp
+isAppDebug
+getAppSignature
+getAppSignatureSHA1
+isAppForeground
+getForegroundApp
+getAppInfo
+getAppsInfo
+cleanAppData
+```
+
+* ### About Bar→[BarUtils.java][bar.java]
+```
+setTransparentStatusBar
+hideStatusBar
+getStatusBarHeight
+isStatusBarExists
+getActionBarHeight
+showNotificationBar
+hideNotificationBar
+```
+
+* ### About Clean→[CleanUtils.java][clean.java]→[Demo][clean.demo]
+```
+cleanInternalCache
+cleanInternalFiles
+cleanInternalDbs
+cleanInternalDbByName
+cleanInternalSP
+cleanExternalCache
+cleanCustomCache
+```
+
+* ### About Clipboard→[ClipboardUtils.java][clipboard.java]
+```
+copyText
+getText
+copyUri
+getUri
+copyIntent
+getIntent
+```
+
+* ### About Close→[CloseUtils.java][close.java]
+```
+closeIO
+closeIOQuietly
+```
+
+* ### About Convert→[ConvertUtils.java][convert.java]→[Test][convert.test]
+```
+bytes2HexString, hexString2Bytes
+chars2Bytes, bytes2Chars
+memorySize2Byte, byte2MemorySize
+byte2FitMemorySize
+timeSpan2Millis, millis2TimeSpan
+millis2FitTimeSpan
+bytes2Bits, bits2Bytes
+input2OutputStream, output2InputStream
+inputStream2Bytes, bytes2InputStream
+outputStream2Bytes, bytes2OutputStream
+inputStream2String, string2InputStream
+outputStream2String, string2OutputStream
+bitmap2Bytes, bytes2Bitmap
+drawable2Bitmap, bitmap2Drawable
+drawable2Bytes, bytes2Drawable
+view2Bitmap
+dp2px, px2dp
+sp2px, px2sp
+```
+
+* ### About Crash→[CrashUtils.java][crash.java]
+```
+getInstance
+init
+```
+
+* ### About Device→[DeviceUtils.java][device.java]→[Demo][device.demo]
+```
+isDeviceRooted
+getSDKVersion
+getAndroidID
+getMacAddress
+getManufacturer
+getModel
+shutdown
+reboot
+reboot2Recovery
+reboot2Bootloader
+```
+
+* ### About Empty→[EmptyUtils.java][empty.java]→[Test][empty.test]
+```
+isEmpty
+isNotEmpty
+```
+
+* ### About Encode→[EncodeUtils.java][encode.java]→[Test][encode.test]
+```
+urlEncode
+urlDecode
+base64Encode
+base64Encode2String
+base64Decode
+base64UrlSafeEncode
+htmlEncode
+htmlDecode
+```
+
+* ### About Encrypt→[EncryptUtils.java][encrypt.java]→[Test][encrypt.test]
+```
+encryptMD2, encryptMD2ToString
+encryptMD5, encryptMD5ToString
+encryptMD5File, encryptMD5File2String
+encryptSHA1, encryptSHA1ToString
+encryptSHA224, encryptSHA224ToString
+encryptSHA256, encryptSHA256ToString
+encryptSHA384, encryptSHA384ToString
+encryptSHA512, encryptSHA512ToString
+encryptHmacMD5, encryptHmacMD5ToString
+encryptHmacSHA1, encryptHmacSHA1ToString
+encryptHmacSHA224, encryptHmacSHA224ToString
+encryptHmacSHA256, encryptHmacSHA256ToString
+encryptHmacSHA384, encryptHmacSHA384ToString
+encryptHmacSHA512, encryptHmacSHA512ToString
+encryptDES, encryptDES2HexString, encryptDES2Base64
+decryptDES, decryptHexStringDES, decryptBase64DES
+encrypt3DES, encrypt3DES2HexString, encrypt3DES2Base64
+decrypt3DES, decryptHexString3DES, decryptBase64_3DES
+encryptAES, encryptAES2HexString, encryptAES2Base64
+decryptAES, decryptHexStringAES, decryptBase64AES
+```
+
+* ### About File→[FileUtils.java][file.java]→[Test][file.test]
+```
+getFileByPath
+isFileExists
+rename
+isDir
+isFile
+createOrExistsDir
+createOrExistsFile
+createFileByDeleteOldFile
+copyDir
+copyFile
+moveDir
+moveFile
+deleteDir
+deleteFile
+listFilesInDir
+listFilesInDir
+listFilesInDirWithFilter
+listFilesInDirWithFilter
+listFilesInDirWithFilter
+listFilesInDirWithFilter
+searchFileInDir
+writeFileFromIS
+writeFileFromString
+readFile2List
+readFile2String
+readFile2Bytes
+getFileLastModified
+getFileCharsetSimple
+getFileLines
+getDirSize
+getFileSize
+getDirLength
+getFileLength
+getFileMD5
+getFileMD5ToString
+getDirName
+getFileName
+getFileNameNoExtension
+getFileExtension
+```
+
+* ### About Fragment→[FragmentUtils.java][fragment.java]→[Demo][fragment.demo]
+```
+addFragment
+hideAddFragment
+addFragments
+removeFragment
+removeToFragment
+removeFragments
+removeAllFragments
+replaceFragment
+popFragment
+popToFragment
+popFragments
+popAllFragments
+popAddFragment
+hideFragment
+hideFragments
+showFragment
+hideShowFragment
+getLastAddFragment
+getLastAddFragmentInStack
+getTopShowFragment
+getTopShowFragmentInStack
+getFragments
+getFragmentsInStack
+getAllFragments
+getAllFragmentsInStack
+getPreFragment
+findFragment
+dispatchBackPress
+setBackgroundColor
+setBackgroundResource
+setBackground
+```
+
+* ### About Handler→[HandlerUtils.java][handler.java]→[Demo][handler.demo]
+```
+HandlerHolder
+```
+
+* ### About Image→[ImageUtils.java][image.java]→[Demo][image.demo]
+```
+bitmap2Bytes, bytes2Bitmap
+drawable2Bitmap, bitmap2Drawable
+drawable2Bytes, bytes2Drawable
+getBitmap
+scale
+clip
+skew
+rotate
+getRotateDegree
+toRound
+toRoundCorner
+fastBlur
+renderScriptBlur
+stackBlur
+addFrame
+addReflection
+addTextWatermark
+addImageWatermark
+toAlpha
+toGray
+save
+isImage
+getImageType
+compressByScale
+compressByQuality
+compressBySampleSize
+```
+
+* ### About Intent→[IntentUtils.java][intent.java]
+```
+getInstallAppIntent
+getUninstallAppIntent
+getLaunchAppIntent
+getAppDetailsSettingsIntent
+getShareTextIntent
+getShareImageIntent
+getComponentIntent
+getShutdownIntent
+getCaptureIntent
+```
+
+* ### About Keyboard→[KeyboardUtils.java][keyboard.java]→[Demo][keyboard.demo]
+```
+hideSoftInput
+clickBlankArea2HideSoftInput
+showSoftInput
+toggleSoftInput
+```
+
+* ### About Location→[LocationUtils.java][location.java]→[Demo][location.demo]
+```
+isGpsEnabled
+isLocationEnabled
+openGpsSettings
+register
+unregister
+getAddress
+getCountryName
+getLocality
+getStreet
+```
+
+* ### About Log→[LogUtils.java][log.java]→[Demo][log.demo]
+```
+Builder.setLogSwitch
+Builder.setGlobalTag
+Builder.setLogHeadSwitch
+Builder.setLog2FileSwitch
+Builder.setBorderSwitch
+Builder.setLogFilter
+
+v
+d
+i
+w
+e
+a
+file
+json
+xml
+```
+
+* ### About Network→[NetworkUtils.java][network.java]→[Demo][network.demo]
+```
+openWirelessSettings
+isConnected
+isAvailableByPing
+getDataEnabled
+setDataEnabled
+is4G
+getWifiEnabled
+setWifiEnabled
+isWifiConnected
+isWifiAvailable
+getNetworkOperatorName
+getNetworkType
+getIPAddress
+getDomainAddress
+```
+
+* ### About Phone→[PhoneUtils.java][phone.java]→[Demo][phone.demo]
+```
+isPhone
+getIMEI
+getIMSI
+getPhoneType
+isSimCardReady
+getSimOperatorName
+getSimOperatorByMnc
+getPhoneStatus
+dial
+call
+sendSms
+sendSmsSilent
+getAllContactInfo
+getContactNum
+getAllSMS
+```
+
+* ### About Pinyin→[PinyinUtils.java][pinyin.java]→[Test][pinyin.test]
+```
+ccs2Pinyin
+ccs2Pinyin
+getPinyinFirstLetter
+getPinyinFirstLetters
+getSurnamePinyin
+getSurnameFirstLetter
+```
+
+* ### About Process→[ProcessUtils.java][process.java]→[Demo][process.demo]
+```
+getForegroundProcessName
+killAllBackgroundProcesses
+killBackgroundProcesses
+```
+
+* ### About Regex→[RegexUtils.java][regex.java]→[Test][regex.test]
+```
+isMobileSimple
+isMobileExact
+isTel
+isIDCard15
+isIDCard18
+isEmail
+isURL
+isZh
+isUsername
+isDate
+isIP
+isMatch
+getMatches
+getSplits
+getReplaceFirst
+getReplaceAll
+```
+
+* ### About Screen→[ScreenUtils.java][screen.java]
+```
+getScreenWidth
+getScreenHeight
+setLandscape
+setPortrait
+isLandscape
+isPortrait
+getScreenRotation
+captureWithStatusBar
+captureWithoutStatusBar
+isScreenLock
+```
+
+* ### About SDCard→[SDCardUtils.java][sdcard.java]→[Demo][sdcard.demo]
+```
+isSDCardEnable
+getSDCardPath
+getDataPath
+getFreeSpace
+getSDCardInfo
+```
+
+* ### About Service→[ServiceUtils.java][service.java]
+```
+getAllRunningService
+startService
+stopService
+bindService
+unbindService
+isServiceRunning
+```
+
+* ### About Shell→[ShellUtils.java][shell.java]
+```
+execCmd
+```
+
+* ### About Size→[SizeUtils.java][size.java]
+```
+dp2px, px2dp
+sp2px, px2sp
+applyDimension
+forceGetViewSize
+measureView
+getMeasuredWidth
+getMeasuredHeight
+```
+
+* ### About Snackbar→[SnackbarUtils.java][snackbar.java]→[Demo][snackbar.demo]
+```
+showShortSnackbar
+showLongSnackbar
+showIndefiniteSnackbar
+addView
+dismissSnackbar
+```
+
+* ### About SpannableString→[SpannableStringUtils.java][spannable.java]→[Demo][spannable.demo]
+```
+Builder.getBuilder
+Builder.setFlag
+Builder.setForegroundColor
+Builder.setBackgroundColor
+Builder.setQuoteColor
+Builder.setLeadingMargin
+Builder.setBullet
+Builder.setFontSize
+Builder.setFontProportion
+Builder.setFontXProportion
+Builder.setStrikethrough
+Builder.setUnderline
+Builder.setSuperscript
+Builder.setSubscript
+Builder.setBold
+Builder.setItalic
+Builder.setBoldItalic
+Builder.setFontFamily
+Builder.setAlign
+Builder.setBitmap
+Builder.setDrawable
+Builder.setUri
+Builder.setResourceId
+Builder.setClickSpan
+Builder.setUrl
+Builder.setBlur
+Builder.append
+Builder.create
+```
+
+* ### About SP→[SPUtils.java][sp.java]→[Test][sp.test]
+```
+SPUtils
+put
+getString
+putInt
+getInt
+putLong
+getLong
+putFloat
+getFloat
+putBoolean
+getBoolean
+getAll
+remove
+contains
+clear
+```
+
+* ### About String→[StringUtils.java][string.java]→[Test][string.test]
+```
+isEmpty
+isTrimEmpty
+isSpace
+equals
+equalsIgnoreCase
+null2Length0
+length
+upperFirstLetter
+lowerFirstLetter
+reverse
+toDBC
+toSBC
+```
+
+* ### About ThreadPool→[ThreadPoolUtils.java][thread_pool.java]
+```
+ThreadPoolUtils
+execute
+execute
+shutDown
+shutDownNow
+isShutDown
+isTerminated
+awaitTermination
+submit
+submit
+invokeAll, invokeAny
+schedule
+schedule
+scheduleWithFixedRate
+scheduleWithFixedDelay
+```
+
+* ### About Time→[TimeUtils.java][time.java]→[Test][time.test]
+```
+millis2String
+string2Millis
+string2Date
+date2String
+date2Millis
+millis2Date
+getTimeSpan
+getFitTimeSpan
+getNowMills
+getNowString
+getNowDate
+getTimeSpanByNow
+getFitTimeSpanByNow
+getFriendlyTimeSpanByNow
+getMillis
+getString
+getDate
+getMillisByNow
+getStringByNow
+getDateByNow
+isSameDay
+isLeapYear
+getWeek, getWeekIndex
+getWeekOfMonth
+getWeekOfYear
+getChineseZodiac
+getZodiac
+```
+
+* ### About Toast→[ToastUtils.java][toast.java]→[Demo][toast.demo]
+```
+init
+showShortToastSafe
+showLongToastSafe
+showShortToast
+showLongToast
+cancelToast
+```
+
+* ### About Zip→[ZipUtils.java][zip.java]→[Test][zip.test]
+```
+zipFiles
+zipFile
+unzipFiles
+unzipFile
+unzipFileByKeyword
+getFilesPath
+getComments
+getEntries
+```
+
+* ### About Log→[update_log.md][update_log.md]**
+
+***
+
+## About
+
+**I'm so sorry for that the code is annotated with Chinese.**
+
+## Download
+
+Gradle:
+``` groovy
+compile 'com.blankj:utilcode:1.4.0'
+```
+
+## How to use
+
+```
+Utils.init(context);
+```
+
+## Proguard
+
+```
+-keep class com.blankj.utilcode.** { *; }
+-keepclassmembers class com.blankj.utilcode.** { *; }
+-dontwarn com.blankj.utilcode.**
+```
+
+## License
+
+```
+Copyright 2016 Blankj
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+```
+
+[update_log.md]: https://github.com/Blankj/AndroidUtilCode/blob/master/update_log.md
+
+[readme.md]: https://github.com/Blankj/AndroidUtilCode
+[readme-cn.md]: https://github.com/Blankj/AndroidUtilCode/blob/master/README-CN.md
+
+[activity.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ActivityUtils.java
+[activity.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/ActivityActivity.java
+
+[app.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/AppUtils.java
+[app.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/AppActivity.java
+
+[bar.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/BarUtils.java
+
+[clean.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/CleanUtils.java
+[clean.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/CleanActivity.java
+
+[clipboard.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ClipboardUtils.java
+
+[close.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/CloseUtils.java
+
+[convert.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ConvertUtils.java
+[convert.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/ConvertUtilsTest.java
+
+[crash.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/CrashUtils.java
+
+[device.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/DeviceUtils.java
+[device.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/DeviceActivity.java
+
+[empty.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/EmptyUtils.java
+[empty.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/EmptyUtilsTest.java
+
+[encode.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/EncodeUtils.java
+[encode.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/EncodeUtilsTest.java
+
+[encrypt.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/EncryptUtils.java
+[encrypt.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/EncryptUtilsTest.java
+
+[file.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/FileUtils.java
+[file.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/FileUtilsTest.java
+
+[fragment.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/FragmentUtils.java
+[fragment.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/FragmentActivity.java
+
+[handler.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/HandlerUtils.java
+[handler.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/HandlerActivity.java
+
+[image.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ImageUtils.java
+[image.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/ImageActivity.java
+
+[intent.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/IntentUtils.java
+
+[keyboard.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/KeyboardUtils.java
+[keyboard.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/KeyboardActivity.java
+
+[location.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/LocationUtils.java
+[location.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/LocationActivity.java
+
+[log.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/LogUtils.java
+[log.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/LogActivity.java
+
+[network.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/NetworkUtils.java
+[network.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/NetworkActivity.java
+
+[phone.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/PhoneUtils.java
+[phone.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/PhoneActivity.java
+
+[pinyin.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/PinyinUtils.java
+[pinyin.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/PinyinUtilsTest.java
+
+[process.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ProcessUtils.java
+[process.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/ProcessActivity.java
+
+[regex.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/RegexUtils.java
+[regex.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/RegexUtilsTest.java
+
+[screen.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ScreenUtils.java
+
+[sdcard.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SDCardUtils.java
+[sdcard.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/SDCardActivity.java
+
+[service.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ServiceUtils.java
+
+[shell.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ShellUtils.java
+
+[size.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SizeUtils.java
+
+[snackbar.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SnackbarUtils.java
+[snackbar.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/SnackbarActivity.java
+
+[spannable.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SpannableStringUtils.java
+[spannable.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/SpannableActivity.java
+
+[sp.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SPUtils.java
+[sp.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/SPUtilsTest.java
+
+[string.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/StringUtils.java
+[string.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/StringUtilsTest.java
+
+[thread_pool.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ThreadPoolUtils.java
+
+[time.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/TimeUtils.java
+[time.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/TimeUtilsTest.java
+
+[toast.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ToastUtils.java
+[toast.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/ToastActivity.java
+
+[zip.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/ZipUtils.java
+[zip.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/ZipUtilsTest.java
+
+[group]: http://www.jianshu.com/p/8938015df951
+[weibo]: http://weibo.com/blankcmj
diff --git a/app/build.gradle b/app/build.gradle
index e5ed6a99fb..98013063f7 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -40,4 +40,6 @@ dependencies {
debugCompile "com.squareup.leakcanary:leakcanary-android:$LEAKCANARY_VERSION"
releaseCompile leakCanary
testCompile leakCanary
-}
\ No newline at end of file
+}
+
+
diff --git a/app/src/main/java/com/blankj/androidutilcode/activity/SpannableActivity.java b/app/src/main/java/com/blankj/androidutilcode/activity/SpannableActivity.java
index 7a113d716e..54ed5801cc 100644
--- a/app/src/main/java/com/blankj/androidutilcode/activity/SpannableActivity.java
+++ b/app/src/main/java/com/blankj/androidutilcode/activity/SpannableActivity.java
@@ -46,43 +46,43 @@ public void updateDrawState(TextPaint ds) {
TextView tvAboutSpannable = (TextView) findViewById(R.id.tv_about_spannable);
// 响应点击事件的话必须设置以下属性
tvAboutSpannable.setMovementMethod(LinkMovementMethod.getInstance());
- tvAboutSpannable.setText(SpannableStringUtils
- .getBuilder("测试SpannableStringUtils\n")
- .setBold().setForegroundColor(Color.YELLOW).setBackgroundColor(Color.GRAY).setAlign(Layout.Alignment.ALIGN_CENTER)
+ tvAboutSpannable.setText(new SpannableStringUtils.Builder()
+ .appendLine("测试SpannableStringUtils").setBold().setForegroundColor(Color.YELLOW).setBackgroundColor(Color.GRAY).setAlign(Layout.Alignment.ALIGN_CENTER)
.append("测试")
.append("前景色").setForegroundColor(Color.GREEN)
- .append("背景色\n").setBackgroundColor(Color.RED)
- .append("测试首行缩进\n").setLeadingMargin(30, 50)
- .append("测试引用\n").setQuoteColor(Color.YELLOW)
- .append("测试列表项\n").setBullet(30, Color.YELLOW)
+ .appendLine("背景色").setBackgroundColor(Color.RED)
+ .appendLine("测试首行缩进").setLeadingMargin(30, 50)
+ .appendLine("测试引用").setQuoteColor(Color.BLACK)
+ .appendLine("测试列表项").setBullet(30, Color.BLACK)
+ .appendLine("测试32dp字体").setFontSize(36, true)
.append("测试")
- .append("2倍字体\n").setProportion(2)
+ .appendLine("2倍字体").setFontProportion(2)
.append("测试")
- .append("横向2倍字体\n").setXProportion(2)
+ .appendLine("横向2倍字体").setFontXProportion(2)
.append("测试")
.append("删除线").setStrikethrough()
- .append("下划线\n").setUnderline()
+ .appendLine("下划线").setUnderline()
.append("测试")
.append("上标").setSuperscript()
- .append("下标\n").setSubscript()
+ .appendLine("下标").setSubscript()
.append("测试")
.append("粗体").setBold()
.append("斜体").setItalic()
- .append("粗斜体\n").setBoldItalic()
- .append("monospace font\n").setFontFamily("monospace")
- .append("serif font\n").setFontFamily("serif")
- .append("sans-serif font\n").setFontFamily("sans-serif")
- .append("测试正常对齐\n").setAlign(Layout.Alignment.ALIGN_NORMAL)
- .append("测试居中对齐\n").setAlign(Layout.Alignment.ALIGN_CENTER)
- .append("测试相反对齐\n").setAlign(Layout.Alignment.ALIGN_OPPOSITE)
+ .appendLine("粗斜体").setBoldItalic()
+ .appendLine("monospace font").setFontFamily("monospace")
+ .appendLine("serif font").setFontFamily("serif")
+ .appendLine("sans-serif font").setFontFamily("sans-serif")
+ .appendLine("测试正常对齐").setAlign(Layout.Alignment.ALIGN_NORMAL)
+ .appendLine("测试居中对齐").setAlign(Layout.Alignment.ALIGN_CENTER)
+ .appendLine("测试相反对齐").setAlign(Layout.Alignment.ALIGN_OPPOSITE)
.append("测试")
- .append("图片\n").setResourceId(R.mipmap.ic_launcher)
+ .appendLine("图片").setResourceId(R.mipmap.ic_launcher)
.append("测试")
- .append("点击事件\n").setClickSpan(clickableSpan)
+ .appendLine("点击事件").setClickSpan(clickableSpan)
.append("测试")
- .append("Url\n").setUrl("https://github.com/Blankj/AndroidUtilCode")
+ .appendLine("Url").setUrl("https://github.com/Blankj/AndroidUtilCode")
.append("测试")
- .append("模糊字体\n").setBlur(3, BlurMaskFilter.Blur.NORMAL)
+ .append("模糊").setBlur(3, BlurMaskFilter.Blur.NORMAL)
.create()
);
}
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index 217e73ab24..0c41ff9ece 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -1,4 +1,4 @@
+ * author: Blankj + * blog : http://blankj.com + * time : 2017/04/16 + * desc : 权限相关工具类 + *+ */ +public final class PermissionUtils { + + private static int mRequestCode = -1; + + private static OnPermissionListener mOnPermissionListener; + + public interface OnPermissionListener { + + void onPermissionGranted(); + + void onPermissionDenied(String[] deniedPermissions); + } + + public abstract static class RationaleHandler { + private Context context; + private int requestCode; + private String[] permissions; + + protected abstract void showRationale(); + + void showRationale(Context context, int requestCode, String[] permissions) { + this.context = context; + this.requestCode = requestCode; + this.permissions = permissions; + showRationale(); + } + + @TargetApi(Build.VERSION_CODES.M) + public void requestPermissionsAgain() { + ((Activity) context).requestPermissions(permissions, requestCode); + } + } + + @TargetApi(Build.VERSION_CODES.M) + public static void requestPermissions(Context context, int requestCode + , String[] permissions, OnPermissionListener listener) { + requestPermissions(context, requestCode, permissions, listener, null); + } + + @TargetApi(Build.VERSION_CODES.M) + public static void requestPermissions(Context context, int requestCode + , String[] permissions, OnPermissionListener listener, RationaleHandler handler) { + if (context instanceof Activity) { + mRequestCode = requestCode; + mOnPermissionListener = listener; + String[] deniedPermissions = getDeniedPermissions(context, permissions); + if (deniedPermissions.length > 0) { + boolean rationale = shouldShowRequestPermissionRationale(context, deniedPermissions); + if (rationale && handler != null) { + handler.showRationale(context, requestCode, deniedPermissions); + } else { + ((Activity) context).requestPermissions(deniedPermissions, requestCode); + } + } else { + if (mOnPermissionListener != null) + mOnPermissionListener.onPermissionGranted(); + } + } else { + throw new RuntimeException("Context must be an Activity"); + } + } + + /** + * 请求权限结果,对应Activity中onRequestPermissionsResult()方法。 + */ + public static void onRequestPermissionsResult(Activity context, int requestCode, String[] permissions, int[] + grantResults) { + if (mRequestCode != -1 && requestCode == mRequestCode) { + if (mOnPermissionListener != null) { + String[] deniedPermissions = getDeniedPermissions(context, permissions); + if (deniedPermissions.length > 0) { + mOnPermissionListener.onPermissionDenied(deniedPermissions); + } else { + mOnPermissionListener.onPermissionGranted(); + } + } + } + } + + /** + * 获取请求权限中需要授权的权限 + */ + private static String[] getDeniedPermissions(Context context, String[] permissions) { + List
time格式为yyyy-MM-dd HH:mm:ss
@@ -1156,97 +1500,73 @@ public static String getZodiac(int month, int day) { : (month + 10) % 12]; } - /** - * 与给定时间间隔millis的日期 - * @param time 指定时间 - * @param millis 间隔的毫秒数 - * @return 默认格式的新日期 - */ - public static String getDateStringAfterTimeSpan(String time, long millis) { - return millis2String(string2Millis(time) + millis); - } - - /** - * 与给定时间间隔millis的日期 - * @param time 指定的原时间 - * @param pattern 时间格式 - * @param millis 间隔的毫秒数 - * @return 给定格式的日期字符串 - */ - public static String getDateStringAfterTimeSpan(String time, String pattern, long millis) { - return millis2String(string2Millis(time, pattern) + millis, pattern); - } /** - * 与给定时间指定间隔的日期 - * @param time 指定的原时间 - * @param pattern 时间格式 - * @param timeSpanNum 时间间隔数 - * @param unit 时间间隔单位 - * @return 计算后的新时间格式化后的字符串 - */ - public static String getDateStringAfterTimeSpan(String time, String pattern, long timeSpanNum, @TimeConstants.Unit int unit) { - return millis2String(getDateStringAfterTimeSpan(string2Millis(time, pattern), timeSpanNum, unit), pattern); - } - /** - * 与给定时间间隔millis的日期 - * @param timeMillis 指定的原时间的时间戳 - * @param timeSpanNum 时间间隔数 - * @param unit 时间间隔单位 - * @return 计算后的新时间的时间戳 - */ - private static long getDateStringAfterTimeSpan(long timeMillis, long timeSpanNum, @TimeConstants.Unit int unit) { - int unitMultiple = 1; - switch (unit) { - case TimeConstants.DAY: - unitMultiple = 1000 * 60 * 60 * 24; - break; - case TimeConstants.HOUR: - unitMultiple = 1000 * 60 * 60; - break; - case TimeConstants.MIN: - unitMultiple = 1000 * 6; - break; - case TimeConstants.SEC: - unitMultiple = 1000; - break; - case TimeConstants.MSEC: - unitMultiple = 1; - break; - } - return timeMillis + timeSpanNum * unitMultiple; - } - - /** - * 与给定时间间隔millis的日期 - * @param time 指定时间 - * @param millis 时间间隔 - * @return 新日期 + * 以unit为单位的时间长度转毫秒时间戳 + * + * @param timeSpan 毫秒时间戳 + * @param unit 单位类型 + *小于等于0,返回null
+ * @param precision 精度 + *