AppA (Provider)
├─ IRemoteService.aidl
├─ IRemoteCallback.aidl
├─ RemoteService.java (Service 구현)
└─ AndroidManifest.xml (서비스 선언)
AppB (Client)
├─ IRemoteService.aidl (같은 내용 복사)
├─ IRemoteCallback.aidl (같은 내용 복사)
├─ MainActivity.java (서비스 연결 및 콜백 등록)
package com.example.remoteservice;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.util.Log;
public class RemoteService extends Service {
private static final String TAG = "RemoteService";
private final RemoteCallbackList<IRemoteCallback> mCallbacks = new RemoteCallbackList<>();
private final IRemoteService.Stub mBinder = new IRemoteService.Stub() {
@Override
public void registerCallback(IRemoteCallback callback) {
if (callback != null) {
mCallbacks.register(callback);
Log.d(TAG, "Callback registered");
}
}
@Override
public void unregisterCallback(IRemoteCallback callback) {
if (callback != null) {
mCallbacks.unregister(callback);
Log.d(TAG, "Callback unregistered");
}
}
@Override
public void sendMessage(String message) throws RemoteException {
Log.d(TAG, "Received message from client: " + message);
broadcastToClients("Echo from Service: " + message);
}
};
private void broadcastToClients(String message) throws RemoteException {
final int count = mCallbacks.beginBroadcast();
for (int i = 0; i < count; i++) {
try {
mCallbacks.getBroadcastItem(i).onMessageReceived(message);
} catch (Exception e) {
Log.e(TAG, "Callback error", e);
}
}
mCallbacks.finishBroadcast();
}
@Override
public IBinder onBind(Intent intent) {
Log.d(TAG, "Service bound");
return mBinder;
}
}
package com.example.remoteclient;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import com.example.remoteservice.IRemoteCallback;
import com.example.remoteservice.IRemoteService;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "RemoteClient";
private IRemoteService mService;
private boolean mBound = false;
private TextView textView;
private EditText editText;
private final IRemoteCallback mCallback = new IRemoteCallback.Stub() {
@Override
public void onMessageReceived(String message) {
runOnUiThread(() -> textView.append("From Service: " + message + "\n"));
}
};
private final ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mService = IRemoteService.Stub.asInterface(service);
try {
mService.registerCallback(mCallback);
} catch (RemoteException e) {
Log.e(TAG, "registerCallback failed", e);
}
mBound = true;
}
@Override
public void onServiceDisconnected(ComponentName name) {
try {
if (mService != null) {
mService.unregisterCallback(mCallback);
}
} catch (RemoteException ignored) {}
mBound = false;
mService = null;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView);
editText = findViewById(R.id.editText);
Button sendButton = findViewById(R.id.sendButton);
sendButton.setOnClickListener(v -> {
if (mBound && mService != null) {
try {
mService.sendMessage(editText.getText().toString());
} catch (RemoteException e) {
Log.e(TAG, "sendMessage failed", e);
}
}
});
bindToRemoteService();
}
private void bindToRemoteService() {
Intent intent = new Intent("com.example.remoteservice.RemoteService");
intent.setPackage("com.example.remoteservice"); // Provider 패키지명
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mBound) {
try {
mService.unregisterCallback(mCallback);
} catch (RemoteException ignored) {}
unbindService(mConnection);
}
}
}
Leave a comment