以下是对这些 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()) {
@Override
public void handleMessage