Android 開發,那些奇葩的問題

開發過程中,總會遇到一些讓人棘手又意外的問題。代碼明明”沒有問題”,怎麼就是不對呢?本帖就用來記錄作者在開發過程中遇到的那些意想不到的問題。


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解析出錯了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章