以下是對這些 Android 相關問題的解答:
1. Activity 與 Fragment 之間常見的幾種通信方式
- 接口回調:Fragment 定義接口,Activity 實現該接口,Fragment 通過接口實例調用方法傳遞數據 。
- 使用 Bundle:Fragment 可通過
setArguments(Bundle)
傳數據給自身,Activity 可在創建 Fragment 時設置;也可結合findFragmentById
/findFragmentByTag
獲取 Fragment 實例后,用setArguments
(一般在 Fragment 初始化時更合適)或直接調用 Fragment 公開方法傳數據 。 - ViewModel 共享:通過 ViewModel 存儲和管理數據,Activity 和 Fragment 都關聯同一 ViewModel 來實現數據共享與通信,適合數據需在生命周期變化時留存場景 。
- LocalBroadcastManager(本地廣播):Fragment 發送本地廣播,Activity 注冊接收,實現跨組件(這里主要是 Activity - Fragment 間間接)通信,不過現在用ViewModel 等方式更簡潔,用得少了 。
2. startService 和 bindService 的區別,生命周期以及使用場景
- 區別與生命周期:
- startService:啟動后,Service 生命周期為
onCreate
(首次創建)→onStartCommand
(每次啟動調用)→onDestroy
(停止時) 。啟動方和 Service 是“啟動 - 被啟動”關系,啟動方退出不影響 Service 繼續運行(除非自身 stop )。 - bindService:通過
bindService
綁定,Service 先onCreate
(未創建時),然后onBind
返回 IBinder 給綁定方,之后處于綁定狀態;解除綁定時,若沒有其他綁定,執行onUnbind
→onDestroy
。綁定方和 Service 是“綁定 - 被綁定”關聯,綁定方銷毀(如 Activity finish ),若沒解除綁定,會觸發解綁流程 。
- startService:啟動后,Service 生命周期為
- 使用場景:
- startService:適合 Service 執行獨立后臺任務,如音樂播放(只需啟動播放,無需頻繁交互控制 ,當然也可結合其他方式)、文件下載(啟動后后臺持續下載 )。
- bindService:用于需要和 Service 頻繁交互場景,比如音樂播放時,Activity 要獲取播放狀態、控制暫停/播放等,通過綁定獲取 Service 提供的接口(IBinder 關聯的方法)來交互 。
3. HandlerThread 的使用場景和用法
- 使用場景:需要在后臺線程執行循環任務、消息處理,且希望有類似 Handler - Looper 消息循環機制的場景 。比如串口數據監聽(不斷從串口讀數據,用 HandlerThread 處理讀數據、解析、發消息給主線程更新 UI 等流程 );或者定時輪詢服務器接口(在后臺線程循環執行網絡請求 )。
- 用法:
// 創建 HandlerThread
HandlerThread handlerThread = new HandlerThread("MyHandlerThread");
handlerThread.start();
// 獲取 HandlerThread 的 Looper 創建 Handler
Handler handler = new Handler(handlerThread.getLooper()) {@Overridepublic void handleMessage