Android開發筆記

如需轉載,請標明原文出處:http://www.javashuo.com/article/p-oucgedcz-dw.html ,謝謝。html

背景

針對平時開發過程當中遇到的問題、bug、難點或知識點作一個概括總結。
不定時更新。java

學習地址

1. 網站

玩Android
極客導航
鴻洋公衆號推送文章列表android

2. 博客

張鴻洋
郭霖
南塵
JessYan - MVPArms、AndroidAutoSizegit

埋坑

1. Android 5.0 如下

  1. View.getContext()強轉Activity崩潰
    直接繼承 Activity 的 Activity 構造出來的 View.getContext() 返回的是當前 Activity。
    可是:當 View 的 Activity 是繼承自 AppCompatActivity,而且在 5.0 如下版本的手機上,View.getContext() 獲得的並不是是 Activity,而是 TintContextWrapper。
    參考連接:
    View.getContext() 必定返回 Activity 對象麼?
    每日一問:View.getContext() 必定會返回 Activity 對象麼?
    View.getContext() 裏的小祕密

2. Android 6.0

  1. 運行時權限
    敏感權限崩潰,例如拍照、文件讀取等。

3. Android 7.0

  1. 文件訪問權限 FileProvider
    調用應用外文件崩潰,須要處理FileProvider。

4. Android 8.0

  1. java.lang.IllegalStateException: Only fullscreen activities can request orientation
    透明Activity在8.0設置了方向會崩潰,解決辦法:
    A. 不設置;
    B. 清單文件android:screenOrientation="behind"

5. Android 9.0

  1. 前臺服務權限,無權限調用startForeground(int id, Notification notification)會崩潰
    清單文件增長<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

6. 獲取View截圖沒有文字

TextView不能設置singleLine,不然getDrawingCache和view.draw(canvas)沒法獲取文字。具體緣由未知。github

7. 根Activity不能設置singleTask

由於MainActivity是根Activity,因此不能在清單文件中設置singleTask,不然按Home鍵後點擊icon啓動應用時,不能返回原頁面,只顯示根Activity。
由於點擊icon啓動應用本質是Intent打開根Activity,若是設置singleTask會直接清除根Activity上面全部的頁面。
若是部分狀況須要清除根Activity以上全部頁面,能夠按如下實現:面試

/**
    * startActivity
    *
    * @param context context
    * @param pageID  pageID
    */
   public static void startActivity(Context context, int pageID) {
       Intent intent = new Intent(context, MainActivity.class);
       Bundle bundle = new Bundle();
       bundle.putInt(KEY_TYPE, pageID);
       intent.putExtra(KEY_BUNDLE, bundle);
       intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
       intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
       intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
       context.startActivity(intent);
   }
複製代碼

8. Android端RSA加密密文服務端沒法解密,服務端密文Android端解密有亂碼

Cipher標準問題
服務端使用Cipher cipher = Cipher.getInstance("RSA");
Android端使用Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
參考連接:
解決Android客戶端RSA解密出來的明文含有一堆亂碼的問題
Android RSA加密 在服務端進行RSA解密不成功的問題算法

9. 點擊通知欄沒法打開Activity

步驟:編程

  1. 若是從快捷方式啓動APP,那麼,不管點多少次,均可以正常彈出activity;
  2. 若是經過返回鍵退出了APP,那麼第一次通知到來能夠正常彈出,第二次就無法彈出了。

解決:
啓動Activity添加如下代碼canvas

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
複製代碼

10. Inten分享文件Intent.ACTION_SEND微信發送沒反應

Intent須要設置具體的Type,例如intent.setDataAndType(uri, "video/mp4");segmentfault

11. Inten分享文件Intent.ACTION_SEND對話框點擊沒反應

目前發如今小米Redmi 4A / Andrid 6.0.1 / MIUI 8.5.6.0 ,發現是「後臺彈出界面」權限問題,容許這個權限能夠跳轉了,可是在別的小米手機沒有復現,並且微信也會出現這個問題,初步懷疑是MIUI系統Bug。

未完待續

小技巧

1. UiAutomator 查看手機當前頁面UI層次Id等信息。可用於AccessibilityService

啓動方法:

  1. Android Studio - Terminal - uiautomatorviewer.bat 回車便可打開;
  2. SDK路徑\tools\bin\uiautomatorviewer.bat 雙擊便可打開。

2. Android根據路徑獲取文件信息

例如:根據路徑獲取音頻、視頻時長
可以使用ContentResolver或MediaMetadataRetriever獲取文件信息

/**
     * 獲取時長
     *
     * @param path path
     * @return duration
     */
    public static long getDuration(String path) {
        MediaMetadataRetriever mmr = null;
        try {
            mmr = new MediaMetadataRetriever();
            mmr.setDataSource(path);
            return Long.parseLong(mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION));
        } catch (Exception e) {
//            e.printStackTrace();
        } finally {
            if (mmr != null) {
                mmr.release();
            }
        }
        return 0;
    }
複製代碼

參考連接:
安卓獲取視頻語音文件時間長度
ContentResolver 快速查詢文件

未完待續

知識點

0. 總結

