Wymień sposoby przesyłania danych między dwoma aplikacjami.
sobes.tech AI
Odpowiedź od AI
-
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") -
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
ContentProviderw 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() -
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 } } -
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) -
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") // ... } } -
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.
-
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.