Application.onCreate() 中 bindService() 異步綁定,onServiceConnected() 回調賦值 binder。但 Activity.onCreate() 同步調用 getBinder() 時,綁定尚未完成 → 返回 null → 空指針崩潰。
Application.onCreate()
→ bindService() (異步,立即返回)
→ Activity.onCreate()
→ getBinder() // 執行時 Service 可能還沒連上
→ onServiceConnected() // 稍後纔回調
public interface BinderReadyListener {
void onBinderReady(IBinder binder);
}
public class MyApp extends Application {
private final List listeners = new CopyOnWriteArrayList<>();
private IBinder binder;
@Override public void onCreate() {
super.onCreate();
bindService(intent, new ServiceConnection() {
@Override public void onServiceConnected(ComponentName name, IBinder service) {
binder = service;
// 通知所有等待者
for (BinderReadyListener l : listeners) l.onBinderReady(binder);
listeners.clear();
}
@Override public void onServiceDisconnected(ComponentName name) {
binder = null;
}
}, BIND_AUTO_CREATE);
}
public void registerBinderListener(BinderReadyListener l) {
if (binder != null) l.onBinderReady(binder); // 已就緒直接回調
else listeners.add(l);
}
}
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyApp app = (MyApp) getApplication();
app.registerBinderListener(binder -> {
// UI線程安全更新
runOnUiThread(() -> {
this.binder = binder;
initUI(); // 這裡安全使用 binder
});
});
}
// BaseActivity
protected Handler binderHandler = new Handler(Looper.getMainLooper()) {
@Override public void handleMessage(Message msg) {
if (msg.what == MSG_BINDER_READY) {
onBinderReady((IBinder) msg.obj);
}
}
};
// 子類覆寫
protected void onBinderReady(IBinder binder) { /* 具體業務 */ }
// Application 綁定成功後
binderHandler.obtainMessage(MSG_BINDER_READY, binder).sendToTarget();
LiveData<IBinder> 或 Flow 暴露 Binder 狀態,Activity 觀察自動響應onServiceDisconnected 置空、通知重連、UI降級提示