项目经常会用到的一些常用的工具类,记录一下。
App.java
public class App extends Application {
private static App instance;
public static synchronized App getInstance() {
return instance;
}
public void onCreate() {
super.onCreate();
instance = this;
}
}
单位转换工具类
有一定开发经验的小伙伴肯定会发现这样一个问题,当我们用xml来写布局的时候,通常用的是 dp、sp 。(相信大家都知道为什么这样用)。当我们用 Java 代码来创建 View 控件时,会发现方法接收的参数都是以 px 为单位的,当然我们不希望直接使用 px 的(相信大家都知道为什么不希望使用px为单位)。
/**
* Created on 2022/3/23 11:03
* 常用单位转换的工具类
* @author Gong Youqiang
*/
public class DensityUtils {
private DensityUtils() {
}
/**
* dp转px
*
* @param context
* @return
*/
public static int dp2px(Context context, float dpVal) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpVal, context.getResources()
.getDisplayMetrics());
}
/**
* sp转px
*
* @param context
* @return
*/
public static int sp2px(Context context, float spVal) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, spVal, context.getResources()
.getDisplayMetrics());
}
/**
* px转dp
*
* @param context
* @param pxVal
* @return
*/
public static float px2dp(Context context, float pxVal) {
final float scale = context.getResources().getDisplayMetrics().density;
return (pxVal / scale);
}
/**
* px转sp
*
* @param pxVal
* @return
*/
public static float px2sp(Context context, float pxVal) {
return (pxVal / context.getResources().getDisplayMetrics().scaledDensity);
}
/**
* 得到屏幕宽度
*
* @param context
* @return
*/
public static int getDisplayWidth(Context context) {
return context.getResources().getDisplayMetrics().widthPixels;
}
/**
* 得到屏幕高度
*
* @param context
* @return
*/
public static int getDisplayHeight(Context context) {
return context.getResources().getDisplayMetrics().heightPixels;
}
}
ToastUtils.java
Android 中的 Toast 可谓是最长用的东西之一了,用起来也相当简单,也就是一行代码的事情。但是它有默认的样子,也就是在屏幕的底部弹出一个黑色半透明的框。但是有时候设计人员会觉得它不好看,不够多样性。
/**
* Created on 2022/4/2 15:38
*
* @author Gong Youqiang
*/
public class ToastUtils {
/**
* 这里是方法的重载,用于开放不同的参数
*
* @param messageID
*/
public static void showToast(int messageID) {
showToast(App.getInstance(), messageID);
}
public static void showToast(String message) {
showToast(App.getInstance(), message);
}
public static void showToast(int messageID, int duration) {
showToast(App.getInstance(), messageID, duration);
}
public static void showToast(String message, int duration) {
showToast(App.getInstance(), message, duration);
}
public static void showToast(Context context, int resId) {
showToast(context, context.getString(resId), Toast.LENGTH_SHORT);
}
public static void showToast(Context context, String message) {
showToast(context, message, Toast.LENGTH_SHORT);
}
public static void showToast(Activity context, int resId) {
showToast(context, context.getString(resId), Toast.LENGTH_SHORT);
}
public static void showToast(Activity context, int resId,int duration) {
showToast(context, context.getString(resId), duration);
}
private static void showToast(Activity context, String message) {
showToast(context, message, Toast.LENGTH_SHORT);
}
private static void showToast(Context context, int resId, int duration) {
///Toast.makeText(context, resId, duration).show();
showToast(context, context.getString(resId), duration);
}
static Toast toast;
static TextView contentView;
/**
* 自定义Toast的样式与位置
*
* @param context
* @param message
* @param duration
*/
private static void showToast(Context context, String message, int duration) {
if (context == null) {
return;
}
try {
if (toast == null || contentView == null) {
int dp30 = DensityUtils.dp2px(context, 30);
int dp20 = DensityUtils.dp2px(context, 20);
contentView = new TextView(context);
contentView.setGravity(Gravity.CENTER);
contentView.setBackgroundResource(R.drawable.bg_toast);
contentView.setTextSize(16);
contentView.setTextColor(context.getResources().getColor(R.color.white));
contentView.setPadding(dp30, dp20, dp30, dp20);
toast = new Toast(context);
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.setView(contentView);
toast.setDuration(duration);
}
contentView.setText(message);
toast.show();
} catch (Exception e) {
Toast.makeText(context, message, duration).show();
e.printStackTrace();
}
}
}
AppUtils.java
APP 相关信息工具类。
/**
* Created on 2021/3/30 18:08
*
* @author Gong Youqiang
*/
public final class AppUtils {
private static final boolean DEBUG = true;
private static final String TAG = "AppUtils";
/**
* Don't let anyone instantiate this class.
*/
private AppUtils() {
throw new Error("Do not need instantiate!");
}
/**
* 得到软件版本号
*
* @param context 上下文
* @return 当前版本Code
*/
public static int getVerCode(Context context) {
int verCode = -1;
try {
String packageName = context.getPackageName();
verCode = context.getPackageManager()
.getPackageInfo(packageName, 0).versionCode;
} catch (NameNotFoundException e) {
e.printStackTrace();
}
return verCode;
}
/**
* 获取应用运行的最大内存
*
* @return 最大内存
*/
public static long getMaxMemory() {
return Runtime.getRuntime().maxMemory() / 1024;
}
/**
* 得到软件显示版本信息
*
* @param context 上下文
* @return 当前版本信息
*/
public static String getVerName(Context context) {
String verName = "";
try {
String packageName = context.getPackageName();
verName = context.getPackageManager()
.getPackageInfo(packageName, 0).versionName;
} catch (NameNotFoundException e) {
e.printStackTrace();
}
return verName;
}
/**
* 安装apk
* Android 7.0 或更高版本的应用私有目录被限制访问
* @param context 上下文
* @param file APK文件
* @paras authority provider->authority属性
*/
public void installApk(Context context, File file, String authority) {
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Build.VERSION.SDK_INT>=Build.VERSION_CODES.N ? FileProvider.getUriForFile(context,authority,file):
Uri.fromFile(file),"\"application/vnd.android.package-archive\"");
context.startActivity(intent);
}
/**
* 卸载apk
*
* @param context 上下文
* @param packageName 包名
*/
public static void uninstallApk(Context context, String packageName) {
Intent intent = new Intent(Intent.ACTION_DELETE);
Uri packageURI = Uri.parse("package:" + packageName);
intent.setData(packageURI);
context.startActivity(intent);
}
/**
* 检测服务是否运行
*
* @param context 上下文
* @param className 类名
* @return 是否运行的状态
*/
public static boolean isServiceRunning(Context context, String className) {
boolean isRunning = false;
ActivityManager activityManager
= (ActivityManager) context.getSystemService(
Context.ACTIVITY_SERVICE);
List<RunningServiceInfo> servicesList
= activityManager.getRunningServices(Integer.MAX_VALUE);
for (RunningServiceInfo si : servicesList) {
if (className.equals(si.service.getClassName())) {
isRunning = true;
}
}
return isRunning;
}
/**
* 停止运行服务
*
* @param context 上下文
* @param className 类名
* @return 是否执行成功
*/
public static boolean stopRunningService(Context context, String className) {
Intent intent_service = null;
boolean ret = false;
try {
intent_service = new Intent(context, Class.forName(className));
} catch (Exception e) {
e.printStackTrace();
}
if (intent_service != null) {
ret = context.stopService(intent_service);
}
return ret;
}
/**
* 得到CPU核心数
*
* @return CPU核心数
*/
public static int getNumCores() {
try {
File dir = new File("/sys/devices/system/cpu/");
File[] files = dir.listFiles(new FileFilter() {
public boolean accept(File pathname) {
if (Pattern.matches("cpu[0-9]", pathname.getName())) {
return true;
}
return false;
}
});
return files.length;
} catch (Exception e) {
return 1;
}
}
/**
* whether this process is named with processName
*
* @param context 上下文
* @param processName 进程名
* @return 是否含有当前的进程
*/
public static boolean isNamedProcess(Context context, String processName) {
if (context == null || TextUtils.isEmpty(processName)) {
return false;
}
int pid = android.os.Process.myPid();
ActivityManager manager = (ActivityManager) context.getSystemService(
Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> processInfoList
= manager.getRunningAppProcesses();
if (processInfoList == null) {
return true;
}
for (RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) {
if (processInfo.pid == pid &&
processName.equalsIgnoreCase(processInfo.processName)) {
return true;
}
}
return false;
}
/**
* whether application is in background
* <ul>
* <li>need use permission android.permission.GET_TASKS in Manifest.xml</li>
* </ul>
*
* @param context 上下文
* @return if application is in background return true, otherwise return
* false
*/
public static boolean isApplicationInBackground(Context context) {
ActivityManager am = (ActivityManager) context.getSystemService(
Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> taskList = am.getRunningTasks(1);
if (taskList != null && !taskList.isEmpty()) {
ComponentName topActivity = taskList.get(0).topActivity;
if (topActivity != null && !topActivity.getPackageName()
.equals(context.getPackageName())) {
return true;
}
}
return false;
}
/**
* 获取应用签名
*
* @param context 上下文
* @param pkgName 包名
* @return 返回应用的签名
*/
public static String getSign(Context context, String pkgName) {
try {
PackageInfo pis = context.getPackageManager()
.getPackageInfo(pkgName,
PackageManager.GET_SIGNATURES);
return hexdigest(pis.signatures[0].toByteArray());
} catch (NameNotFoundException e) {
e.printStackTrace();
return null;
}
}
/**
* 将签名字符串转换成需要的32位签名
*
* @param paramArrayOfByte 签名byte数组
* @return 32位签名字符串
*/
private static String hexdigest(byte[] paramArrayOfByte) {
final char[] hexDigits = { 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97,
98, 99, 100, 101, 102 };
try {
MessageDigest localMessageDigest = MessageDigest.getInstance("MD5");
localMessageDigest.update(paramArrayOfByte);
byte[] arrayOfByte = localMessageDigest.digest();
char[] arrayOfChar = new char[32];
for (int i = 0, j = 0; ; i++, j++) {
if (i >= 16) {
return new String(arrayOfChar);
}
int k = arrayOfByte[i];
arrayOfChar[j] = hexDigits[(0xF & k >>> 4)];
arrayOfChar[++j] = hexDigits[(k & 0xF)];
}
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
/**
* 清理后台进程与服务
*
* @param context 应用上下文对象context
* @return 被清理的数量
*/
public static int gc(Context context) {
long i = getDeviceUsableMemory(context);
int count = 0; // 清理掉的进程数
ActivityManager am = (ActivityManager) context.getSystemService(
Context.ACTIVITY_SERVICE);
// 获取正在运行的service列表
List<RunningServiceInfo> serviceList = am.getRunningServices(100);
if (serviceList != null) {
for (RunningServiceInfo service : serviceList) {
if (service.pid == android.os.Process.myPid()) continue;
try {
android.os.Process.killProcess(service.pid);
count++;
} catch (Exception e) {
e.getStackTrace();
}
}
}
// 获取正在运行的进程列表
List<RunningAppProcessInfo> processList = am.getRunningAppProcesses();
if (processList != null) {
for (RunningAppProcessInfo process : processList) {
// 一般数值大于RunningAppProcessInfo.IMPORTANCE_SERVICE的进程都长时间没用或者空进程了
// 一般数值大于RunningAppProcessInfo.IMPORTANCE_VISIBLE的进程都是非可见进程,也就是在后台运行着
if (process.importance >
RunningAppProcessInfo.IMPORTANCE_VISIBLE) {
// pkgList 得到该进程下运行的包名
String[] pkgList = process.pkgList;
for (String pkgName : pkgList) {
if (DEBUG) {
}
try {
am.killBackgroundProcesses(pkgName);
count++;
} catch (Exception e) { // 防止意外发生
e.getStackTrace();
}
}
}
}
}
if (DEBUG) {
}
return count;
}
/**
* 获取设备的可用内存大小
*
* @param context 应用上下文对象context
* @return 当前内存大小
*/
public static int getDeviceUsableMemory(Context context) {
ActivityManager am = (ActivityManager) context.getSystemService(
Context.ACTIVITY_SERVICE);
MemoryInfo mi = new MemoryInfo();
am.getMemoryInfo(mi);
// 返回当前系统的可用内存
return (int) (mi.availMem / (1024 * 1024));
}
/**
* 获取系统中所有的应用
*
* @param context 上下文
* @return 应用信息List
*/
public static List<PackageInfo> getAllApps(Context context) {
List<PackageInfo> apps = new ArrayList<PackageInfo>();
PackageManager pManager = context.getPackageManager();
List<PackageInfo> paklist = pManager.getInstalledPackages(0);
for (int i = 0; i < paklist.size(); i++) {
PackageInfo pak = paklist.get(i);
if ((pak.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) <=
0) {
// customs applications
apps.add(pak);
}
}
return apps;
}
/**
* 获取手机系统SDK版本
*
* @return 如API 17 则返回 17
*/
public static int getSDKVersion() {
return android.os.Build.VERSION.SDK_INT;
}
/**
* 是否Dalvik模式
*
* @return 结果
*/
public static boolean isDalvik() {
return "Dalvik".equals(getCurrentRuntimeValue());
}
/**
* 是否ART模式
*
* @return 结果
*/
public static boolean isART() {
String currentRuntime = getCurrentRuntimeValue();
return "ART".equals(currentRuntime) ||
"ART debug build".equals(currentRuntime);
}
/**
* 获取手机当前的Runtime
*
* @return 正常情况下可能取值Dalvik, ART, ART debug build;
*/
public static String getCurrentRuntimeValue() {
try {
Class<?> systemProperties = Class.forName(
"android.os.SystemProperties");
try {
Method get = systemProperties.getMethod("get", String.class,
String.class);
if (get == null) {
return "WTF?!";
}
try {
final String value = (String) get.invoke(systemProperties,
"persist.sys.dalvik.vm.lib",
/* Assuming default is */"Dalvik");
if ("libdvm.so".equals(value)) {
return "Dalvik";
}
else if ("libart.so".equals(value)) {
return "ART";
}
else if ("libartd.so".equals(value)) {
return "ART debug build";
}
return value;
} catch (IllegalAccessException e) {
return "IllegalAccessException";
} catch (IllegalArgumentException e) {
return "IllegalArgumentException";
} catch (InvocationTargetException e) {
return "InvocationTargetException";
}
} catch (NoSuchMethodException e) {
return "SystemProperties.get(String key, String def) method is not found";
}
} catch (ClassNotFoundException e) {
return "SystemProperties class is not found";
}
}
private final static X500Principal DEBUG_DN = new X500Principal(
"CN=Android Debug,O=Android,C=US");
/**
* 检测当前应用是否是Debug版本
*
* @param ctx 上下文
* @return 是否是Debug版本
*/
public static boolean isDebuggable(Context ctx) {
boolean debuggable = false;
try {
PackageInfo pinfo = ctx.getPackageManager()
.getPackageInfo(ctx.getPackageName(),
PackageManager.GET_SIGNATURES);
Signature signatures[] = pinfo.signatures;
for (int i = 0; i < signatures.length; i++) {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
ByteArrayInputStream stream = new ByteArrayInputStream(
signatures[i].toByteArray());
X509Certificate cert = (X509Certificate) cf.generateCertificate(
stream);
debuggable = cert.getSubjectX500Principal().equals(DEBUG_DN);
if (debuggable) break;
}
} catch (PackageManager.NameNotFoundException e) {
} catch (CertificateException e) {
}
return debuggable;
}
/**
* 比较版本号的大小,前者大则返回一个正数,后者大返回一个负数,相等则返回0 支持4.1.2,4.1.23.4.1.rc111这种形式
* @param version1
* @param version2
* @return
*/
public static int compareVersion(String version1, String version2) throws Exception {
if (version1 == null || version2 == null) {
throw new Exception("compareVersion error:illegal params.");
}
String[] versionArray1 = version1.split("\\.");//注意此处为正则匹配,不能用".";
String[] versionArray2 = version2.split("\\.");
int idx = 0;
int minLength = Math.min(versionArray1.length, versionArray2.length);//取最小长度值
int diff = 0;
while (idx < minLength
&& (diff = versionArray1[idx].length() - versionArray2[idx].length()) == 0//先比较长度
&& (diff = versionArray1[idx].compareTo(versionArray2[idx])) == 0) {//再比较字符
++idx;
}
//如果已经分出大小,则直接返回,如果未分出大小,则再比较位数,有子版本的为大;
diff = (diff != 0) ? diff : versionArray1.length - versionArray2.length;
return diff;
}
}
SPUtils.java
SharedPreferences 在 Android 开发种也是非常常用的,但是代码写起来着实繁琐,因此必须要封装一个工具类出来。
/**
* Created on 2022/4/2 16:02
*
* @author Gong Youqiang
*/
public class SPUtils {
public SPUtils() {
/* cannot be instantiated */
throw new UnsupportedOperationException("cannot be instantiated");
}
/**
* 保存在手机里面的文件名
*/
public static final String FILE_NAME = "mysp";
/**
* 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法
*
* @param context
* @param key
* @param object
*/
public static void put(Context context, String key, Object object) {
SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
if (object instanceof String) {
editor.putString(key, (String) object);
} else if (object instanceof Integer) {
editor.putInt(key, (Integer) object);
} else if (object instanceof Boolean) {
editor.putBoolean(key, (Boolean) object);
} else if (object instanceof Float) {
editor.putFloat(key, (Float) object);
} else if (object instanceof Long) {
editor.putLong(key, (Long) object);
} else {
editor.putString(key, object.toString());
}
SharedPreferencesCompat.apply(editor);
}
/**
* 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值
*
* @param context
* @param key
* @param defaultObject
* @return
*/
public static Object get(Context context, String key, Object defaultObject) {
SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
if (defaultObject instanceof String) {
return sp.getString(key, (String) defaultObject);
} else if (defaultObject instanceof Integer) {
return sp.getInt(key, (Integer) defaultObject);
} else if (defaultObject instanceof Boolean) {
return sp.getBoolean(key, (Boolean) defaultObject);
} else if (defaultObject instanceof Float) {
return sp.getFloat(key, (Float) defaultObject);
} else if (defaultObject instanceof Long) {
return sp.getLong(key, (Long) defaultObject);
}
return null;
}
/**
* desc:保存对象
* @param context
* @param key
* @param obj 要保存的对象,只能保存实现了serializable的对象
* modified:
*/
public static void saveObject(Context context,String key,Object obj){
try {
// 保存对象
SharedPreferences.Editor sharedata = context.getSharedPreferences(FILE_NAME, 0).edit();
//先将序列化结果写到byte缓存中,其实就分配一个内存空间
ByteArrayOutputStream bos=new ByteArrayOutputStream();
ObjectOutputStream os=new ObjectOutputStream(bos);
//将对象序列化写入byte缓存
os.writeObject(obj);
//将序列化的数据转为16进制保存
String bytesToHexString = bytesToHexString(bos.toByteArray());
//保存该16进制数组
sharedata.putString(key, bytesToHexString);
sharedata.commit();
} catch (IOException e) {
e.printStackTrace();
Log.e("", "保存obj失败");
}
}
/**
* desc:将数组转为16进制
* @param bArray
* @return
* modified:
*/
public static String bytesToHexString(byte[] bArray) {
if(bArray == null){
return null;
}
if(bArray.length == 0){
return "";
}
StringBuffer sb = new StringBuffer(bArray.length);
String sTemp;
for (int i = 0; i < bArray.length; i++) {
sTemp = Integer.toHexString(0xFF & bArray[i]);
if (sTemp.length() < 2)
sb.append(0);
sb.append(sTemp.toUpperCase());
}
return sb.toString();
}
/**
* desc:获取保存的Object对象
* @param context
* @param key
* @return
* modified:
*/
public static Object getObject(Context context,String key){
try {
SharedPreferences sharedata = context.getSharedPreferences(FILE_NAME, 0);
if (sharedata.contains(key)) {
String string = sharedata.getString(key, "");
if(TextUtils.isEmpty(string)){
return null;
}else{
//将16进制的数据转为数组,准备反序列化
byte[] stringToBytes = StringToBytes(string);
ByteArrayInputStream bis=new ByteArrayInputStream(stringToBytes);
ObjectInputStream is=new ObjectInputStream(bis);
//返回反序列化得到的对象
Object readObject = is.readObject();
return readObject;
}
}
} catch (StreamCorruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//所有异常返回null
return null;
}
/**
* desc:将16进制的数据转为数组
* <p>创建人:聂旭阳 , 2014-5-25 上午11:08:33</p>
* @param data
* @return
* modified:
*/
public static byte[] StringToBytes(String data){
String hexString=data.toUpperCase().trim();
if (hexString.length()%2!=0) {
return null;
}
byte[] retData=new byte[hexString.length()/2];
for(int i=0;i<hexString.length();i++)
{
int int_ch; // 两位16进制数转化后的10进制数
char hex_char1 = hexString.charAt(i); 两位16进制数中的第一位(高位*16)
int int_ch3;
if(hex_char1 >= '0' && hex_char1 <='9')
int_ch3 = (hex_char1-48)*16; 0 的Ascll - 48
else if(hex_char1 >= 'A' && hex_char1 <='F')
int_ch3 = (hex_char1-55)*16; A 的Ascll - 65
else
return null;
i++;
char hex_char2 = hexString.charAt(i); ///两位16进制数中的第二位(低位)
int int_ch4;
if(hex_char2 >= '0' && hex_char2 <='9')
int_ch4 = (hex_char2-48); 0 的Ascll - 48
else if(hex_char2 >= 'A' && hex_char2 <='F')
int_ch4 = hex_char2-55; A 的Ascll - 65
else
return null;
int_ch = int_ch3+int_ch4;
retData[i/2]=(byte) int_ch;//将转化后的数放入Byte里
}
return retData;
}
/**
* 移除某个key值已经对应的值
*
* @param context
* @param key
*/
public static void remove(Context context, String key) {
SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.remove(key);
SharedPreferencesCompat.apply(editor);
}
/**
* 清除所有数据
*
* @param context
*/
public static void clear(Context context) {
SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.clear();
SharedPreferencesCompat.apply(editor);
}
/**
* 查询某个key是否已经存在
*
* @param context
* @param key
* @return
*/
public static boolean contains(Context context, String key) {
SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
return sp.contains(key);
}
/**
* 返回所有的键值对
*
* @param context
* @return
*/
public static Map<String, ?> getAll(Context context) {
SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
return sp.getAll();
}
/**
* 创建一个解决SharedPreferencesCompat.apply方法的一个兼容类
*
* @author zhy
*
*/
private static class SharedPreferencesCompat {
private static final Method sApplyMethod = findApplyMethod();
/**
* 反射查找apply的方法
*
* @return
*/
({"unchecked", "rawtypes"})
private static Method findApplyMethod() {
try {
Class clz = SharedPreferences.Editor.class;
return clz.getMethod("apply");
} catch (NoSuchMethodException e) {
}
return null;
}
/**
* 如果找到则使用apply执行,否则使用commit
*
* @param editor
*/
public static void apply(SharedPreferences.Editor editor) {
try {
if (sApplyMethod != null) {
sApplyMethod.invoke(editor);
return;
}
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
} catch (InvocationTargetException e) {
}
editor.commit();
}
}
}
DateUtils.java
日期操作工具类。
/**
* 英文简写如:2020
*/
public static String FORMAT_Y = "yyyy";
/**
* 英文简写如:12:01
*/
public static String FORMAT_HM = "HH:mm";
/**
* 英文简写如:1-12 12:01
*/
public static String FORMAT_MDHM = "MM-dd HH:mm";
/**
* 英文简写(默认)如:2020-12-01
*/
public static String FORMAT_YMD = "yyyy-MM-dd";
/**
* 英文全称 如:2020-12-01 23:15
*/
public static String FORMAT_YMDHM = "yyyy-MM-dd HH:mm";
/**
* 英文全称 如:2020-12-01 23:15:06
*/
public static String FORMAT_YMDHMS = "yyyy-MM-dd HH:mm:ss";
/**
* 精确到毫秒的完整时间 如:yyyy-MM-dd HH:mm:ss.S
*/
public static String FORMAT_FULL = "yyyy-MM-dd HH:mm:ss.S";
/**
* 精确到毫秒的完整时间 如:yyyy-MM-dd HH:mm:ss.S
*/
public static String FORMAT_FULL_SN = "yyyyMMddHHmmssS";
/**
* 中文简写 如:2020年12月01日
*/
public static String FORMAT_YMD_CN = "yyyy年MM月dd日";
/**
* 中文简写 如:2020年12月01日 12时
*/
public static String FORMAT_YMDH_CN = "yyyy年MM月dd日 HH时";
/**
* 中文简写 如:2020年12月01日 12时12分
*/
public static String FORMAT_YMDHM_CN = "yyyy年MM月dd日 HH时mm分";
/**
* 中文全称 如:2020年12月01日 23时15分06秒
*/
public static String FORMAT_YMDHMS_CN = "yyyy年MM月dd日 HH时mm分ss秒";
/**
* 精确到毫秒的完整中文时间
*/
public static String FORMAT_FULL_CN = "yyyy年MM月dd日 HH时mm分ss秒SSS毫秒";
public static Calendar calendar = null;
private static final String FORMAT = "yyyy-MM-dd HH:mm:ss";
public static Date str2Date(String str) {
return str2Date(str, null);
}
public static Date str2Date(String str, String format) {
if (str == null || str.length() == 0) {
return null;
}
if (format == null || format.length() == 0) {
format = FORMAT;
}
Date date = null;
try {
SimpleDateFormat sdf = new SimpleDateFormat(format);
date = sdf.parse(str);
} catch (Exception e) {
e.printStackTrace();
}
return date;
}
public static Calendar str2Calendar(String str) {
return str2Calendar(str, null);
}
public static Calendar str2Calendar(String str, String format) {
Date date = str2Date(str, format);
if (date == null) {
return null;
}
Calendar c = Calendar.getInstance();
c.setTime(date);
return c;
}
public static String date2Str(Calendar c) {// yyyy-MM-dd HH:mm:ss
return date2Str(c, null);
}
public static String date2Str(Calendar c, String format) {
if (c == null) {
return null;
}
return date2Str(c.getTime(), format);
}
public static String date2Str(Date d) {// yyyy-MM-dd HH:mm:ss
return date2Str(d, null);
}
public static String date2Str(Date d, String format) {// yyyy-MM-dd HH:mm:ss
if (d == null) {
return null;
}
if (format == null || format.length() == 0) {
format = FORMAT;
}
SimpleDateFormat sdf = new SimpleDateFormat(format);
String s = sdf.format(d);
return s;
}
public static String getCurDateStr() {
Calendar c = Calendar.getInstance();
c.setTime(new Date());
return c.get(Calendar.YEAR) + "-" + (c.get(Calendar.MONTH) + 1) + "-" +
c.get(Calendar.DAY_OF_MONTH) + "-" +
c.get(Calendar.HOUR_OF_DAY) + ":" + c.get(Calendar.MINUTE) +
":" + c.get(Calendar.SECOND);
}
/**
* 获得当前日期的字符串格式
* @param format 格式化的类型
* @return 返回格式化之后的事件
*/
public static String getCurDateStr(String format) {
Calendar c = Calendar.getInstance();
return date2Str(c, format);
}
/**
*
* @param time 当前的时间
* @return 格式到秒
*/
//
public static String getMillon(long time) {
return new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(time);
}
/**
*
* @param time 当前的时间
* @return 当前的天
*/
public static String getDay(long time) {
return new SimpleDateFormat("yyyy-MM-dd").format(time);
}
/**
*
* @param time 时间
* @return 返回一个毫秒
*/
// 格式到毫秒
public static String getSMillon(long time) {
return new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss-SSS").format(time);
}
/**
* 在日期上增加数个整月
* @param date 日期
* @param n 要增加的月数
* @return 增加数个整月
*/
public static Date addMonth(Date date, int n) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.MONTH, n);
return cal.getTime();
}
/**
* 在日期上增加天数
* @param date 日期
* @param n 要增加的天数
* @return 增加之后的天数
*/
public static Date addDay(Date date, int n) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.DATE, n);
return cal.getTime();
}
/**
* 获取距现在某一小时的时刻
*
* @param format 格式化时间的格式
* @param h 距现在的小时 例如:h=-1为上一个小时,h=1为下一个小时
* @return 获取距现在某一小时的时刻
*/
public static String getNextHour(String format, int h) {
SimpleDateFormat sdf = new SimpleDateFormat(format);
Date date = new Date();
date.setTime(date.getTime() + h * 60 * 60 * 1000);
return sdf.format(date);
}
/**
* 获取时间戳
* @return 获取时间戳
*/
public static String getTimeString() {
SimpleDateFormat df = new SimpleDateFormat(FORMAT_FULL);
Calendar calendar = Calendar.getInstance();
return df.format(calendar.getTime());
}
/**
* 功能描述:返回月
*
* @param date Date 日期
* @return 返回月份
*/
public static int getMonth(Date date) {
calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar.get(Calendar.MONTH) + 1;
}
/**
* 功能描述:返回日
*
* @param date Date 日期
* @return 返回日份
*/
public static int getDay(Date date) {
calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar.get(Calendar.DAY_OF_MONTH);
}
/**
* 功能描述:返回小
*
* @param date 日期
* @return 返回小时
*/
public static int getHour(Date date) {
calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar.get(Calendar.HOUR_OF_DAY);
}
/**
* 功能描述:返回分
*
* @param date 日期
* @return 返回分钟
*/
public static int getMinute(Date date) {
calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar.get(Calendar.MINUTE);
}
/**
* 获得默认的 date pattern
* @return 默认的格式
*/
public static String getDatePattern() {
return FORMAT_YMDHMS;
}
/**
* 返回秒钟
*
* @param date Date 日期
* @return 返回秒钟
*/
public static int getSecond(Date date) {
calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar.get(Calendar.SECOND);
}
/**
* 使用预设格式提取字符串日期
*
* @param strDate 日期字符串
* @return 提取字符串的日期
*/
public static Date parse(String strDate) {
return parse(strDate, getDatePattern());
}
/**
* 功能描述:返回毫
*
* @param date 日期
* @return 返回毫
*/
public static long getMillis(Date date) {
calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar.getTimeInMillis();
}
/**
* 按默认格式的字符串距离今天的天数
*
* @param date 日期字符串
* @return 按默认格式的字符串距离今天的天数
*/
public static int countDays(String date) {
long t = Calendar.getInstance().getTime().getTime();
Calendar c = Calendar.getInstance();
c.setTime(parse(date));
long t1 = c.getTime().getTime();
return (int) (t / 1000 - t1 / 1000) / 3600 / 24;
}
/**
* 使用用户格式提取字符串日期
*
* @param strDate 日期字符串
* @param pattern 日期格式
* @return 提取字符串日期
*/
public static Date parse(String strDate, String pattern) {
SimpleDateFormat df = new SimpleDateFormat(pattern);
try {
return df.parse(strDate);
} catch (ParseException e) {
e.printStackTrace();
return null;
}
}
/**
* 按用户格式字符串距离今天的天数
*
* @param date 日期字符串
* @param format 日期格式
* @return 按用户格式字符串距离今天的天数
*/
public static int countDays(String date, String format) {
long t = Calendar.getInstance().getTime().getTime();
Calendar c = Calendar.getInstance();
c.setTime(parse(date, format));
long t1 = c.getTime().getTime();
return (int) (t / 1000 - t1 / 1000) / 3600 / 24;
}
SystemUtils.java
public class SystemUtils {
/**
* 检查WIFI是否连接
*/
public static boolean isWifiConnected(Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
return true;
}
return false;
}
/**
* 检查手机网络(4G/3G/2G)是否连接
*/
public static boolean isMobileNetworkConnected(Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
return true;
}
return false;
}
/**
* 检查是否有可用网络
*/
public static boolean isNetworkConnected(Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
return connectivityManager.getActiveNetworkInfo() != null;
}
/**
* 获取网络类型 wifi或者移动网络
*
* @return 0无网络 1 wifi 2移动网络
*/
public static int getNetworkType(Context context) {
if (!isNetworkConnected(context)) {//先判断是否有网络
return 0;
}
if (isWifiConnected(context)) {
return 1;
}
if (isMobileNetworkConnected(context)) {
return 2;
}
return 0;
}
/**
* 保存文字到剪贴板
*
* @param context
* @param text
*/
public static void copyToClipBoard(Context context, String text) {
ClipData clipData = ClipData.newPlainText("url", text);
ClipboardManager manager = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
manager.setPrimaryClip(clipData);
}
}
TimeUtils.java
public class TimeUtils {
/**
*一些时间格式
*/
public final static String FORMAT_TIME = "HH:mm";
public final static String FORMAT_DATE_TIME = "yyyy-MM-dd HH:mm";
public final static String FORMAT_DATE_TIME_SECOND = "yyyy-MM-dd HH:mm:ss";
public final static String FORMAT_MONTH_DAY_TIME = "MM-dd HH:mm";
public final static String FORMAT_DATE = "yyyy-MM-dd";
public static String getFormatToday(String dateFormat) {
Date currentTime = new Date();
SimpleDateFormat formatter = new SimpleDateFormat(dateFormat);
return formatter.format(currentTime);
}
public static Date stringToDate(String dateStr, String dateFormat) {
SimpleDateFormat formatter = new SimpleDateFormat(dateFormat);
try {
return formatter.parse(dateStr);
} catch (ParseException e) {
return null;
}
}
public static String dateToString(Date date, String dateFormat) {
SimpleDateFormat formatter = new SimpleDateFormat(dateFormat);
return formatter.format(date);
}
/**
*类似QQ/微信 聊天消息的时间
*/
public static String getChatTime(boolean hasYear, long timesamp) {
long clearTime = timesamp;
String result;
SimpleDateFormat sdf = new SimpleDateFormat("dd");
Date today = new Date(System.currentTimeMillis());
Date otherDay = new Date(clearTime);
int temp = Integer.parseInt(sdf.format(today))
- Integer.parseInt(sdf.format(otherDay));
switch (temp) {
case 0:
result = "今天 " + getHourAndMin(clearTime);
break;
case 1:
result = "昨天 " + getHourAndMin(clearTime);
break;
case 2:
result = "前天 " + getHourAndMin(clearTime);
break;
default:
result = getTime(hasYear,clearTime);
break;
}
return result;
}
private static String getTime(boolean hasYear, long time) {
String pattern=FORMAT_DATE_TIME;
if(!hasYear){
pattern = FORMAT_MONTH_DAY_TIME;
}
SimpleDateFormat format = new SimpleDateFormat(pattern);
return format.format(new Date(time));
}
private static String getHourAndMin(long time) {
SimpleDateFormat format = new SimpleDateFormat(FORMAT_TIME);
return format.format(new Date(time));
}
/**
* 获取当前日期是星期几<br>
*
* @param date
* @return 当前日期是星期几
*/
public static String getWeekOfDate(Date date) {
String[] weekDays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
if (w < 0)
w = 0;
return weekDays[w];
}
/**
* 判断某个日期与今天相差 x年x天
* 如果大于1年,显示x年x天 。否则显示 x天
* @param timeStamp
* @return
*/
public static String getOffsetYearAndDayByTimeStamp(long timeStamp) {
String result;
long currentTimeStamp = System.currentTimeMillis();
long targetTimestamp = timeStamp * 1000L;
int days = (int) ((currentTimeStamp - targetTimestamp) / ONE_YEAr);
if (days > 365) {
//大于1年
Calendar calendar1 = Calendar.getInstance();
calendar1.setTimeInMillis(currentTimeStamp);
Calendar calendar2 = Calendar.getInstance();
calendar2.setTimeInMillis(targetTimestamp);
//先判断是否同年
int y1 = calendar1.get(Calendar.YEAR);
int y2 = calendar2.get(Calendar.YEAR);
int d1 = calendar1.get(Calendar.DAY_OF_YEAR);
int d2 = calendar2.get(Calendar.DAY_OF_YEAR);
result = (y1 - y2) + "年" + (d1 - d2);
} else {
//不满一年,直接返回天数
result = String.valueOf(days);
}
return result;
}
/**
* 描述:计算两个日期所差的天数.
*
* @param date1 第一个时间的毫秒表示
* @param date2 第二个时间的毫秒表示
* @return int 所差的天数
*/
public static int getOffsetDay(long date1, long date2) {
Calendar calendar1 = Calendar.getInstance();
calendar1.setTimeInMillis(date1);
Calendar calendar2 = Calendar.getInstance();
calendar2.setTimeInMillis(date2);
//先判断是否同年
int y1 = calendar1.get(Calendar.YEAR);
int y2 = calendar2.get(Calendar.YEAR);
int d1 = calendar1.get(Calendar.DAY_OF_YEAR);
int d2 = calendar2.get(Calendar.DAY_OF_YEAR);
int maxDays = 0;
int day = 0;
if (y1 - y2 > 0) {
maxDays = calendar2.getActualMaximum(Calendar.DAY_OF_YEAR);
day = d1 - d2 + maxDays;
} else if (y1 - y2 < 0) {
maxDays = calendar1.getActualMaximum(Calendar.DAY_OF_YEAR);
day = d1 - d2 - maxDays;
} else {
day = d1 - d2;
}
return day;
}
/**
* 描述:计算两个日期所差的小时数.
*
* @param date1 第一个时间的毫秒表示
* @param date2 第二个时间的毫秒表示
* @return int 所差的小时数
*/
public static int getOffsetHour(long date1, long date2) {
Calendar calendar1 = Calendar.getInstance();
calendar1.setTimeInMillis(date1);
Calendar calendar2 = Calendar.getInstance();
calendar2.setTimeInMillis(date2);
int h1 = calendar1.get(Calendar.HOUR_OF_DAY);
int h2 = calendar2.get(Calendar.HOUR_OF_DAY);
int h = 0;
int day = getOffsetDay(date1, date2);
h = h1 - h2 + day * 24;
return h;
}
/**
* 描述:计算两个日期所差的分钟数.
*
* @param date1 第一个时间的毫秒表示
* @param date2 第二个时间的毫秒表示
* @return int 所差的分钟数
*/
public static int getOffsetMinutes(long date1, long date2) {
Calendar calendar1 = Calendar.getInstance();
calendar1.setTimeInMillis(date1);
Calendar calendar2 = Calendar.getInstance();
calendar2.setTimeInMillis(date2);
int m1 = calendar1.get(Calendar.MINUTE);
int m2 = calendar2.get(Calendar.MINUTE);
int h = getOffsetHour(date1, date2);
int m = 0;
m = m1 - m2 + h * 60;
return m;
}
/**
* 描述:获取本周的某一天.
*
* @param format the format
* @param calendarField the calendar field
* @return String String类型日期时间
*/
private static String getDayOfWeek(String format, int calendarField) {
String strDate = null;
try {
Calendar c = new GregorianCalendar();
SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format);
int week = c.get(Calendar.DAY_OF_WEEK);
if (week == calendarField) {
strDate = mSimpleDateFormat.format(c.getTime());
} else {
int offectDay = calendarField - week;
if (calendarField == Calendar.SUNDAY) {
offectDay = 7 - Math.abs(offectDay);
}
c.add(Calendar.DATE, offectDay);
strDate = mSimpleDateFormat.format(c.getTime());
}
} catch (Exception e) {
e.printStackTrace();
}
return strDate;
}
/**
* 获取当前日期是星期几
*
* @param date
* @return 当前日期是星期几
*/
public static String getWeekOfDate(Date date) {
String[] weekDays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
if (w < 0)
w = 0;
return weekDays[w];
}
/**
* 描述:获取本月第一天.
*
* @param format the format
* @return String String类型日期时间
*/
public static String getFirstDayOfMonth(String format) {
String strDate = null;
try {
Calendar c = new GregorianCalendar();
SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format);
//当前月的第一天
c.set(GregorianCalendar.DAY_OF_MONTH, 1);
strDate = mSimpleDateFormat.format(c.getTime());
} catch (Exception e) {
e.printStackTrace();
}
return strDate;
}
/**
* 描述:获取本月最后一天.
*
* @param format the format
* @return String String类型日期时间
*/
public static String getLastDayOfMonth(String format) {
String strDate = null;
try {
Calendar c = new GregorianCalendar();
SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format);
// 当前月的最后一天
c.set(Calendar.DATE, 1);
c.roll(Calendar.DATE, -1);
strDate = mSimpleDateFormat.format(c.getTime());
} catch (Exception e) {
e.printStackTrace();
}
return strDate;
}
}