Sobes.tech
Middle

Indique as formas de transferência de dados entre duas aplicações.

sobes.tech IA

Resposta da IA

  1. Intenções: São usadas para iniciar componentes de outro aplicativo e transferir dados através de Intent.putExtra(). Suportam transferência de tipos primitivos, String, Parcelable e objetos Serializable.

    // Enviar dados
    val intent = Intent("com.example.ANOTHER_APP_ACTION")
    intent.putExtra("key", "value")
    startActivity(intent)
    
    // Receber dados em outro aplicativo (na Activity)
    val data = intent.getStringExtra("key")
    
  2. Provedores de Conteúdo: Fornecem acesso estruturado a dados compartilhados (por exemplo, contatos, mídia). Aplicações podem solicitar, inserir, atualizar e excluir dados via URI. Requer implementação de ContentProvider na aplicação fonte de dados.

    // Exemplo de consulta de dados de contatos (ContentProvider do sistema)
    val cursor = contentResolver.query(
        ContactsContract.Contacts.CONTENT_URI,
        null,
        null,
        null,
        null
    )
    // ... processamento do cursor
    cursor?.close()
    
  3. Binder (AIDL): Linguagem de definição de interfaces Android. Usada para interação entre processos (IPC) entre duas aplicações. Permite definir uma interface de serviço que pode ser chamada de outro processo. Complexo de implementar, adequado para cenários de alta carga ou comunicação bidirecional.

    // Exemplo de interface AIDL (em arquivo .aidl)
    package com.example.myapp;
    
    interface IRemoteService {
        String getData();
        void setData(String value);
    }
    
    // Binders gerados a partir de AIDL e usados para conexão.
    // Exemplo de cliente usando serviço AIDL
    private var remoteService: IRemoteService? = null
    private val connection = object : ServiceConnection {
        override fun onServiceConnected(className: ComponentName, service: IBinder) {
            remoteService = IRemoteService.Stub.asInterface(service)
            // Agora pode chamar métodos de remoteService
        }
    
        override fun onServiceDisconnected(className: ComponentName) {
            remoteService = null
        }
    }
    
  4. Partilha de Arquivos: Através de diretórios comuns acessíveis a ambas aplicações (por exemplo, armazenamento externo) ou fornecendo acesso temporário a arquivos via FileProvider. Requer permissões de leitura/escrita.

    // Exemplo de fornecimento de acesso temporário via FileProvider
    val fileUri = FileProvider.getUriForFile(context, "com.example.myapp.fileprovider", file)
    val intent = Intent(Intent.ACTION_VIEW)
    intent.setDataAndType(fileUri, "image/*")
    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
    startActivity(intent)
    
  5. Receptores de Broadcast: Aplicações podem enviar e receber mensagens broadcast. Dados são transmitidos via Intent no Broadcast. Adequado para notificar outras aplicações sobre eventos, não para transferência bidirecional de dados.

    // Enviar Broadcast
    val intent = Intent("com.example.MY_CUSTOM_ACTION")
    intent.putExtra("data", "some_info")
    sendBroadcast(intent)
    
    // Receber Broadcast (em BroadcastReceiver)
    class MyReceiver : BroadcastReceiver() {
        override fun onReceive(context: Context, intent: Intent) {
            val data = intent.getStringExtra("data")
            // ...
        }
    }
    
  6. Sockets: Usados para interação de rede entre aplicações em um mesmo dispositivo (localhost) ou na rede. Requer implementação de protocolos de rede de baixo nível.

  7. Preferências Compartilhadas / Bases de Dados (limitado): Tecnicamente, é possível usar um arquivo compartilhado de SharedPreferences ou uma base de dados SQLite localizada em um diretório acessível publicamente. No entanto, não é um método confiável e seguro, pois requer gerenciamento cuidadoso de permissões e sincronização, e pode ser inseguro. Geralmente, não recomendado para transferência de dados entre aplicações independentes.