Android 開發中遇到的問題

1. Fragment 的 onAttach(Activity) 方法在 API 23 以後被棄用,改成 onAttach(Context) ,因此針對不一樣的 SDK 版本使用不一樣的方法。例子:

@TargetApi(23)
   @Override  
   public void onAttach(Context context) {  
       super.onAttach(context);  
       // 執行操做 
   }  
  
   /* 
    * Deprecated on API 23 
    * Use onAttachToContext instead 
    */  
   @SuppressWarnings("deprecation")  
   @Override  
   public void onAttach(Activity activity) {  
       super.onAttach(activity);  
       if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {  
            // 執行操做 
       }  
   }  
複製代碼

Fragment 中,若是要獲取 Activity 對象,不建議調用 getActivity() ,而是在 onAttach() 中將 Context 對象強轉爲 Activity 對象。java

2. AtomicLong 和 Long 的區別是?

AtomicLong 是線程安全的,Long 是線程不安全的。android

3. GestureDetector 的做用是什麼?

GestureDetector 是一個手勢監聽識別的類,其有兩個接口 OnGestureListener,OnDoubleTapListener 和一個靜態內部類 SimpleOnGestureListener。這個內部類實現了提供的兩個接口。具體實例以下:
複製代碼
GestureDetector detector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
            //須要處理什麼手勢,重寫相應的回調方法
            @Override
            public boolean onDoubleTap(MotionEvent e) {
                //雙擊的回調
                return super.onDoubleTap(e);
            }
        });

view.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                detector.onTouchEvent(event);
                return false;
            }
        });
複製代碼

4. Android 中在 WebView 中訪問微信的支付頁面,打不開的問題

mWebview.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                // 以下方案可在非微信內部WebView的H5頁面中調出微信支付
                if (url.startsWith("weixin://wap/pay?")) {
                    Intent intent = new Intent();
                    intent.setAction(Intent.ACTION_VIEW);
                    intent.setData(Uri.parse(url));
                    startActivity(intent);
                    return true;
                }
                view.loadUrl(url);
                return true;
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                // 這個方法有可能會屢次執行
                super.onPageFinished(view, url);
            }
        });
複製代碼

5. Activity 的生命週期 A 啓動 B 的生命週期流程

A:onCreate->A:onStart->A:onResume->A:onPause->B:onCreate->B:onStart->B:onResume->A:onStop
複製代碼

6. ToolBar 左側有一個默認的左邊距,不去掉致使與設計頁面不符

經過給 ToolBar 設置 app:contentInsetStart="0dp" 屬性能夠去除默認的左邊距
複製代碼

7. ARouter 設置了 withFlags 必須須要在 navigation 中設置 Activity,否則會報 Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. 若是不添加 withFlags,ARouter 會自動給不是 Activity 的添加 FLAG_ACTIVITY_NEW_TASK flag。

ARouter.getInstance().build(RouterConfig.APPLICATION_ACTIVITY).withFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP).navigation(Actvity.this);
複製代碼

8. View 的 scrollTo() 和 scrollBy() 方法移動方向

當水平方向爲正值,向左側移動,爲負值向右側移動。
當垂直方向爲正值,向上移動,爲負值向下移動。
複製代碼

9.Webview 的 clearHistory() 方法不起做用的解決

clearHistory() 做用是調用方法時,清空當前頁面以前的全部記錄

方法1:postDelayed 延時調用
webView.postDelayed(new Runnable() {
    @Override
    public void run() {
        webView.clearHistory();
    }
}, 1000);

方法2:在 onPageFinished 方法中去調用 clearHistory 方法
複製代碼

10. Android 7.0 以上 AES 加密報錯 java.security.NoSuchAlgorithmException: class configured for SecureRandom (provider: Crypto) cannot be found.

InsecureSHA1PRNGKeyDerivator 工具類的下載地址git

解決方法
private static byte[] getRawKey(byte[] seed) throws Exception {
        if (Build.VERSION.SDK_INT >= 24) {//對 9.0 以上的進行處理
            byte[] rawKey = InsecureSHA1PRNGKeyDerivator.deriveInsecureKey(seed, 32);
            return rawKey;
        } else {
            KeyGenerator kgen = KeyGenerator.getInstance(AES);
            //for android
            SecureRandom sr = null;
            // 在4.2以上版本中,SecureRandom獲取方式發生了改變
            if (android.os.Build.VERSION.SDK_INT >= 17) {
                sr = SecureRandom.getInstance(SHA1PRNG, "Crypto");
            } else {
                sr = SecureRandom.getInstance(SHA1PRNG);
            }
            // for Java
            // secureRandom = SecureRandom.getInstance(SHA1PRNG);
            sr.setSeed(seed);
            kgen.init(128, sr); //256 bits or 128 bits,192bits
            //AES中128位密鑰版本有10個加密循環,192比特密鑰版本有12個加密循環,256比特密鑰版本則有14個加密循環。
            SecretKey skey = kgen.generateKey();
            byte[] raw = skey.getEncoded();
            return raw;
        }
    }
複製代碼

11. 在 Android P 上彈窗提示 Detected problems with API compatibility(visit g.co/dev/appcompat for more info)

Android P 後谷歌限制了開發者調用非官方公開 API 方法或接口,若是經過反射調用了非官方的 API 就會提示這個彈窗,建議查找代碼去掉相應的反射。
複製代碼

