1,MD5工具类:
public class MD5Util { public final static String MD5(String s) { char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; try { byte[] btInput = s.getBytes(); // 获得MD5摘要算法的 MessageDigest 对象 MessageDigest mdInst = MessageDigest.getInstance("MD5"); // 使用指定的字节更新摘要 mdInst.update(btInput); // 获得密文 byte[] md = mdInst.digest(); // 把密文转换成十六进制的字符串形式 int j = md.length; char str[] = new char[j * 2]; int k = 0; for (int i = 0; i < j; i++) { byte byte0 = md[i]; str[k++] = hexDigits[byte0 >>> 4 & 0xf]; str[k++] = hexDigits[byte0 & 0xf]; } return new String(str); } catch (Exception e) { return null; } } public static void main(String[] args) { System.out.print(MD5Util.MD5("password")); } }
2,线程睡眠
public class CSleep { public static final long DEFAULT_SLEEP_TIME = 500; private boolean isRuning = false; public boolean isRuning() { return isRuning; } public void runWithTime(final long defaultSleepTime) { isRuning = true; new Thread() { @Override public void run() { try { sleep(defaultSleepTime, 0); } catch (InterruptedException e) { e.printStackTrace(); } isRuning = false; super.run(); } }.start(); } }
3,检查网络是否连通
/** * 检查网络是否连通 * * @return boolean * @since V1.0 */ public boolean isNetworkAvailable(Context context) { // 创建并初始化连接对象 ConnectivityManager connMan = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); // 判断初始化是否成功并作出相应处理 if (connMan != null) { // 调用getActiveNetworkInfo方法创建对象,如果不为空则表明网络连通,否则没连通 NetworkInfo info = connMan.getActiveNetworkInfo(); if (info != null) { return info.isAvailable(); } } return false; }
4,异常类捕捉
/** * UncaughtException处理类,当程序发生Uncaught异常的时候,由该类来接管程序,并记录发送错误报告. 需要在Application中注册,为了要在程序启动器就监控整个程序。 */ public class CrashHandler implements UncaughtExceptionHandler { /** TAG */ public static final String TAG = "CrashHandler"; /** 系统默认的UncaughtException处理类 */ private Thread.UncaughtExceptionHandler mDefaultHandler; /** CrashHandler实例 */ private static CrashHandler mCrashHandler; /** 程序的Context对象 */ private Context mContext; /** 用来存储设备信息和异常信息 */ private Map<String, String> infos = new HashMap<String, String>(); /** 用于格式化日期,作为日志文件名的一部分 */ private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss"); /** * 私有构造函数 */ private CrashHandler() { } /** * 获取CrashHandler实例 ,单例模式 * * @return * @since V1.0 */ public static CrashHandler getInstance() { if (mCrashHandler == null) mCrashHandler = new CrashHandler(); return mCrashHandler; } /** * 初始化 * * @param context * @since V1.0 */ public void init(Context context) { mContext = context; // 获取系统默认的UncaughtException处理器 mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler(); // 设置该CrashHandler为程序的默认处理器 Thread.setDefaultUncaughtExceptionHandler(this); } /** * 当UncaughtException发生时会转入该函数来处理 */ @Override public void uncaughtException(Thread thread, Throwable ex) { if (!handleException(ex) && mDefaultHandler != null) { // 如果用户没有处理则让系统默认的异常处理器来处理 mDefaultHandler.uncaughtException(thread, ex); } else { try { Thread.sleep(3000); } catch (InterruptedException e) { CLog.e(TAG, "uncaughtException() InterruptedException:" + e); } // 退出程序 android.os.Process.killProcess(android.os.Process.myPid()); System.exit(1); } } /** * 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成. * * @param ex * @return true:如果处理了该异常信息;否则返回false. * @since V1.0 */ private boolean handleException(Throwable ex) { if (ex == null) { return false; } // 收集设备参数信息 collectDeviceInfo(mContext); // 使用Toast来显示异常信息 new Thread() { @Override public void run() { Looper.prepare(); Toast.makeText(mContext, "很抱歉,程序出现异常,即将退出.", Toast.LENGTH_SHORT).show(); Looper.loop(); } }.start(); // 保存日志文件 saveCatchInfo2File(ex); return true; } /** * 收集设备参数信息 * * @param ctx * @since V1.0 */ public void collectDeviceInfo(Context ctx) { try { PackageManager pm = ctx.getPackageManager(); PackageInfo pi = pm.getPackageInfo(ctx.getPackageName(), PackageManager.GET_ACTIVITIES); if (pi != null) { String versionName = pi.versionName == null ? "null" : pi.versionName; String versionCode = pi.versionCode + ""; infos.put("versionName", versionName); infos.put("versionCode", versionCode); } } catch (NameNotFoundException e) { CLog.e(TAG, "collectDeviceInfo() an error occured when collect package info NameNotFoundException:", e); } Field[] fields = Build.class.getDeclaredFields(); for (Field field : fields) { try { field.setAccessible(true); infos.put(field.getName(), field.get(null).toString()); CLog.d(TAG, field.getName() + " : " + field.get(null)); } catch (Exception e) { CLog.e(TAG, "collectDeviceInfo() an error occured when collect crash info Exception:", e); } } } /** * 保存错误信息到文件中 * * @param ex * @return 返回文件名称,便于将文件传送到服务器 */ private String saveCatchInfo2File(Throwable ex) { StringBuffer sb = new StringBuffer(); for (Map.Entry<String, String> entry : infos.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); sb.append(key + "=" + value + "\n"); } Writer writer = new StringWriter(); PrintWriter printWriter = new PrintWriter(writer); ex.printStackTrace(printWriter); Throwable cause = ex.getCause(); while (cause != null) { cause.printStackTrace(printWriter); cause = cause.getCause(); } printWriter.close(); String result = writer.toString(); sb.append(result); try { long timestamp = System.currentTimeMillis(); String time = formatter.format(new Date()); String fileName = "crash-" + time + "-" + timestamp + ".log"; if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { String path = FilePathUtil.getiVMSDirPath() + "/crash/"; File dir = new File(path); if (!dir.exists()) { dir.mkdirs(); } FileOutputStream fos = new FileOutputStream(path + fileName); fos.write(sb.toString().getBytes()); // 发送给开发人员 sendCrashLog2PM(path + fileName); fos.close(); } return fileName; } catch (Exception e) { CLog.e(TAG, "saveCatchInfo2File() an error occured while writing file... Exception:", e); } return null; } /** * 将捕获的导致崩溃的错误信息发送给开发人员 目前只将log日志保存在sdcard 和输出到LogCat中,并未发送给后台。 * * @param fileName * @since V1.0 */ private void sendCrashLog2PM(String fileName) { if (!new File(fileName).exists()) { CLog.e(TAG, "sendCrashLog2PM() 日志文件不存在"); return; } FileInputStream fis = null; BufferedReader reader = null; String s = null; try { fis = new FileInputStream(fileName); reader = new BufferedReader(new InputStreamReader(fis, "GBK")); while (true) { s = reader.readLine(); if (s == null) break; // 由于目前尚未确定以何种方式发送,所以先打出log日志。 CLog.e(TAG, s); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { // 关闭流 try { reader.close(); fis.close(); } catch (IOException e) { e.printStackTrace(); } } } }
5,弹出框提醒
public static Dialog showDialog(Context ctx, int layViewID, int ThemeType) { Dialog res = new Dialog(ctx, ThemeType); res.setContentView(layViewID); return res; }
6,图片API类
public class ImageAPI { public static Bitmap getImageByFilePath(String filePath, int scale) { Bitmap res = null; BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(filePath, options); options.inJustDecodeBounds = false; options.inSampleSize = scale; options.inPreferredConfig = Bitmap.Config.ARGB_4444; return res; } public static Bitmap getImageByFilePath(String filePath, int Towidth, int ToHeight) { Bitmap res = null; BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; if (!new File(filePath).exists()) return res; BitmapFactory.decodeFile(filePath, options); int origionalWidth = options.outHeight; int origionalHeight = options.outWidth; options.inJustDecodeBounds = false; int scale = Math.max(origionalWidth / Towidth, origionalHeight / ToHeight); options.inSampleSize = scale; options.inPreferredConfig = Bitmap.Config.ARGB_4444; try { res = BitmapFactory.decodeFile(filePath, options); } catch (Exception e) { e.printStackTrace(); return null; } catch (OutOfMemoryError e) { e.printStackTrace(); return null; } return res; } }
10,提醒封装类
public static void showToast(Context ctx, int id, String str) { if (str == null) { return; } Toast toast = Toast.makeText(ctx, ctx.getString(id) + str, Toast.LENGTH_SHORT); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); } public static void showToast(Context ctx, String errInfo) { if (errInfo == null) { return; } Toast toast = Toast.makeText(ctx, errInfo, Toast.LENGTH_SHORT); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); }
阅读扩展
源于对掌握的Android开发基础点进行整理,罗列下已经总结的文章,从中可以看到技术积累的过程。
1,
Android系统简介
2,
ProGuard代码混淆
6,
EventBus初理解
14,
Android 动画的理解
16,
Android IPC 机制
17,
View 的事件体系
18,
View 的工作原理
20,
Activity 启动过程分析
21,
Service 启动过程分析
22,
Android 性能优化
23,
Android 消息机制
24,
Android Bitmap相关
25,
Android 线程和线程池
28,
Android 触摸事件机制
29,
Android 事件机制应用
30,
Cordova 框架的一些理解
31,
有关 Android 插件化思考
32,
开发人员必备技能——单元测试