Sobes.tech
Middle

Uveďte způsoby přenosu dat mezi dvěma aplikacemi.

sobes.tech AI

Odpověď od AI

  1. Intenty: Používají se k spuštění komponent jiných aplikací a přenosu dat pomocí Intent.putExtra(). Podporují přenos primitivních typů, String, Parcelable a Serializable objektů.

    // Odeslání dat
    val intent = Intent("com.example.ANOTHER_APP_ACTION")
    intent.putExtra("key", "value")
    startActivity(intent)
    
    // Získání dat v jiné aplikaci (v Activity)
    val data = intent.getStringExtra("key")
    
  2. Content Providers: Poskytují strukturovaný přístup ke sdíleným datům (například kontakty, média). Aplikace mohou požadovat, vkládat, aktualizovat a mazat data přes URI. Je nutná implementace ContentProvider v zdrojové aplikaci.

    // Příklad dotazu na data z kontaktů (systémový ContentProvider)
    val cursor = contentResolver.query(
        ContactsContract.Contacts.CONTENT_URI,
        null,
        null,
        null,
        null
    )
    // ... zpracování kurzoru
    cursor?.close()
    
  3. Binder (AIDL): Jazyk definice rozhraní Android. Používá se pro meziprocesovou komunikaci (IPC) mezi dvěma aplikacemi. Umožňuje definovat rozhraní služby, které může být voláno z jiného procesu. Je složitý na implementaci, vhodný pro vysokou zátěž nebo obousměrnou komunikaci.

    // Příklad AIDL rozhraní (v souboru .aidl)
    package com.example.myapp;
    
    interface IRemoteService {
        String getData();
        void setData(String value);
    }
    
    // Binders generované na základě AIDL a používané pro spojení.
    // Příklad klienta využívajícího AIDL službu
    private var remoteService: IRemoteService? = null
    private val connection = object : ServiceConnection {
        override fun onServiceConnected(className: ComponentName, service: IBinder) {
            remoteService = IRemoteService.Stub.asInterface(service)
            // Nyní lze volat metody remoteService
        }
    
        override fun onServiceDisconnected(className: ComponentName) {
            remoteService = null
        }
    }
    
  4. Sdílení souborů: Přes společné adresáře dostupné oběma aplikacím (například externí úložiště) nebo poskytnutím dočasného přístupu k souborům přes FileProvider. Vyžadují se oprávnění ke čtení/zápisu.

    // Příklad poskytnutí dočasného přístupu přes 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. Broadcast Receivers: Aplikace mohou odesílat a přijímat vysílací zprávy (Broadcasts). Data jsou přenášena přes Intent v rámci Broadcast. Vhodné pro upozornění ostatních aplikací na události, nikoli pro obousměrný přenos dat.

    // Odeslání Broadcast
    val intent = Intent("com.example.MY_CUSTOM_ACTION")
    intent.putExtra("data", "some_info")
    sendBroadcast(intent)
    
    // Přijímání Broadcast (v BroadcastReceiver)
    class MyReceiver : BroadcastReceiver() {
        override fun onReceive(context: Context, intent: Intent) {
            val data = intent.getStringExtra("data")
            // ...
        }
    }
    
  6. Sokety: Používají se pro síťovou komunikaci mezi aplikacemi na stejném zařízení (localhost) nebo přes síť. Vyžadují nižší úroveň implementace síťových protokolů.

  7. Sdílené preference / Databáze (omezeně): Technicky je možné použít sdílený soubor SharedPreferences nebo databázi SQLite umístěnou ve veřejném adresáři. Není to však spolehlivý a bezpečný způsob, protože vyžaduje pečlivé řízení oprávnění a synchronizace, a může být nezabezpečený. Obvykle se nedoporučuje pro přenos dat mezi nezávislými aplikacemi.