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,
開發人員必備技能——單元測試
