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

Что такое основной компонент в Android?

1.2 Junior🔥 221 комментариев
#Android компоненты

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

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

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

Основные компоненты Android приложения

Основные компоненты — это четыре типа строительных блоков, из которых состоит любое Android приложение. Они определяют как приложение работает и взаимодействует с пользователем и системой.

Четыре основных компонента

1. Activity (Экран/Активность)

Activity — это экран с пользовательским интерфейсом. Каждый экран приложения обычно представляет собой отдельный Activity.

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        val button = findViewById<Button>(R.id.myButton)
        button.setOnClickListener {
            // Открываем новый экран (Activity)
            val intent = Intent(this, DetailActivity::class.java)
            startActivity(intent)
        }
    }
}

Жизненный цикл Activity

onCreate() → onStart() → onResume() → (User interacts) 
→ onPause() → onStop() → onDestroy()

Когда используется: Экран с UI, главный экран, форма заполнения, список товаров

2. Service (Сервис)

Service — это компонент для выполнения длительных операций без UI. Работает в фоне даже когда пользователь использует другое приложение.

class MusicService : Service() {
    override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
        // Запускаем воспроизведение музыки
        playMusic()
        return START_STICKY
    }
    
    override fun onBind(intent: Intent): IBinder? = null
    
    private fun playMusic() {
        val player = MediaPlayer()
        player.setDataSource(musicFile)
        player.start()
    }
}

// Запуск Service
val intent = Intent(this, MusicService::class.java)
startService(intent)

Когда используется: Музыка, закачки файлов, синхронизация данных, фоновые задачи

3. Content Provider (Поставщик контента)

Content Provider — это компонент для общего доступа к данным между приложениями. Предоставляет безопасный интерфейс для доступа к данным.

// Создание Content Provider
class UserContentProvider : ContentProvider() {
    
    override fun query(
        uri: Uri,
        projection: Array<String>?,
        selection: String?,
        selectionArgs: Array<String>?,
        sortOrder: String?
    ): Cursor? {
        // Возвращаем данные пользователей
        val database = getDatabase()
        return database.rawQuery(
            "SELECT * FROM users",
            null
        )
    }
    
    override fun insert(uri: Uri, values: ContentValues?): Uri? {
        // Добавляем новую запись
        return null
    }
    
    override fun getType(uri: Uri): String? = "vnd.android.cursor.dir/user"
}

// Использование Content Provider из другого приложения
val uri = Uri.parse("content://com.example.app/users")
val cursor = contentResolver.query(uri, null, null, null, null)

Когда используется: Контакты, календарь, SMS, файловая система, данные между приложениями

4. Broadcast Receiver (Приемник трансляций)

Broadcast Receiver — слушает системные события и события приложений. Реагирует на события вроде включения устройства, получения SMS, изменения батареи.

class BatteryReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        if (intent?.action == Intent.ACTION_BATTERY_LOW) {
            Toast.makeText(context, "Battery is low", Toast.LENGTH_SHORT).show()
        }
    }
}

// Регистрация в AndroidManifest.xml
<receiver android:name=".BatteryReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BATTERY_LOW" />
    </intent-filter>
</receiver>

// Или регистрация в коде (dynamically)
val receiver = BatteryReceiver()
val intentFilter = IntentFilter(Intent.ACTION_BATTERY_LOW)
registerReceiver(receiver, intentFilter)

Когда используется: Реакция на системные события, получение push-уведомлений, уведомление об изменении сети, запуск сервиса по событию

Сравнение всех компонентов

КомпонентUIФоновая работаДлительностьВзаимодействие
ActivityКраткаяПользователь
ServiceДолгаяНет UI
Content ProviderДанныеДоступДругие приложения
Broadcast ReceiverМоментСобытия системы

Взаимодействие компонентов

// Activity запускает Service
class MainActivity : AppCompatActivity() {
    fun startBackgroundWork() {
        val intent = Intent(this, DownloadService::class.java)
        intent.putExtra("url", "https://example.com/file.zip")
        startService(intent)
    }
}

// Service выполняет работу и уведомляет Activity
class DownloadService : Service() {
    override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
        val url = intent.getStringExtra("url") ?: return START_NOT_STICKY
        
        Thread {
            val file = downloadFile(url)
            
            // Отправляем broadcast что закачка готова
            val broadcastIntent = Intent("com.example.DOWNLOAD_COMPLETE")
            broadcastIntent.putExtra("file", file.path)
            sendBroadcast(broadcastIntent)
            
            stopSelf()
        }.start()
        
