模式一:本地服務 + Binder 回傳實例
public class MyService extends Service {
private final IBinder binder = new LocalBinder();
public class LocalBinder extends Binder { MyService getService() { return MyService.this; } }
@Override public IBinder onBind(Intent intent) { return binder; }
public void doSomething() { /* 業務邏輯 */ }
}
// Activity
MyService service;
ServiceConnection conn = new ServiceConnection() {
public void onServiceConnected(ComponentName n, IBinder b) {
service = ((MyService.LocalBinder)b).getService();
service.doSomething(); // 直接呼叫
}
public void onServiceDisconnected(ComponentName n) { service = null; }
};
bindService(new Intent(this, MyService.class), conn, BIND_AUTO_CREATE);
模式二:靜態方法 / 單例(僅同進程、簡單場景)
public class MyService extends Service {
private static MyService instance;
public static MyService getInstance() { return instance; }
@Override public void onCreate() { super.onCreate(); instance = this; }
@Override public void onDestroy() { instance = null; super.onDestroy(); }
public void doSomething() { ... }
}
// 任意處直接呼叫
MyService.getInstance().doSomething();
模式三:介面回呼 / EventBus(解耦)
// 定義介面
public interface SocketCallback { void onMessageReceived(String msg); }
// Service 持有列表
private List callbacks = new CopyOnWriteArrayList<>();
public void registerCallback(SocketCallback cb) { callbacks.add(cb); }
public void unregisterCallback(SocketCallback cb) { callbacks.remove(cb); }
// 發送事件
for (SocketCallback cb : callbacks) cb.onMessageReceived(msg);
// Activity 實作介面並註冊/反註冊(onStart/onStop)
選型建議
- 需跨進程、系統級服務 → 模式一(AIDL)。
- 單進程、輕量共用 → 模式二或三。
- 現代架構 → 採用 Repository + Flow/LiveData,完全移除 Service 直接持有邏輯。