書名 | 第一行代碼:Android(第二版) |
---|---|
作者 | 郭霖 |
狀態 | 已讀完 |
簡介 | Android + Java 開發 |
安卓系統架構
- Linux 內核層
- 系統運行庫層
- 應用框架層
- 應用層
安卓四大組件:活動(Activity)、服務(Service)、廣播(Broadcast Receiver)和內容提供器(Content Provider)。
項目結構#
java 文件夾:項目代碼
res 文件夾: 項目圖片、佈局、字符串等資源。
-
Drawable 文件夾:用於存放各種類型的圖形資源,包括但不限於 PNG、JPEG、GIF 圖片,XML 定義的可繪製資源(如形狀、選擇器等),以及九宮格圖(9-patch)。這些資源可以被用來作為背景、圖標、分割線等。
-
Mipmap 文件夾:主要用於存放應用啟動器圖標。使用 mipmap 文件夾有助於確保應用程序圖標在不同解析度和屏幕密度的設備上都能獲得最佳顯示效果。
-
Layout 文件夾:頁面佈局文件
build.gradle app 模塊的 gradle 構建腳本
AndroidManifest.xml 項目的配置文件,四大組件都要在此註冊。
活動#
- 設置主活動: 在 activity 標籤中加入 intent-filter 標籤等聲明。
- ** 添加菜單:** 構建 menu 資源文件並在活動中引用
Intent#
通過使用 Intent 進行活動的跳轉、啟動服務、發送廣播等。
- 顯示 Intent: 顯式的指出要啟動的活,
- 啟動活動時傳參: putExtra -> getStringExtra 在。
- 返回數據給上個活動: startActivityForResult 啟動新活動,使用 onActivityResult 接受新活動銷毀時返回的參數
- 隱式 Intent: 通過在 activity 中設定當前活動響應的 action 和 category,也可以啟動其他程序的活動(根據協議不同,支持網頁、電話等並傳遞參數)。
每個 Intent 只能值得一個 action,但能指定多個 category。
生命週期#
根據活動的可見性、是否位於棧頂,活動生命週期的四個狀態:運行狀態、暫停狀態、停止狀態、銷毀狀態。
OnSaveInstance: 活動被回收之前調用,可保留臨時數據。
- 活動的啟動模式: standard、singleTop、singleTask、singleInstance。
頁面控件及佈局#
- 控件可見性: visible、invisible、gone
- 佈局
線性佈局 LinearLayout: 在線性方向(水平 horizontal,垂直 vertical)上依次排列
相對佈局 RelativeLayout: 相對定位方式(相對父佈局、相對頁面)讓控件出現在任何位置
幀佈局 FrameLayout: 所有控件默認在左上角
百分比佈局:PrecentFrameLayout 和 PercentRelativeLayout
自定義佈局: 定義好後,通過 include 引入;
- 控件的繼承結構
- 自定義控件: 創建自定義佈局的邏輯進行復用,通過 inflate 動態加載佈局文件
Fragment#
- 可以嵌入在活動中的 UI 片段,每個碎片都有其對應的佈局文件、代碼文件。
- 一個活動中可以包括多個碎片,通過 FrameLayout 碎片的切換。
- 在碎片中獲取活動實現,碎片與活動,碎片與碎片之間的通訊。
碎片的生命週期#
動態加載佈局#
比如:根據設備類型(平板 、手機)使用不同的佈局
- 使用限定符 對應不同的文件夾名 (可以利用限定符區分 大小、分辨率、方向)
廣播機制#
可以跨進程通信
- 標準廣播: 異步,同時受到,無法被打斷
- 有序廣播:同步執行 同一時刻只有一個收到
廣播類型
- 動態註冊: 代碼中註冊,使用完成後需要及時關閉
- 靜態註冊: 在 AndroidManifest 中註冊
對於系統的廣播接收,部分需要聲明權限。
發送廣播
- 標準廣播: 自定義 intent + sendBroadcast 方法
- 有序廣播:自定義意圖 + sendOrderedBroadcast 方法
本地廣播
使用 LocalBroadCast 對廣播進行廣利,使用其對應的發送和接收方法。
數據持久化技術#
Android 中的三種數據持久化方法
- 文件
- SharedPreferences
- 數據庫
文件#
- 存儲在應用目錄下的 files 文件夾下
- 文件流寫入 (openFileOutput、openFileInput)
SharedPreferences#
使用鍵值對存儲數據 數據存儲在 包名 /shared_prefs/ 以 xml 形式存儲
存儲數據#
- 獲取 sharedPreferences 對象,使用 edit()方法獲取 Editor 對象
- 存取數據對象
- 使用 apply 方法保存
讀取數據#
- 使用 get 方法根據 鍵 獲取對應的 值
SQLite#
書中 提到使用 Android API 、 SQL 語句 以及 LitePal 方法進行數據庫的操作,也可以使用 Greendao, 對比可以參考下面文章。
內容提供器#
主要用於不同的應用程序之間實現數據共享功能。
例如電話簿程序共享聯繫人
權限#
運行時權限:軟件使用過程中對某項權限進行授權
開發時
- 判斷用戶是否授權 checkSelfPermission
- 授權則繼續運行,否則就申請授權 requestPermission
訪問其他程序中的數據#
- 通過 getContentResolver 獲取實例
- 讀取數據
創建內容提供器#
創建類繼承自 ContentProvider,重寫下面方法
- onCreate 初始化調用
- query 查詢,根據 uri 參數確定查哪張表
- insert 插入
- update 更新已有數據
- delete 刪除
- getType 獲取 uri 返回相應的 MIME 類型
手機多媒體#
通知#
- 獲取通知實例 NotificationManager
- 創建通知對象,加入 Intent 執行通知點擊操作
- 發送
攝像頭,音視頻#
網絡#
- 使用 webView 顯示網頁
- 使用 http 訪問 HttpURLConnection 、 OKHttp
通過 OKHttp 可以組件 GET POST 等請求
- XML 解析:Pull 解析、SAX 解析
- JSON 解析: JSONObject、GSON
服務#
- Android 中實現程序後台運行的解決方案
- 當應用程序進程被殺掉時,所有依賴於該進程的服務也會停止
Android 多線程編程#
繼承 Thread 類
實現 Runnable 接口
編寫匿名類
子線程中更新 UI#
Android 中不允許在子線程中更新 UI
通過異步消息處理機制,實現控件的更新。
異步消息處理的構成
- Message: 線程之間傳遞的消息
- Handler: 發送和處理消息
- MessageQueue:消息隊列,存放所有 Handler 的消息,每個線程中只有一個
- Looper: 管理線程 中的消息隊列
AsyncTask 使用
- onProExecute 執行前調用
- doInBackground 子線程中運行的
- onProgressUpdate 響應後台中 publishProgress 是 更新 UI
- onPostExecute 任務執行完畢後的操作
服務#
- 定義後通過 Intent 啟動或停止(startService、stopService)
- 服務實例只有一個,但每次調用 startService,onStartCommand 就會執行一次
** 前台服務:** 服務中加入通知 (通知欄展示) 並調用 startForeground
**IntendService:** 異步、自動停止
活動與服務的通信#
- 構建 Binder 對象,在 Service 時使用 onBind 方法
- 活動中調用 Binder 方法
基於位置的服務#
- 申請 API Key 並下載 SDK
- 權限聲明
- 獲取位置信息包括: 經緯度、地址、地圖
Material Design#
- ToolBar
- 滑動菜單 第一個子控件顯示主頁面內容,第二個顯彩蛋內容
- NavigationView 可以自定義滑動菜單中頂部和菜單佈局
- FloatingActionButton 懸浮按鈕
- SnackBar 提示並增加可操作按鈕
- CoordinatorLayout 監聽所有子控件的事件,自動做出合理響應
- CardVuiew 卡片佈局
- SwipeRefreshLayout 下拉刷新
進階開發#
- 自定義 Application 類全局獲取 Context
- 通過對象的 Serializable(序列化實現) 或 Parcelabel(講完整對象分解) 接口實現,使 Intent 傳遞對象
- 自定義日誌工具
- 創建定時任務:Alarm 設定實現實現