Skip to content

title: Android知識 author: 書蟲 tags:

  • 技術原理 categories:
  • 工作 top: false date: 2021-01-13 21:01:00

https://github.com/JsonChao/Awesome-Android-Notebook

Window指得是什麼?

各廠商手機Debug時的問題

我用的是VIVO X21A,Android 8.1.0系統,遇到的奇怪問題如下:

開發者模式開啟之後,無法連線adb命令,導致無法連線Android Studio。反覆開關debug開關無效,切換debug充電,傳輸檔案等無效。最後發現重啟之後就可以了。

安裝完測試包之後,所有功能無法正常聯網,全部顯示網路錯誤。而且部分功能一旦觸發直接崩潰,就好像是安裝包不完整一樣。這在其他手機上是沒有遇到過的。我原本以為是系統時間被修改了,檢查了一下,發現使用的是網路時間。最後找出了問題原因。引用別人的文章內容如下:

Android Studio 3.0會在debug apk的manifest檔案application標籤裡自動新增 android:testOnly="true"屬性,導致IDE中run跑出的apk在大部分手機上只能用adb install -t <apk>來安裝,在oppo手機上甚至安裝不了。

解決辦法:

在gradle.properties(專案根目錄或者gradle全域性配置目錄 ~/.gradle/)檔案中新增

android.injected.testOnly=false

測試有效。

值得研究的技術專題

1.  Activity 啟動流程 和 AMS 那些事

2.  Context 與 Android四大元件

3.  Activity Manager Service 與 Window Manager Service

4.  自定義View系列(onMeasure、onLayout、onDraw)、事件傳遞

5.  Android ClassLoader機制(外掛化準備)

6.  Android 資源打包流程(外掛化)

7.  Java反射 註解

8.  Android 外掛化與熱修復技術

9.  Fragment框架解析

  1. 手勢返回框架

  2. Android中的程序和執行緒

  3. Binder機制

  4. Flutter上手

  5. Android Push原理

  6. dex 與 Android 虛擬機器

  7. gradle task系列

  8. OpenGL技術影片特效處理

知識點記錄

  1. View中getTop,getY,getTranslationY之間的關係
  2. listview滾動狀態儲存和恢復

經常遇到的程式碼錯誤總結

ListView中類轉換異常,錯誤日誌。

java.lang.ClassCastException: android.view.ViewGroup$LayoutParams cannot be cast to 
android.widget.AbsListView$LayoutParams
at android.widget.ListView.setupChild(ListView.java:1901)

導致錯誤的程式碼是按下面第一行寫法寫的,第三行寫法是正確的。

view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));

view.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT,AbsListView.LayoutParams.MATCH_PARENT));

這是因為在4.x系統上setupChild原始碼是這樣寫的

AbsListView.LayoutParams p = (AbsListView.LayoutParams) child.getLayoutParams();
if (p == null) {
    p = (AbsListView.LayoutParams) generateDefaultLayoutParams();
}

所以 導致類轉換異常。

ImageView

預設的scaleType是FIT_CENTER

Android檔案路徑

什麼是APP專屬檔案?

所謂專屬檔案就是它是屬於某個具體的應用的,他的檔案路徑都帶有相應的包名,當APP解除安裝時,它們會隨應用一起刪除,當我們在設定裡面手動清除某個應用資料時(不是清除快取),它們也會一起被清掉。Android使用這種專屬檔案的目的就是為了方便檔案管理,避免檔案隨意儲存,顯得很亂,另一個目的就是為了當應用被解除安裝時不會留下很多垃圾檔案。

清除資料和清除快取到底清除了什麼資料

清除快取:我們知道應用程式在執行過程中需要經過很多過程,比如讀入程式,計算,輸入輸出等等,這些過程中肯定會產生很多的資料,它們在記憶體中,以供程式執行時呼叫。所以清除快取清除的是APP執行過程中所產生的臨時資料

清除資料:清除資料才是真正的刪除了我們儲存在檔案中的資料(永久性資料,如果不人為刪除的話會一直儲存在檔案中)例如當我們在設定裡面清除了某個應用的資料,那麼/data/user/0/packname/和/storage/emulated/0/Android/data/packname/下的檔案裡面的資料會全部刪除,包括cache,files,lib,shared_prefs等等。

內部儲存,外部儲存,機身儲存

機身儲存;機身儲存是指手機自身攜帶的儲存空間,出廠時就已經有了,4.4以前機身儲存就是內部儲存,4.4及以後機身儲存包含了內部儲存和外部儲存

Android手機路徑

在Google Pixel 3A, Android Q手機上測試結果如下:

Context().getExternalCacheDir()

Context().getExternalCacheDirs()

對應的路徑是/storage/emulated/0/Android/data/com.xxx.xxx/cache

Context().getFilesDir()

對應的路徑是/data/user/0/com.xxx.xxx/files

Context().getCacheDir()

對應的路徑是 /data/user/0/com.xxx.xxx/cache

Environment.getExternalStorageDirectory()

Environment.getExternalStorageDirectory()

對應的路徑是 /storage/emulated/0

小結:

Android中.9圖片的含義

繪製之前先來說一下.9圖片的四條黑邊的意義,每條黑邊的意義都不一樣。

  • 頂部:在水平拉伸的時候,保持其他位置不動,只在這個點的區域做無限的延伸(複製)
  • 左邊:在豎直拉伸的時候,保持其他位置不動,只在這個點的區域做無限的延伸(複製)
  • 底部:在水平拉伸的時候,指定圖片裡的內容顯示的區域
  • 右邊:在豎直拉伸的時候,指定圖片裡的內容顯示的區域

參考 https://www.jianshu.com/p/3fd048644e3f