Sobes.tech
Middle

Wymień sposoby przesyłania danych między dwoma aplikacjami.

sobes.tech AI

Odpowiedź od AI

  1. Intencje: Służą do uruchamiania komponentów innej aplikacji i przesyłania danych za pomocą Intent.putExtra(). Obsługują przesyłanie typów prymitywnych, String, Parcelable i obiektów Serializable.

    // Wysyłanie danych
    val intent = Intent("com.example.ANOTHER_APP_ACTION")
    intent.putExtra("key", "value")
    startActivity(intent)
    
    // Odbieranie danych w innej aplikacji (w Activity)
    val data = intent.getStringExtra("key")
    
  2. Dostawcy treści: Zapewniają dostęp do współdzielonych danych w sposób strukturalny (np. kontakty, media). Aplikacje mogą żądać, wstawiać, aktualizować i usuwać dane za pomocą URI. Wymaga implementacji ContentProvider w aplikacji źródłowej danych.

    // Przykład zapytania danych z kontaktów (ContentProvider systemowy)
    val cursor = contentResolver.query(
        ContactsContract.Contacts.CONTENT_URI,
        null,
        null,
        null,
        null
    )
    // ... obsługa kursora
    cursor?.close()
    
  3. Binder (AIDL): Język definicji interfejsów Android. Używany do komunikacji międzyprocesowej (IPC) między dwoma aplikacjami. Pozwala zdefiniować interfejs serwisu, który może być wywoływany z innego procesu. Trudny w implementacji, odpowiedni dla scenariuszy o dużym obciążeniu lub dwukierunkowej komunikacji.

    // Przykład interfejsu AIDL (w pliku .aidl)
    package com.example.myapp;
    
    interface IRemoteService {
        String getData();
        void setData(String value);
    }
    
    // Bindery generowane na podstawie AIDL i używane do połączenia.
    // Przykład klienta korzystającego z serwisu AIDL
    private var remoteService: IRemoteService? = null
    private val connection = object : ServiceConnection {
        override fun onServiceConnected(className: ComponentName, service: IBinder) {
            remoteService = IRemoteService.Stub.asInterface(service)
            // Teraz można wywołać metody remoteService
        }
    
        override fun onServiceDisconnected(className: ComponentName) {
            remoteService = null
        }
    }
    
  4. Udostępnianie plików: Poprzez wspólne katalogi dostępne dla obu aplikacji (np. pamięć zewnętrzna) lub poprzez tymczasowe udostępnianie plików za pomocą FileProvider. Wymaga uprawnień do odczytu/zapisu.

    // Przykład tymczasowego udostępniania za pomocą 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. Odbiorniki broadcast: Aplikacje mogą wysyłać i odbierać wiadomości broadcast. Dane są przesyłane za pomocą Intent w ramach Broadcast. Odpowiednie do powiadamiania innych aplikacji o zdarzeniach, a nie do dwukierunkowego przesyłania danych.

    // Wysyłanie broadcast
    val intent = Intent("com.example.MY_CUSTOM_ACTION")
    intent.putExtra("data", "some_info")
    sendBroadcast(intent)
    
    // Odbieranie broadcast (w BroadcastReceiver)
    class MyReceiver : BroadcastReceiver() {
        override fun onReceive(context: Context, intent: Intent) {
            val data = intent.getStringExtra("data")
            // ...
        }
    }
    
  6. Gniazda: Używane do komunikacji sieciowej między aplikacjami na tym samym urządzeniu (localhost) lub w sieci. Wymaga implementacji niższego poziomu protokołów sieciowych.

  7. Wspólne preferencje / bazy danych (ograniczone): Technicznie możliwe jest użycie wspólnego pliku SharedPreferences lub bazy danych SQLite umieszczonej w publicznie dostępnym katalogu. Jednak nie jest to niezawodny i bezpieczny sposób, ponieważ wymaga starannego zarządzania uprawnieniami i synchronizacją, i może być niebezpieczny. Zwykle niezalecane do przesyłania danych między niezależnymi aplikacjami.