開發過程中,總會遇到一些讓人棘手又意外的問題。代碼明明”沒有問題”,怎麼就是不對呢?本帖就用來記錄作者在開發過程中遇到的那些意想不到的問題。
1、Intent中攜帶的數據錯位了
使用Intent攜帶數據再平常不過了,誰會想到這都會出問題。簡單描述如下:
Intent中攜帶的數據本來是
"key1":"value1"
"key2":"value2"
"key3":"value3"
但是接收到後變成了:
null:"key1"
"value1":"key2"
"value2":"key3"
太奇葩了!!
最後發現是一個疏忽引起的,其中一個對象在序列化的時候出了問題,writeParcel的時候漏寫了一個變量。而Bundle是用ArrayMap保存數據的,猜測是讀錯該對象了,導致其他的數據也出了問題。
2、程序前後臺的判斷出了問題
先上判斷前後臺的代碼:
public static boolean isAppOnForeground(Context applicationContext) {
if (null == applicationContext) return false;
ActivityManager activityManager = (ActivityManager) applicationContext.getSystemService(Context.ACTIVITY_SERVICE);
String packageName = applicationContext.getPackageName();
List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager
.getRunningAppProcesses();
if (appProcesses == null) return false;
for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
// The name of the process that this object is associated with.
if (appProcess.processName.equals(packageName)
&& appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
return true;
}
}
return false;
}
在BaseActivity的onStart()和onStop()方法中各自判斷一次。我們的程序中,這段代碼在其他手機上都沒有問題,唯獨在MIUI7.3.2.0上失效了,一直顯示在前臺呀!!但是把這段程序單獨拿出來在Demo中跑,結果又是正確的,懵了有沒有??
N久後,終於在我們程序的DaemonService上找到了端倪。DaemonService運行在其他進程,啓動的時候用到了
public boolean bindService(Intent service, ServiceConnection conn,int flags)
這個方法,其中最後一個參數flags設置的是
Context.BIND_AUTO_CREATE
程序在後臺的時候,主進程和守護進程在的importance字段在其他手機上是130,但在MIUI7.3.2.0上是100(即前臺)。改成
Context.BIND_NOT_FOREGROUND
在MIUI7.3.2.0上變成了130。
不知道是不是很好地解決方案,但找到原因了,還愁沒有好的解決方法嗎?
3、網上發現的一個問題:
If Android decides to update the system’s Webview while your app is running, it might crash your app: http://stackoverflow.com/questions/29575313/namenotfoundexception-webview
4、圖片在特定的api版本中顯示異常
剛分配的任務,問題是來消息顯示系統通知時,默認的App圖標在android5.0系統顯示的不對。當時就懵了,難道圖片還會選擇版本自動變換不成?沒想到結果真是如此。resw文件夾下,新建drawable-hdpi-v21就會在api版本爲21時,顯示這裏面的圖片。
5、通過Arrays.asList()函數產生的List不可更改。
查看源碼可知,該函數返回的ArrayList對象是Arrays類的私有靜態內部類,不同我們一般使用的ArrayList。該類只提供了少數幾個函數的支持,不提供add、remove方法
6、使用MVVM模式編寫的UI,在一次提交後,可編譯不可運行,報空指針異常。
被DataBinding害慘了。查了好久,最後發現有同事在getWindow().getDecorView().findViewById(android.R.id.content)這個View上添加了一個View,然後DataBinding解析出錯了。