Նշեք տվյալների փոխանցման եղանակները երկու հավելվածների միջև։
sobes.tech AI
Պատասխան AI-ից
-
Նպատակներ: Օգտագործվում են մյուս հավելվածի բաղադրիչները գործարկելու և տվյալներ փոխանցելու համար
Intent.putExtra()-ի միջոցով: Աջակցում են հիմնական տիպերի, String, Parcelable և Serializable օբյեկտների փոխանցմանը:// Տվյալների ուղարկում val intent = Intent("com.example.ANOTHER_APP_ACTION") intent.putExtra("key", "value") startActivity(intent)// Տվյալների ստացում այլ հավելվածում (Activity-ում) val data = intent.getStringExtra("key") -
Content Providers: Ներկայացնում են կառուցվածքային մուտք դեպի համատեղ օգտագործվող տվյալներ (օրինակ՝ կոնտակտներ, մեդիա): Հավելվածները կարող են հարցում կատարել, ավելացնել, թարմացնել և ջնջել տվյալները URI-ով: Պահանջվում է
ContentProvider-ի իրականացում տվյալների աղբյուր հավելվածում:// Օրինակ՝ կոնտակտներից տվյալների հարցում (համակարգային ContentProvider) val cursor = contentResolver.query( ContactsContract.Contacts.CONTENT_URI, null, null, null, null ) // ... cursor-ի մշակումը cursor?.close() -
Binder (AIDL): Android Interface Definition Language: օգտագործվում է միջգործարկային փոխազդեցության (IPC) համար երկու հավելվածների միջև: Позволяет определить интерфейс сервиса, который можно вызвать из другого процесса. Կարծես թե բարդ է իրականացնել, բայց հարմար է բարձր բեռների կամ երկկողմ հաղորդակցության դեպքում:
// AIDL ինտերֆեյսի օրինակ (ֆայլում .aidl) package com.example.myapp; interface IRemoteService { String getData(); void setData(String value); }// Բինդերները գեներացվում են AIDL-ից և օգտագործվում են կապի համար: // Օրինակ՝ AIDL ծառայության օգտագործող հաճախորդ private var remoteService: IRemoteService? = null private val connection = object : ServiceConnection { override fun onServiceConnected(className: ComponentName, service: IBinder) { remoteService = IRemoteService.Stub.asInterface(service) // Այժմ կարող եք կանչել remoteService մեթոդները } override fun onServiceDisconnected(className: ComponentName) { remoteService = null } } -
Ֆայլերի փոխանակում: Հաղորդակցություն ընդհանուր թղթապանակների միջոցով, որոնք հասանելի են երկու հավելվածների համար (օրինակ՝ external storage) կամ ժամանակավոր մուտք տրամադրելով
FileProvider-ի միջոցով: Պահանջվում են ընթերցման/գրելու թույլտվություններ:// Օրինակ՝ ժամանակավոր մուտք տրամադրելու `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) -
Broadcast Receivers: Հավելվածները կարող են ուղարկել և ստանալ բաշխիչ հաղորդագրություններ (Broadcasts): Տվյալները փոխանցվում են Intent-ով Broadcast-ի մեջ: Հարմար է այլ հավելվածներին իրադարձությունների մասին տեղեկացնելու համար, ոչ թե երկկողմ տվյալների փոխանցման:
// Բաշխիչ հաղորդագրության ուղարկում val intent = Intent("com.example.MY_CUSTOM_ACTION") intent.putExtra("data", "some_info") sendBroadcast(intent)// Բաշխիչ հաղորդագրության ստացում (BroadcastReceiver-ում) class MyReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val data = intent.getStringExtra("data") // ... } } -
Sockets: Օգտագործվում են ցանցային փոխազդեցության համար նույն սարքի վրա (localhost) կամ ցանցով: Պահանջում է ցանցային պրոտոկոլների ցածր մակարդակի իրականացում:
-
Shared Preferences / Databases (սահմանափակ): Տեխնիկապես հնարավոր է օգտագործել ընդհանուր ֆայլ
SharedPreferencesկամ SQLite տվյալների բազա, որոնք տեղակայված են ընդհանուր հասանելիության դիրեկտորիայում: Սակայն դա չի համարվում հուսալի և անվտանգ միջոց, քանի որ պահանջում է թույլտվությունների և սինխրոնիզացիայի խիստ կառավարում, և կարող է լինել անանվտանգ: Հաճախ չի խորհուրդ տրվում անկախ հավելվածների միջև տվյալներ փոխանցելու համար։