首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android Activity 呼叫 Service 物件方法:三種實作模式

     編輯:程式設計綜合問答

模式一:本地服務 + 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 直接持有邏輯。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved