3. O Cliente Jetpack Compose (:client)
A aplicação cliente MainActivity.kt se conecta ao serviço remoto, converte o objeto IBinder retornado em uma interface de proxy AIDL usando IAIDLColorInterface.Stub.asInterface(), e dispara chamadas remotas quando o usuário interage com a interface do usuário.
class MainActivity : ComponentActivity() {
var iaidlColorInterface: IAIDLColorInterface? = null
// Manipula callbacks do ciclo de vida da conexão
private var connection = object : ServiceConnection {
override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
// Converte referência remota de IBinder para interface Proxy tipada
iaidlColorInterface = IAIDLColorInterface.Stub.asInterface(service)
Log.d("CLIENT_APP", "Conectado ao serviço AIDL remoto")
}
override fun onServiceDisconnected(name: ComponentName?) {
iaidlColorInterface = null
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Conecta ao processo remoto do servidor usando a intenção explícita de pacote
val intent = Intent("AIDLColorService").apply {
setPackage("com.fierydinesh.binderipcserver")
}
bindService(intent, connection, BIND_AUTO_CREATE)
setContent {
SampleBinderIPCTheme {
val bgColor = remember { mutableIntStateOf(android.graphics.Color.GRAY) }
Scaffold(
containerColor = Color(bgColor.intValue),
modifier = Modifier
.fillMaxSize()
.clickable {
// Invoca método remoto além da barreira de processo!
iaidlColorInterface?.color?.let { newColor ->
bgColor.intValue = newColor
}
}
) { innerPadding ->
Greeting(name = "Android IPC", modifier = Modifier.padding(innerPadding))
}
}
}
}
}Requisito Moderno do Android: Visibilidade de Pacote (Android 11+)
Desde o Android 11 (API nível 30), a filtragem de visibilidade do pacote é aplicada por padrão. Para permitir que o aplicativo cliente descubra o pacote do servidor, declaramos isso no AndroidManifest.xml do cliente:
<queries>
<package android:name="com.fierydinesh.binderipcserver" />
</queries>