12. Android 9.0 網絡請求報 java.net.UnknownServiceException: CLEARTEXT communication ** not permitted by network security policy

在Android P 系統的設備上,若是應用使用的是非加密的明文流量的 http 網絡請求,則會致使該應用沒法進行網絡請求,https 則不會受影響,一樣地,若是應用嵌套了 webview,webview 也只能使用 https 請求。

解決辦法:1.將請求替換未 https
2. 在 res 下新增一個 xml 目錄,而後建立一個名爲:network_security_config.xml 文件(名字自定) ,內容以下,大概意思就是容許開啓 http 請求

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
 <base-config cleartextTrafficPermitted="true" />
</network-security-config>

而後在APP的AndroidManifest.xml文件下的application標籤增長如下屬性


<application
...
 android:networkSecurityConfig="@xml/network_security_config"
...
/>
複製代碼

13. Android 9.0 上報 ClassNotFoundException: Didn't find class "org.apache.http.conn.scheme.SchemeRegistry

官方給出的解釋github

在 Android 6.0 中,咱們取消了對 Apache HTTP 客戶端的支持。 從 Android 9 開始,默認狀況下該內容庫已從 bootclasspath 中移除且不可用於應用。

解決辦法:在 AndroidManifest.xml 的 application 節點下添加如下內容:

<uses-library android:name="org.apache.http.legacy" android:required="false"/>
複製代碼

14. Android 使用三方庫通常都須要在 Application 中作一些初始化,使用 ContentProvider,能夠將初始化放到庫中自定義的 ContentProvider 中讓主 APP 使用,由於 ContentProvider 的初始化是在 Application 之中進行的。

15. Android 8.0 某些手機會報 java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation

方案 1:去除 android:screenOrientation="portrait",或者不調用設置方向的代碼
方案 2:設置 <item name="android:windowIsTranslucent">false</item>
<item name="android:windowIsFloating">false</item>
複製代碼

16. Android 原生 webview 加載出現頁面部份內容不顯示,日誌報了 This request has been blocked; the content must be served over HTTPS.

這個是加載的地址是https的,一些資源文件使用的是http方法的,從安卓4.4以後對webview安全機制有了增強,webview裏面加載https url的時候,若是裏面須要加載http的資源或者重定向的時候,webview會block頁面加載。須要設置MixedContentMode。

以下設置:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            // 5.0以上容許加載http和https混合的頁面(5.0如下默認容許,5.0+默認禁止)
            webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}

複製代碼

17. 當一個類的方法被 protected 修飾,只有在同一個包下才能被調用,要想在別的包下調用能夠用匿名內部類的方式

Gson 的 TypeToken 構造函數是 protected。
TypeToken<List<String>> list = new TypeToken<List<String>>() {};
複製代碼

18. 數字保留兩位小數的方法

DecimalFormat decimalFormat = new DecimalFormat("0.00");
String format = decimalFormat.format(mPrice);
複製代碼

19. 報錯信息:Bitmap: Error, cannot access an invalid/free'd bitmap here!

debug 後也發現是在 nativeColorSpaceCopy 這裏出問題,所以不要手動 recycle()
去掉手動調用 bitmap 的 recycle() 方法便可。
複製代碼

20. Java 集合的總結

jdk 1.6中以下,別的版本有所不一樣
HashMap 的默認大小爲16,閥值爲0.75,擴容大小爲(當前大小+當前大小*0.75),線程不安全,數據結構爲數組加單向鏈表組成的哈希表結構,鍵值對容許爲null。
HashTable 的默認大小爲11,閥值爲0.75,擴容大小爲(當前大小*2+1),線程安全,數據結構爲數組加單向鏈表組成的哈希表結構,鍵值對不容許爲null。
ArrayList 的默認大小爲10,擴容大小爲(當前大小*1.5+1),線程不安全,數據結構爲動態數組,能夠添加null。
LinkedList 的默認大小爲10,由於是雙向鏈表因此無需擴容,線程不安全,能夠添加null。
HashSet 內部使用了 HashMap 的 Key 來存儲數據,他的數據不能重複。
複製代碼

21. Java 內部類的問題

1.內部類中不能包含靜態方法,必須爲靜態內部類包含靜態方法。
2.靜態內部類不能直接直接訪問外部類的非靜態屬性
複製代碼

22. Android 某些機型拍照出來的照片默認旋轉了90度,若是咱們要加載圖片應該先獲取圖片旋轉了多少度,而後再旋轉回去顯示

獲取圖片旋轉的角度
public static int readPictureDegree(String path) {
        int degree = 0;
        try {
            ExifInterface exifInterface = new ExifInterface(path);
            int orientation = exifInterface.getAttributeInt(
                    ExifInterface.TAG_ORIENTATION,
                    ExifInterface.ORIENTATION_NORMAL);
            switch (orientation) {
                case ExifInterface.ORIENTATION_ROTATE_90:
                    degree = 90;
                    break;
                case ExifInterface.ORIENTATION_ROTATE_180:
                    degree = 180;
                    break;
                case ExifInterface.ORIENTATION_ROTATE_270:
                    degree = 270;
                    break;
            }
        } catch (IOException e) {
            e.printStackTrace();
            return degree;
        }
        return degree;
    }
複製代碼

以後不定時更新遇到的問題,GitHub地址

相關文章
相關標籤/搜索