android 快速开发 -- 常用 utils 类,androidstudio 期末项目
????????{??
????????????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;??
????}??
????/**?
?????*?移除某个 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?
?????????*/??
????????@SuppressWarnings({?"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();??
????????}??
????}??
}??
对 SharedPreference 的使用做了建议的封装,对外公布出 put,get,remove,clear 等等方法;
注意一点,里面所有的 commit 操作使用了 SharedPreferencesCompat.apply 进行了替代,目的是尽可能的使用 apply 代替 commit
首先说下为什么,因为 commit 方法是同步的,并且我们很多时候的 commit 操作都是 UI 线程中,毕竟是 IO 操作,尽可能异步;
所以我们使用 apply 进行替代,apply 异步的进行写入;
但是 apply 相当于 commit 来说是 new API 呢,为了更好的兼容,我们做了适配;
SharedPreferencesCompat 也可以给大家创建兼容类提供了一定的参考~~
==================================================================================
[java]? view plain copy
package?com.zhy.utils;??
import?android.content.Context;??
import?android.util.TypedValue;??
/**?
?*?常用单位转换的辅助类?
?*??
?*??
?*??
?*/??
public?class?DensityUtils??
{??
????private?DensityUtils()??
????{??
????????/*?cannot?be?instantiated?*/??
????????throw?new?UnsupportedOperationException("cannot?be?instantiated");??
????}??
????/**?
?????*?dp 转 px?
?????*??
?????*?@param?context?
?????*?@param?val?
?????*?@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?
?????*?@param?val?
?????*?@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?fontScale?
?????*?@param?pxVal?
?????*?@return?
?????*/??
????public?static?float?px2sp(Context?context,?float?pxVal)??
????{??
????????return?(pxVal?/?context.getResources().getDisplayMetrics().scaledDensity);??
????}??
}??
====================================================================================
[java]? view plain copy
package?com.zhy.utils;??
import?java.io.File;??
import?android.os.Environment;??
import?android.os.StatFs;??
/**?
?*?SD 卡相关的辅助类?
?*??
?*??
?*??
?*/??
public?class?SDCardUtils??
{??
????private?SDCardUtils()??
????{??
????????/*?cannot?be?instantiated?*/??
????????throw?new?UnsupportedOperationException("cannot?be?instantiated");??
????}??
????/**?
?????*?判断 SDCard 是否可用?
?????*??
?????*?@return?
?????*/??
????public?static?boolean?isSDCardEnable()??
????{??
????????return?Environment.getExternalStorageState().equals(??
????????????????Environment.MEDIA_MOUNTED);??
????}??
????/**?
?????*?获取 SD 卡路径?
?????*??
?????*?@return?
?????*/??
????public?static?String?getSDCardPath()??
????{??
????????return?Environment.getExternalStorageDirectory().getAbsolutePath()??
????????????????+?File.separator;??
????}??
????/**?
?????*?获取 SD 卡的剩余容量?单位 byte?
?????*??
?????*?@return?
?????*/??
????public?static?long?getSDCardAllSize()??
????{??
????????if?(isSDCardEnable())??
????????{??
????????????StatFs?stat?=?new?StatFs(getSDCardPath());??
????????????//?获取空闲的数据块的数量??
????????????long?availableBlocks?=?(long)?stat.getAvailableBlocks()?-?4;??
????????????//?获取单个数据块的大小(byte)??
????????????long?freeBlocks?=?stat.getAvailableBlocks();??
????????????return?freeBlocks?*?availableBlocks;??
????????}??
????????return?0;??
????}??
????/**?
?????*?获取指定路径所在空间的剩余可用容量字节数,单位 byte?
?????*??
?????*?@param?filePath?
?????*?@return?容量字节?SDCard 可用空间,内部存储可用空间?
?????*/??
????public?static?long?getFreeBytes(String?filePath)??
????{??
????????//?如果是 sd 卡的下的路径,则获取 sd 卡可用容量??
????????if?(filePath.startsWith(getSDCardPath()))??
????????{??
????????????filePath?=?getSDCardPath();??
????????}?else??
????????{//?如果是内部存储的路径,则获取内存存储的可用容量??
????????????filePath?=?Environment.getDataDirectory().getAbsolutePath();??
????????}??
????????StatFs?stat?=?new?StatFs(filePath);??
????????long?availableBlocks?=?(long)?stat.getAvailableBlocks()?-?4;??
????????return?stat.getBlockSize()?*?availableBlocks;??
????}??
????/**?
?????*?获取系统存储路径?
?????*??
?????*?@return?
?????*/??
????public?static?String?getRootDirectoryPath()??
????{??
????????return?Environment.getRootDirectory().getAbsolutePath();??
????}??
}??
===================================================================================
[java]? view plain copy
package?com.zhy.utils;??
import?android.app.Activity;??
import?android.content.Context;??
import?android.graphics.Bitmap;??
import?android.graphics.Rect;??
import?android.util.DisplayMetrics;??
import?android.view.View;??
import?android.view.WindowManager;??
/**?
?*?获得屏幕相关的辅助类?
?*??
?*??
?*??
?*/??
public?class?ScreenUtils??
{??
????private?ScreenUtils()??
????{??
????????/*?cannot?be?instantiated?*/??
????????throw?new?UnsupportedOperationException("cannot?be?instantiated");??
????}??
????/**?
?????*?获得屏幕高度?
?????*??
?????*?@param?context?
?????*?@return?
?????*/??
????public?static?int?getScreenWidth(Context?context)??
????{??
????????WindowManager?wm?=?(WindowManager)?context??
????????????????.getSystemService(Context.WINDOW_SERVICE);??
????????DisplayMetrics?outMetrics?=?new?DisplayMetrics();??
????????wm.getDefaultDisplay().getMetrics(outMetrics);??
????????return?outMetrics.widthPixels;??
????}??
????/**?
?????*?获得屏幕宽度?
?????*??
?????*?@param?context?
?????*?@return?
?????*/??
????public?static?int?getScreenHeight(Context?context)??
????{??
????????WindowManager?wm?=?(WindowManager)?context??
????????????????.getSystemService(Context.WINDOW_SERVICE);??
????????DisplayMetrics?outMetrics?=?new?DisplayMetrics();??
????????wm.getDefaultDisplay().getMetrics(outMetrics);??
????????return?outMetrics.heightPixels;??
????}??
????/**?
?????*?获得状态栏的高度?
?????*??
?????*?@param?context?
?????*?@return?
《Android 学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享
?????*/??
????public?static?int?getStatusHeight(Context?context)??
????{??
????????int?statusHeight?=?-1;??
????????try??
????????{??
????????????Class<?>?clazz?=?Class.forName("com.android.internal.R$dimen");??
????????????Object?object?=?clazz.newInstance();??
????????????int?height?=?Integer.parseInt(clazz.getField("status_bar_height")??
????????????????????.get(object).toString());??
????????????statusHeight?=?context.getResources().getDimensionPixelSize(height);??
????????}?catch?(Exception?e)??
????????{??
????????????e.printStackTrace();??
????????}??
????????return?statusHeight;??
????}??
????/**?
?????*?获取当前屏幕截图,包含状态栏?
?????*??
?????*?@param?activity?
?????*?@return?
?????*/??
????public?static?Bitmap?snapShotWithStatusBar(Activity?activity)??
????{??
????????View?view?=?activity.getWindow().getDecorView();??
????????view.setDrawingCacheEnabled(true);??
????????view.buildDrawingCache();??
????????Bitmap?bmp?=?view.getDrawingCache();??
????????int?width?=?getScreenWidth(activity);??
????????int?height?=?getScreenHeight(activity);??
????????Bitmap?bp?=?null;??
????????bp?=?Bitmap.createBitmap(bmp,?0,?0,?width,?height);??
????????view.destroyDrawingCache();??
????????return?bp;??
????}??
????/**?
?????*?获取当前屏幕截图,不包含状态栏?
?????*??
?????*?@param?activity?
?????*?@return?
?????*/??
????public?static?Bitmap?snapShotWithoutStatusBar(Activity?activity)??
????{??
????????View?view?=?activity.getWindow().getDecorView();??
????????view.setDrawingCacheEnabled(true);??
????????view.buildDrawingCache();??
????????Bitmap?bmp?=?view.getDrawingCache();??
????????Rect?frame?=?new?Rect();??
????????activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);??
????????int?statusBarHeight?=?frame.top;??
????????int?width?=?getScreenWidth(activity);??
????????int?height?=?getScreenHeight(activity);??
????????Bitmap?bp?=?null;??
????????bp?=?Bitmap.createBitmap(bmp,?0,?statusBarHeight,?width,?height??
????????????????-?statusBarHeight);??
????????view.destroyDrawingCache();??
????????return?bp;??
????}??
}??
========================================================================
[java]? view plain copy
package?com.zhy.utils;??
import?android.content.Context;??
import?android.content.pm.PackageInfo;??
import?android.content.pm.PackageManager;??
import?android.content.pm.PackageManager.NameNotFoundException;??
/**?
?*?跟 App 相关的辅助类?
?*??
?*??
?*??
?*/??
public?class?AppUtils??
{??
????private?AppUtils()??
????{??
????????/*?cannot?be?instantiated?*/??
????????throw?new?UnsupportedOperationException("cannot?be?instantiated");??
????}??
????/**?
?????*?获取应用程序名称?
?????*/??
????public?static?String?getAppName(Context?context)??
????{??
????????try??
????????{??
????????????PackageManager?packageManager?=?context.getPackageManager();??
????????????PackageInfo?packageInfo?=?packageManager.getPackageInfo(??
????????????????????context.getPackageName(),?0);??
????????????int?labelRes?=?packageInfo.applicationInfo.labelRes;??
????????????return?context.getResources().getString(labelRes);??
????????}?catch?(NameNotFoundException?e)??
????????{??
????????????e.printStackTrace();??
????????}??
????????return?null;??
????}??
????/**?
?????*?[获取应用程序版本名称信息]?
?????*??
?????*?@param?context?
?????*?@return?当前应用的版本名称?
?????*/??
????public?static?String?getVersionName(Context?context)??
????{??
????????try??
????????{??
????????????PackageManager?packageManager?=?context.getPackageManager();??
????????????PackageInfo?packageInfo?=?packageManager.getPackageInfo(??
????????????????????context.getPackageName(),?0);??
????????????return?packageInfo.versionName;??
????????}?catch?(NameNotFoundException?e)??
????????{??
????????????e.printStackTrace();??
????????}??
????????return?null;??
????}??
}??
=====================================================================================
[java]? view plain copy
package?com.zhy.utils;??
import?android.content.Context;??
import?android.view.inputmethod.InputMethodManager;??
import?android.widget.EditText;??
/**?
?*?打开或关闭软键盘?
?*??
?*?@author?zhy?
?*??
?*/??
public?class?KeyBoardUtils??
{??
????/**?
?????*?打卡软键盘?
?????*??
?????*?@param?mEditText?
?????*????????????输入框?
?????*?@param?mContext?
?????*????????????上下文?
?????*/??
????public?static?void?openKeybord(EditText?mEditText,?Context?mContext)??
????{??
????????InputMethodManager?imm?=?(InputMethodManager)?mContext??
????????????????.getSystemService(Context.INPUT_METHOD_SERVICE);??
????????imm.showSoftInput(mEditText,?InputMethodManager.RESULT_SHOWN);??
????????imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,??
????????????????InputMethodManager.HIDE_IMPLICIT_ONLY);??
????}??
????/**?
?????*?关闭软键盘?
?????*??
?????*?@param?mEditText?
?????*????????????输入框?
?????*?@param?mContext?
?????*????????????上下文?
?????*/??
????public?static?void?closeKeybord(EditText?mEditText,?Context?mContext)??
????{??
????????InputMethodManager?imm?=?(InputMethodManager)?mContext??
????????????????.getSystemService(Context.INPUT_METHOD_SERVICE);??
????????imm.hideSoftInputFromWindow(mEditText.getWindowToken(),?0);??
????}??
}??
================================================================================
[java]? view plain copy
package?com.zhy.utils;??
import?android.app.Activity;??
import?android.content.ComponentName;??
import?android.content.Context;??
import?android.content.Intent;??
import?android.net.ConnectivityManager;??
import?android.net.NetworkInfo;??
/**?
?*?跟网络相关的工具类?
?*??
?*??
?*??
?*/??
public?class?NetUtils??
{??
????private?NetUtils()??
????{??
????????/*?cannot?be?instantiated?*/??
????????throw?new?UnsupportedOperationException("cannot?be?instantiated");??
????}??
????/**?
?????*?判断网络是否连接?
?????*??
?????*?@param?context?
?????*?@return?
?????*/??
????public?static?boolean?isConnected(Context?context)??
????{??
????????ConnectivityManager?connectivity?=?(ConnectivityManager)?context??
????????????????.getSystemService(Context.CONNECTIVITY_SERVICE);??
????????if?(null?!=?connectivity)??
????????{??
????????????NetworkInfo?info?=?connectivity.getActiveNetworkInfo();??
????????????if?(null?!=?info?&&?info.isConnected())??
????????????{??
????????????????if?(info.getState()?==?NetworkInfo.State.CONNECTED)??
????????????????{??
????????????????????return?true;??
????????????????}??
????????????}??
????????}??
????????return?false;??
????}??
????/**?
?????*?判断是否是 wifi 连接?
?????*/??
????public?static?boolean?isWifi(Context?context)??
????{??
????????ConnectivityManager?cm?=?(ConnectivityManager)?context??
????????????????.getSystemService(Context.CONNECTIVITY_SERVICE);??
????????if?(cm?==?null)??
????????????return?false;??
????????return?cm.getActiveNetworkInfo().getType()?==?ConnectivityManager.TYPE_WIFI;??
????}??
????/**?
?????*?打开网络设置界面?
?????*/??
????public?static?void?openSetting(Activity?activity)??
????{??
????????Intent?intent?=?new?Intent("/");??
????????ComponentName?cm?=?new?ComponentName("com.android.settings",??
????????????????"com.android.settings.WirelessSettings");??
????????intent.setComponent(cm);??
????????intent.setAction("android.intent.action.VIEW");??
????????activity.startActivityForResult(intent,?0);??
????}??
}??
====================================================================================
[java]? view plain copy
package?com.zhy.utils;??
import?java.io.BufferedReader;??
import?java.io.ByteArrayOutputStream;??
import?java.io.IOException;??
import?java.io.InputStream;??
import?java.io.InputStreamReader;??
import?java.io.PrintWriter;??
import?java.net.HttpURLConnection;??
import?java.net.URL;??
/**?
?*?Http 请求的工具类?
?*??
?*?@author?zhy?
?*??
?*/??
public?class?HttpUtils??
{??
????private?static?final?int?TIMEOUT_IN_MILLIONS?=?5000;??
????public?interface?CallBack??
????{??
????????void?onRequestComplete(String?result);??
????}??
????/**?
?????*?异步的 Get 请求?
?????*??
?????*?@param?urlStr?
?????*?@param?callBack?
?????*/??
????public?static?void?doGetAsyn(final?String?urlStr,?final?CallBack?callBack)??
????{??
????????new?Thread()??
????????{??
????????????public?void?run()??
????????????{??
????????????????try??
????????????????{??
????????????????????String?result?=?doGet(urlStr);??
????????????????????if?(callBack?!=?null)??
????????????????????{??
????????????????????????callBack.onRequestComplete(result);??
????????????????????}??
????????????????}?catch?(Exception?e)??
????????????????{??
????????????????????e.printStackTrace();??
????????????????}??
????????????};??
????????}.start();??
????}??
????/**?
?????*?异步的 Post 请求?
?????*?@param?urlStr?
?????*?@param?params?
?????*?@param?callBack?
?????*?@throws?Exception?
?????*/??
????public?static?void?doPostAsyn(final?String?urlStr,?final?String?params,??
????????????final?CallBack?callBack)?throws?Exception??
????{??
????????new?Thread()??
????????{??
????????????public?void?run()??
????????????{??
????????????????try??
????????????????{??
????????????????????String?result?=?doPost(urlStr,?params);??
????????????????????if?(callBack?!=?null)??
????????????????????{??
????????????????????????callBack.onRequestComplete(result);??
????????????????????}??
????????????????}?catch?(Exception?e)??
????????????????{??
????????????????????e.printStackTrace();??
????????????????}??
????????????};??
????????}.start();??
????}??
????/**?
?????*?Get 请求,获得返回数据?
?????*??
?????*?@param?urlStr?
?????*?@return?
?????*?@throws?Exception?
?????*/??
????public?static?String?doGet(String?urlStr)???
????{??
????????URL?url?=?null;??
????????HttpURLConnection?conn?=?null;??
????????InputStream?is?=?null;??
????????ByteArrayOutputStream?baos?=?null;??
????????try??
????????{??
????????????url?=?new?URL(urlStr);??
????????????conn?=?(HttpURLConnection)?url.openConnection();??
????????????conn.setReadTimeout(TIMEOUT_IN_MILLIONS);??
????????????conn.setConnectTimeout(TIMEOUT_IN_MILLIONS);??
????????????conn.setRequestMethod("GET");??
????????????conn.setRequestProperty("accept",?"*/*");??
????????????conn.setRequestProperty("connection",?"Keep-Alive");??
????????????if?(conn.getResponseCode()?==?200)??
????????????{??
????????????????is?=?conn.getInputStream();??
????????????????baos?=?new?ByteArrayOutputStream();??
????????????????int?len?=?-1;??
????????????????byte[]?buf?=?new?byte[128];??
????????????????while?((len?=?is.read(buf))?!=?-1)??
????????????????{??
????????????????????baos.write(buf,?0,?len);??
最后
我这里整理了一份完整的学习思维以及 Android 开发知识大全 PDF。
当然实践出真知,即使有了学习线路也要注重实践,学习过的内容只有结合实操才算是真正的掌握。
评论