常用的一些工具類

JYcoder發表於2018-03-31

安卓基礎開發庫,讓開發簡單點。
DevRing & Demo地址github.com/LJYcoder/De…

前言

幾乎每個專案都會有各種各樣的工具類,在開發中通過它們可更直接方便地實現功能。下面將介紹一些比較常用的工具類,而具體的實現請下載demo檢視程式碼。


介紹

1. Log列印

demo中提供了RingLog工具類(出自ZhaoKaiQiang),和普通的Log一樣包含Verbose、Debug、Info、Warn、Error、Assert幾個等級,還支援將json或xml文字格式化後輸出。
使用:
1)控制是否列印。正式打包上線時可設為false:

RingLog.init(true);
複製程式碼


2)列印

//比如列印Error級日誌
RingLog.e(TAG, message);

//將jsonString格式化後列印出來
RingLog.json(TAG, jsonString);

//將xmlString格式化後列印出來
RingLog.xml(TAG, xmlString);
複製程式碼

這個Log工具類一個很大的好處是,你可以快速地跟蹤到呼叫列印的具體位置。如圖:

Log跟蹤1

點選MoviePresenter即可定位到輸出列印的位置

Log跟蹤2

2. 崩潰列印

demo中提供了CrashDiary工具類,用於在程式崩潰時,輸出異常日誌到手機本地檔案中,方便在沒連線電腦時檢視異常資訊。
可指定異常資訊所輸出的檔案(位置)

程式崩潰時,即可到對應的位置下檢視異常資訊,如圖:

檢視崩潰日誌1

檢視崩潰日誌2

3. 手機系統型別

demo中提供了SystemTypeUtil工具類,用於處理與手機系統型別相關的事件。
部分手機的系統是基於原生Android系統改造的(如小米,魅族),所以在有些功能的實現上需要做相容處理,如設定狀態列中圖文的顏色模式、跳轉到許可權管理頁面。

  • 判斷手機型別
boolean flag;
flag = SystemTypeUtil.isEMUI();//是否為華為手機
flag = SystemTypeUtil.isMIUI();//是否為小米手機
flag = SystemTypeUtil.isFlyme();//是否為魅族手機
複製程式碼
  • 跳轉到許可權管理頁面
//跳轉,相容不同手機系統型別
SystemTypeUtil.goToPermissionManager(context);
複製程式碼
  • 設定狀態列中圖文的顏色模式(深色模式或亮色模式)
boolean isDark = true;//true表示深色模式,false表示亮色模式
Window window = getWindow();
boolean flag = SystemTypeUtil.setStatusBarLightMode(window, isDark);//返回true表示設定成功
複製程式碼

深色模式效果圖:

深色模式
亮色模式效果圖:
亮色模式

4. android 6.0許可權申請

android6.0後(targetSdkVersion>=23)對於敏感許可權,app需要向使用者提出授權申請。
demo中提供了PermissionManager用於6.0版本的許可權申請,使用RxPermisiion實現。

這裡說下一般的申請流程:
1)在 AndroidManifest.xml 新增許可權宣告。
2)使用 checkSelfPermission 檢查某個許可權是否已經申請。
3)許可權未申請,使用 requestPermissions 申請許可權,然後會回撥onRequestPermissionsResult。
4)在 onRequestPermissionsResult 回撥中判斷許可權是否申請成功。
5)如果申請失敗,則使用 shouldShowRequestPermissionRationale 判斷使用者是否勾選了 "不再提醒"。勾選了的話,則彈出一個 Dialog 引導使用者到設定介面授予許可權。沒勾選的話,可以什麼都不做,也可以彈出彈出一個 Dialog 引導使用者到設定介面授予許可權。

5. 網路狀態

demo中提供了NetworkUtil工具類,用於查詢網路狀態

//當前網路是否可用,返回true表示可用,false表示不可以用
NetworkUtil.isNetWorkAvailable(context);

//當前網路是否為wifi網路,返回true表示是,false表示不是
NetworkUtil.isWifiConnected(context);

//當前網路是否為手機行動網路,返回true表示是,false表示不是
NetworkUtil.isMobileConnected(context);

...
複製程式碼

6. File相關

demo中提供了FileUtil工具類,用於處理File相關的操作

  • SD卡是否能用
FileUtil.isSDCardAvailable();
複製程式碼
  • 建立資料夾
/**
* 建立一個資料夾, 存在則返回, 不存在則新建
*
* @param String parentDirectory 父目錄路徑
* @param String directory  目錄名
* @return 檔案,null代表失敗
*/
FileUtil.getDirectory(parentDirectory, directory);

/**
 * 建立一個資料夾, 存在則返回, 不存在則新建
 *
 * @param File parentDirectory 父目錄
 * @param String directory  目錄名
 * @return 檔案,null代表失敗
 */
 FileUtil.getDirectory(parentDirectory, directory)
複製程式碼
  • 建立檔案
/**
 * 建立一個檔案, 存在則返回, 不存在則新建
 *
 * @param File catalog 父目錄
 * @param String name    檔名
 * @return 檔案,null代表失敗
 */
 FileUtil.getFile(catalog, name);

/**
* 根據全路徑建立一個檔案
*
* @param filePath 檔案全路徑
* @return 檔案,null代表失敗
*/
FileUtil.getFile(filePath);
複製程式碼
  • 刪除檔案
/**
* 刪除檔案/資料夾
* 如果是資料夾,則會刪除其下的檔案以及它本身
* @param file file
* @return true代表成功刪除
*/
FileUtil.deleteFile(file);
複製程式碼
  • 計算檔案大小
/**
 * 計算檔案/資料夾的大小
 * @param file 檔案或資料夾
 * @return long 檔案大小
 */
