← Назад к вопросам

Как передать данные из одного приложения в другое?

2.0 Middle🔥 132 комментариев
#Android компоненты#Работа с данными

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Основные механизмы межпроцессного взаимодействия (IPC) в Android

Для передачи данных между приложениями в Android используются несколько стандартных механизмов, которые можно разделить на две основные категории: явные (прямые вызовы компонентов) и неявные (через систему Intent-фильтров).

1. Использование Intent с явным указанием компонента

Прямой вызов Activity, Service или BroadcastReceiver другого приложения, если известен его полное имя класса (включая пакет).

// В приложении-отправителе
val intent = Intent().apply {
    setClassName("com.example.app2", "com.example.app2.MainActivity")
    putExtra("key_data", "Важные данные")
    putExtra("key_number", 42)
}
startActivity(intent)

// В приложении-получателе (в Activity)
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val data = intent.getStringExtra("key_data")
    val number = intent.getIntExtra("key_number", 0)
}

2. Неявные Intent (через Intent-фильтры)

Более гибкий подход, когда приложение объявляет в манифесте, какие действия оно может обрабатывать.

В приложении-отправителе:

val intent = Intent().apply {
    action = "com.example.action.VIEW_DATA"
    type = "text/plain"
    putExtra("message", "Данные для обработки")
    // Для передачи файлов используйте Uri с FLAG_GRANT_READ_URI_PERMISSION
}
startActivity(intent)

В манифесте приложения-получателя:

<activity android:name=".DataReceiverActivity">
    <intent-filter>
        <action android:name="com.example.action.VIEW_DATA" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>
</activity>

3. Content Provider

Наиболее безопасный и структурированный способ предоставления доступа к данным другим приложениям.

В приложении-провайдере:

class MyContentProvider : ContentProvider() {
    override fun query(
        uri: Uri,
        projection: Array<String>?,
        selection: String?,
        selectionArgs: Array<String>?,
        sortOrder: String?
    ): Cursor {
        // Возвращаем данные через Cursor
        val cursor = MatrixCursor(arrayOf("_id", "data_column"))
        cursor.addRow(arrayOf(1, "Пример данных"))
        return cursor
    }
    
    override fun insert(uri: Uri, values: ContentValues?): Uri {
        // Сохраняем данные и возвращаем Uri новой записи
        return ContentUris.withAppendedId(uri, newRowId)
    }
}

В манифесте:

<provider
    android:name=".MyContentProvider"
    android:authorities="com.example.myapp.provider"
    android:exported="true"
    android:permission="com.example.permission.READ_DATA" />

В приложении-клиенте:

val uri = Uri.parse("content://com.example.myapp.provider/data_table")
val cursor = contentResolver.query(uri, null, null, null, null)
cursor?.use {
    while (it.moveToNext()) {
        val data = it.getString(it.getColumnIndex("data_column"))
    }
}

4. Broadcast Receiver с разрешениями

Передача данных через широковещательные рассылки с настройкой разрешений.

В приложении-отправителе:

val intent = Intent("com.example.custom.action").apply {
    putExtra("event", "Данное событие произошло")
}
sendBroadcast(intent, "com.example.permission.RECEIVE_DATA")

В приложении-получателе (манифест или код):

<receiver 
    android:name=".MyReceiver"
    android:permission="com.example.permission.RECEIVE_DATA">
    <intent-filter>
        <action android:name="com.example.custom.action" />
    </intent-filter>
</receiver>

5. Клиент-Серверная архитектура

Для сложных сценариев взаимодействия рекомендуется использовать:

  • REST API с HTTPS
  • WebSockets для двусторонней связи
  • Google Cloud Messaging / Firebase Cloud Messaging для push-уведомлений
  • Binder и AIDL для низкоуровневого IPC (только для системных приложений)

Ключевые рекомендации по безопасности

  1. Валидация данных — всегда проверяйте входящие данные от других приложений
  2. Используйте разрешения — настраивайте custom permissions для защиты компонентов
  3. Uri permissions — для передачи файлов используйте FLAG_GRANT_READ_URI_PERMISSION
  4. Подписывайте данные — используйте криптографические подписи для важных данных
  5. Минимизируйте экспорт — устанавливайте android:exported="false" там, где это возможно

Сравнение методов

МетодСложностьБезопасностьПроизводительностьТипичное использование
Явный IntentНизкаяСредняяВысокаяПростая передача данных
Неявный IntentСредняяНизкаяСредняяИнтеграция с системой
Content ProviderВысокаяВысокаяСредняяСтруктурированный доступ к данным
BroadcastНизкаяНизкаяНизкаяУведомления о событиях

Выбор конкретного механизма зависит от требований к безопасности, производительности и сложности данных. Для большинства случаев подходят Content Provider (структурированные данные) или Intent с разрешениями (простая передача).

Как передать данные из одного приложения в другое? | PrepBro