開發(fā)一個優(yōu)秀的Android應(yīng)用你必須要加入的代碼及配置(開發(fā)一個android應(yīng)用程序)
-
開發(fā)一個Android App我們一般需要繼承Application來初始化一些配置,如下所示:
a. Application中有一個registerActivityLifecycleCallbacks()方法,可以在回調(diào)中把整個應(yīng)用打開的Activity保存在集合中、銷毀的Activity重集合中刪除。個人覺得這種方式比BaseActivity的方式或者每打開一個Activity把當(dāng)前的引用加入到集合中的方式優(yōu)雅多了,推薦大家用這種方式。關(guān)閉應(yīng)用也非常方便,遍歷保存Activity的集合,執(zhí)行finish()就好。
/**
b. 嚴(yán)苛模式StrictMode:建議大家在Debug版本打開嚴(yán)苛模式。 例如:嚴(yán)苛模式下可以檢測到你應(yīng)用中沒有關(guān)閉的流,可以減少OOM,如下所示,可以看到在在控制臺嚴(yán)苛模式模式下的Log輸出。
image.png
ThreadPolicy線程策略檢測
自定義的耗時調(diào)用 使用detectCustomSlowCalls()開啟
磁盤讀取操作 使用detectDiskReads()開啟
磁盤寫入操作 使用detectDiskWrites()開啟
網(wǎng)絡(luò)操作 使用detectNetwork()開啟
VmPolicy虛擬機策略檢測
Activity泄露 使用detectActivityLeaks()開啟
未關(guān)閉的Closable對象泄露 使用detectLeakedClosableObjects()開啟
泄露的Sqlite對象 使用detectLeakedSqlLiteObjects()開啟
檢測實例數(shù)量 使用setClassInstanceLimit()開啟
/**嚴(yán)苛模式主要檢測兩大問題,一個是線程策略,即TreadPolicy,另一個是VM策略,即VmPolicy。*/if (AppConfig.IS_DEBUG && Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
c .在onCreate中,檢測當(dāng)前進(jìn)程名稱是否為應(yīng)用包名,否則return (像百度地圖等sdk需要在單獨的進(jìn)程中執(zhí)行,會多次執(zhí)行Application的onCreate()方法,所以為了只初始化一次應(yīng)用配置,作此判斷),代碼如下:
/**檢測當(dāng)前進(jìn)程名稱是否為應(yīng)用包名,否則return (像百度地圖等sdk需要在單獨的進(jìn)程中執(zhí)行,會多次執(zhí)行Application的onCreate()方法,所以為了只初始化一次應(yīng)用配置,作此判斷)*/if (!CommonUtil.getCurProcessName(this).equals(getPackageName())) { return;
d . Crash全局異常捕獲,用到了一個第三方庫,使用方法如下:
compile \’cat.ereza:customactivityoncrash:1.5.0\’
CustomActivityOnCrash.install(this);
應(yīng)用發(fā)生異常時customactivityoncrash庫會打開一個如下圖所示的Activity頁面,可以查看錯誤。
image.png
e .其他配置初始化
private void init() { /**注冊ActivityListener*/
2 .完整MyApplication代碼,如下所示:
public class MyApplication extends Application { private static MyApplication application; /**
3 . 應(yīng)用的入口SplashActivity的onCreate方法中要加入如下代碼,解決首次安裝應(yīng)用,點擊應(yīng)用圖標(biāo)打開應(yīng)用,點擊home健回到桌面,再次點擊應(yīng)用圖標(biāo),進(jìn)入應(yīng)用時多次初始化SplashActivity的問題
/**在應(yīng)用的入口activity加入以下代碼,解決首次安裝應(yīng)用,點擊應(yīng)用圖標(biāo)打開應(yīng)用,點擊home健回到桌面,再次點擊應(yīng)用圖標(biāo),進(jìn)入應(yīng)用時多次初始化SplashActivity的問題*/if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {
4 . app下的build.gradle配置,代碼如下
apply plugin: \’com.android.application\’apply plugin: \’com.antfortune.freeline\’android { //國內(nèi)鏡像地址來下載 $ ./gradlew initFreeline -Pmirror
5 . 應(yīng)用根目錄下得build.gradle文件配置,代碼如下:
// Top-level build file where you can add configuration options common to all sub-projects/modules.ext {
6 . 應(yīng)用的混淆配置文件,代碼如下:
-keepclassmembers class fqcn.of.javascript.interface.for.webview { public *;
7 . 此Demo的功能,可以在應(yīng)用內(nèi)切換Base_Url,退出登錄時還原默認(rèn)的Base_Url ,導(dǎo)出應(yīng)用的私有數(shù)據(jù)到SD卡上,個人覺得這幾個功能,是我們開發(fā)app時很需要的功能,如下所示:
image.png
8 . 混淆前后文件目錄變化如下圖所示,其中mapping.txt文件為混淆的映射文件,每個版本要注意保存起來(Umeng上需要導(dǎo)入這個文件的)。
image.png
9 . 對系統(tǒng)Log類的封裝Logger類,可以在控制臺打印出如下圖所示的功能,主要實現(xiàn)代碼如下:
StackTraceElement stackTrace = Thread.currentThread().getStackTrace()[4];