FileUtil.calculateFileSize(file);
複製程式碼
  • 獲取系統提供的資料夾路徑
//返回"/data"目錄
FileUtil.getDataDirectory();

//返回"/storage/emulated/0"目錄
FileUtil.getExternalStorageDirectory();

//返回"/system"目錄
FileUtil.getRootDirectory();

//返回"/cache"目錄
FileUtil.getDownloadCacheDirectory();

//返回"/data/user/0/com.xxx.xxx/cache"目錄
FileUtil.getCacheDir();

//返回"/data/user/0/com.xxx.xxx/files"目錄
FileUtil.getFilesDir();

//返回"/storage/emulated/0/Android/data/com.xxx.xxx/cache"目錄
FileUtil.getExternalCacheDir();

/**
 * @param String type 所放的檔案的型別,傳入的引數是Environment類中的DIRECTORY_XXX靜態變數
 * @return 返回"/storage/emulated/0/xxx"目錄
 *         例如傳入Environment.DIRECTORY_ALARMS則返回"/storage/emulated/0/Alarms"
 */
FileUtil.getExternalStoragePublicDirectory(type);

/**
 * @param String type 所放的檔案的型別,傳入的引數是Environment類中的DIRECTORY_XXX靜態變數
 * @return  返回"/storage/emulated/0/Android/data/com.xxx.xxx/files/Alarms"目錄
 *          例如傳入Environment.DIRECTORY_ALARMS則返回"/storage/emulated/0/Android/data/com.xxx.xxx/files/Alarms"
 */
FileUtil.getExternalFilesDir(type);
複製程式碼

7. Activity棧管理

demo中提供了ActivityStackManager工具類,用於存放管理Activity棧。
使用流程:
1.在activity建立時呼叫pushOneActivity(Activity activity)推入棧,可放於Activity基類中

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mStackManager = ActivityStackManager.getInstance();
    mStackManager.pushOneActivity(this);
}
複製程式碼

2.在activity銷燬時呼叫popOneActivity(Activity activity)彈出棧,可放於Activity基類中

@Override
protected void onDestroy() {
    mStackManager.popOneActivity(this);
    super.onDestroy();
}
複製程式碼

3.當你想要退出某個Activity時,可呼叫exitActivity(Class cls)

mStackManager.exitActivity(CollectActivity.class);
複製程式碼

4.當你想要退出整個應用(所有Activity)時,可呼叫exitApplication()

mStackManager.exitApplication();
複製程式碼

還提供了其他方法,具體請檢視demo程式碼

8. 快取

demo中提供了CacheManager,裡面提供了記憶體快取、磁碟快取、SharedPreferences快取。
其中磁碟快取可定製快取時長、位置、大小。
使用方法就是拿到相關的快取管理,然後進行put和get操作。

9. Toast

demo中提供了RingToast工具類,方便吐司。
使用流程
1.Application中初始化

RingToast.init(this);//初始化吐司
複製程式碼

2.在要吐司的地方呼叫show

RingToast.show("hello world");

RingToast.show(R.string.appName);
複製程式碼

10. 密度單位轉換

demo提供了DensityUtil工具類,用於密度單位的轉換

  • px轉dp
int dp = DensityUtil.px2dp(context, px);
複製程式碼
  • dp轉px
int px = DensityUtil.dp2px(context, dp);
複製程式碼
  • sp轉px
int px = DensityUtil.sp2px(context, sp);
複製程式碼
  • px轉sp
int sp = DensityUtil.px2sp(context, px);
複製程式碼

11. ImageUtil

demo中提供了圖片工具類,用於對圖片進行壓縮(比例壓縮或質量壓縮)、跳轉到相機/相簿、對Bitmap做高斯模糊處理等。

//從相機獲取圖片
ImageUtil.getImageFromCamera(context, mPhotoUri);
//從相簿獲取圖片
ImageUtil.getImageFromAlbums(context);
//裁減圖片為500*500尺寸,並且壓縮圖片為不大於3M的大小
bitmap = ImageUtil.qualityCompress(ImageUtil.scaleCompress(mFilePath, 500, 500), 3 * 1024);
...
複製程式碼

12. 加密

demo中提供了EncryptUtil工具類,用於md5加密和sha1加密。

  • md5加密
String encrpt = EncryptUtil.md5Crypt(password.getBytes());
//加鹽值
String encrpt = EncryptUtil.md5Crypt(password.getBytes(),salt);
複製程式碼
  • sha1加密
String encrpt = EncryptUtil.sha1Crypt(password.getBytes());
//加鹽值
String encrpt = EncryptUtil.sha1Crypt(password.getBytes(),salt);
複製程式碼

13. 狀態列/導航欄顏色

提供了ColorBar工具類,用於沉浸式狀態列實現,來自https://github.com/Zackratos/UltimateBar,具體用法到裡面查閱。

14. 其他

demo中還提供了一個CommonUtil,負責一些比較雜碎的功能,例如

  • 獲取裝置唯一ID號
String deviceId = CommonUtil.getDeviceUniqueId(context);
複製程式碼
  • 建立/刪除桌面快捷方式
//建立
CommonUtil.creatShortcut(context);
//刪除
CommonUtil.delShortcut(context);
複製程式碼
  • 擴充套件View的觸控範圍
//擴大view上下左右10個單位觸控的範圍
CommonUtil.expandViewTouchDelegate(view,10,10,10,10);
複製程式碼
  • ...

另外,BlankJ提供了一個各種工具類的開源專案,大家各取所需吧。
https://github.com/Blankj/AndroidUtilCode/blob/master/README-CN.md


相關文章