        return START_REDELIVER_INTENT
    }
}

// Broadcast Receiver слушает event
class DownloadCompleteReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        if (intent?.action == "com.example.DOWNLOAD_COMPLETE") {
            val filePath = intent.getStringExtra("file")
            Toast.makeText(context, "Downloaded: $filePath", Toast.LENGTH_SHORT).show()
        }
    }
}

AndroidManifest.xml — регистрация компонентов

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    
    <!-- Activity -->
    <application>
        <activity android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
        <!-- Service -->
        <service android:name=".MyService" />
        
        <!-- Content Provider -->
        <provider
            android:name=".UserContentProvider"
            android:authorities="com.example.myapp.user"
            android:exported="false" />
        
        <!-- Broadcast Receiver -->
        <receiver android:name=".MyReceiver"
            android:exported="true">
            <intent-filter>
                <action android:name="com.example.CUSTOM_EVENT" />
            </intent-filter>
        </receiver>
    </application>
</manifest>

Intent — система связи между компонентами

// Explicit Intent (явный) — точно знаем какой компонент
val intent = Intent(this, DetailActivity::class.java)
intent.putExtra("id", 123)
startActivity(intent)

// Implicit Intent (неявный) — система выбирает нужный компонент
val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse("https://example.com")
startActivity(intent)  // Откроется браузер

// Intent для Service
val serviceIntent = Intent(this, DownloadService::class.java)
serviceIntent.putExtra("url", "https://example.com/file.zip")
startService(serviceIntent)

// Intent для Broadcast
val broadcastIntent = Intent("com.example.CUSTOM_ACTION")
sendBroadcast(broadcastIntent)

Практический пример: Полный workflow

// 1. Activity (главный экран)
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        // Динамическая регистрация receiver
        val receiver = DownloadReceiver()
        val filter = IntentFilter("com.example.DOWNLOAD_COMPLETE")
        registerReceiver(receiver, filter)
        
        findViewById<Button>(R.id.downloadBtn).setOnClickListener {
            val intent = Intent(this, DownloadService::class.java)
            intent.putExtra("url", "https://example.com/photo.jpg")
            startService(intent)
        }
    }
}

// 2. Service (фоновая закачка)
class DownloadService : Service() {
    override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
        val url = intent.getStringExtra("url") ?: return START_NOT_STICKY
        
        Thread {
            try {
                val file = downloadFile(url)
                
                // Используем Content Provider для сохранения
                val values = ContentValues()
                values.put("filename", file.name)
                values.put("path", file.path)
                contentResolver.insert(
                    Uri.parse("content://com.example.files"),
                    values
                )
                
                // Отправляем broadcast
                val broadcast = Intent("com.example.DOWNLOAD_COMPLETE")
                broadcast.putExtra("file", file.path)
                sendBroadcast(broadcast)
            } catch (e: Exception) {
                Log.e("TAG", "Download failed", e)
            } finally {
                stopSelf(startId)
            }
        }.start()
        
        return START_REDELIVER_INTENT
    }
    
    private fun downloadFile(url: String): File {
        // Реальная реализация
        return File("/sdcard/download.jpg")
    }
    
    override fun onBind(intent: Intent): IBinder? = null
}

// 3. Broadcast Receiver
class DownloadReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        if (intent?.action == "com.example.DOWNLOAD_COMPLETE") {
            val filePath = intent.getStringExtra("file")
            Toast.makeText(context, "Downloaded: $filePath", Toast.LENGTH_SHORT).show()
        }
    }
}

// 4. Content Provider (сохранение информации о файлах)
class FileContentProvider : ContentProvider() {
    private lateinit var database: Database
    
    override fun onCreate(): Boolean {
        database = Database(context!!) 
        return true
    }
    
    override fun query(uri: Uri, ...): Cursor? {
        return database.query("SELECT * FROM files")
    }
    
    override fun insert(uri: Uri, values: ContentValues?): Uri? {
        database.insert("files", values)
        return Uri.parse("content://com.example.files/1")
    }
    
    override fun getType(uri: Uri): String? = "vnd.android.cursor.dir/file"
}

Итог

Четыре основных компонента Android:

  1. Activity — UI и взаимодействие с пользователем
  2. Service — фоновые операции без UI
  3. Content Provider — доступ к данным между приложениями
  4. Broadcast Receiver — реакция на события

Понимание этих компонентов и их взаимодействия через Intent — фундамент Android разработки. Каждый компонент имеет свою задачу, и правильное их использование делает приложение надежным и масштабируемым.

Что такое основной компонент в Android? | PrepBro