參考連接:
Android 學習筆記核心篇

1. 模塊化開發

參考連接:
Android組件化/模塊化開發(一)
Android簡單的模塊化開發

2. ANR原理、定位及解決

參考連接:
Android ANR traces文件解析
Android ANR ANRWatchDog子線程循環檢測
Android ANR DDMS檢測
Android ANR:原理分析及解決辦法 01
Android ANR:原理分析及解決辦法 02

3. App優化

參考連接:
Android App優化, 要怎麼作?
Android性能優化前因後果總結

4. App安全

參考連接:
Android App安全防範措施的小結
Android App 安全策略

5. 對稱加密/非對稱加密算法

參考連接:
對稱加密和非對稱加密介紹和區別
對稱加密與非對稱加密

6. Android內存

參考連接:
Android App優化以內存優化(序)
Android 內存優化總結&實踐
JVM的內存區域劃分
Android 內存分哪些區
Java內存的一點理解, 靜態方法和實例方法的區別及使用場景
程序計數器(關於java虛擬機內存的那些事)
每日一問:你瞭解 Java 虛擬機結構麼?
每日一問:講講 Java 虛擬機的垃圾回收

7. static關鍵字

參考連接:
Java中的static關鍵字解析
[Java]static關鍵字的四種用法

8. 四大組件

參考連接:
Android四大組件(整理相關知識點)
Android面試四大組件基礎知識點
四大組件安全
Android組件安全詳解

9. 多態

參考連接:
什麼是多態?爲何用多態?有什麼好處?多態在什麼地方用?
多態的好處和弊端

10. 多線程

參考連接:
Android 多線程 — 線程的面試題和答案
Java -- Thread中start和run方法的區別
sleep()和wait()的區別
sleep和wait的區別,以及源碼解讀
Java多線程學習之wait、notify/notifyAll 詳解
線程同步 synchronized 同步代碼塊 同步方法 同步鎖
Java同步鎖——lock與synchronized 的區別
volatile關鍵字小總結
Java線程的6種狀態及切換(透徹講解)

11. 屏幕適配

參考連接:
JessYan - 今日頭條屏幕適配方案終極版正式發佈!

12. Java建立對象的幾種方式

參考連接:
Java中建立對象的5種方式
經過Class.newInstance()和Constructor.newInstance()兩種反射方法建立對象的異同

13. 引用類型

參考連接:
Android 強、軟、弱、虛引用 區別和使用場景

14. 排序算法

參考連接:
十大經典排序算法(動圖演示)

15. 外部啓動App、H5連接、系統分享列表增長本身的App等

參考連接:
酷炫的外部開啓Activity新姿式

16. MVC、MVP、MVVM

參考連接:
Android App的三種架構模式MVC,MVP和MVVM

17. 事件分發

參考連接:
Android中的事件傳遞和處理機制
重學安卓:學習 View 事件分發,就像外地人上了黑車!
解惑requestDisallowInterceptTouchEvent
TouchEvent事件分發機制全解析
Android事件分發之ACTION_CANCEL機制及做用
面試系列:講講 Android的事件分發機制
每日一問:Android 滑動衝突,大家都是怎樣處理的
Android事件分發機制詳解與實戰剖析,一張事件分發流程圖,讓你完全搞明白
Android 編程下 Touch 事件的分發和消費機制
Android事件分發機制詳解:史上最全面、最易懂

18. Handler

參考連接:
Android Handler機制之總目錄
我所理解的Handler
你真的懂Handler嗎?Handler問答
Looper.loop爲何不會阻塞掉UI線程?
你知道android的MessageQueue.IdleHandler嗎?

19. 多狀態管理

參考連接:
十六進制狀態管理-就算不去火星種土豆,也請務必掌握的 Android 狀態管理最佳實踐!

20. RecyclerView

RecyclerView問題彙總
RecyclerView緩存機制(咋複用?)

21. ActivityManagerService(AMS)

AMS在Android起到什麼做用,簡單的分析下Android的源碼

22. View繪製流程

Android View 的繪製流程
Android View繪製流程
自定義View之探索onLayout()、onMeasure()方法及做用
measure之UNSPECIFIED的用途

23. 圖片加載

Glide最全解析-郭霖
加載大圖片
Android 高清加載巨圖方案 拒絕壓縮圖片
PhotoView 解析

24. 數據結構

數據結構:數組和鏈表的區別(數組和鏈表的優缺點 & 數組和鏈表的適用場景)
數據結構:八大數據結構分類
漫畫算法:什麼是紅黑樹?(適合初學紅黑樹小白簡單易懂)
一文讀懂HashMap
SparseArray:解析與實現
高級工程師調優祕籍;使用SparseArray代替HashMap
ArrayList的一些常見知識點
源碼閱讀之ArrayList實現細節
源碼閱讀之LinkedList實現細節
徹底解析Andorid的緩存機制LruCache

未完待續

零碎

View.getContext() 必定返回 Activity 對象麼? View.getContext() 裏的小祕密
全面瞭解HTTP和HTTPS(開發人員必備)
ButterKnife 原理解析

相關文章
相關標籤/搜索