Tugas Pertemuan ke-9 [Dessert Clicker App]
Dessert Clicker App - Activity Lifecycle Implementation
Dessert Clicker App adalah aplikasi Android yang dikembangkan untuk mempelajari Activity Lifecycle dengan Jetpack Compose. Aplikasi ini mengajarkan bagaimana mengelola state aplikasi, menangani perubahan konfigurasi, dan memahami siklus hidup Activity melalui game clicker yang interaktif.
class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) Log.d(TAG, "onCreate Called") setContent { DessertClickerTheme { DessertClickerApp() } } } override fun onStart() { super.onStart() Log.d(TAG, "onStart Called") } override fun onResume() { super.onResume() Log.d(TAG, "onResume Called") } }
🔄 Activity Lifecycle Methods
Setiap method lifecycle diberikan Log.d() untuk tracking perubahan state. onCreate() menginisialisasi UI, onStart() mempersiapkan Activity menjadi visible, dan onResume() membuat Activity siap untuk interaksi user.
@Composable fun DessertClickerApp() { var revenue by rememberSaveable { mutableStateOf(0) } var dessertsSold by rememberSaveable { mutableStateOf(0) } var currentDessertIndex by rememberSaveable { mutableStateOf(0) } val currentDessertPrice = desserts[currentDessertIndex].price val currentDessertImageId = desserts[currentDessertIndex].imageId DessertClickerScreen( revenue = revenue, dessertsSold = dessertsSold, dessertImageId = currentDessertImageId, onDessertClicked = { revenue += currentDessertPrice dessertsSold++ currentDessertIndex = determineDessertIndex(dessertsSold) } ) }
💾 State Preservation
rememberSaveable menyimpan state revenue, dessertsSold, dan currentDessertIndex bahkan ketika terjadi configuration changes seperti screen rotation. Ini memastikan game progress tidak hilang.
override fun onPause() { super.onPause() Log.d(TAG, "onPause Called") } override fun onStop() { super.onStop() Log.d(TAG, "onStop Called") } override fun onDestroy() { super.onDestroy() Log.d(TAG, "onDestroy Called") } override fun onRestart() { super.onRestart() Log.d(TAG, "onRestart Called") }
📱 Configuration Changes
Method lifecycle ini menangani perubahan konfigurasi seperti screen rotation, multi-window mode, atau ketika aplikasi masuk background. Logging membantu memahami flow lifecycle.
private fun determineDessertIndex(dessertsSold: Int): Int { var dessertIndex = 0 for (index in desserts.indices) { if (dessertsSold >= desserts[index].startProductionAmount) { dessertIndex = index } else { break } } return dessertIndex } data class Dessert( @DrawableRes val imageId: Int, val price: Int, val startProductionAmount: Int )
🍰 Game Logic
determineDessertIndex() menentukan dessert mana yang ditampilkan berdasarkan jumlah penjualan. Setiap dessert memiliki threshold tertentu untuk unlock, membuat game progressif.
Lifecycle States
Practical Usage
- onCreate() - Setup UI
- onStart() - Prepare visibility
- onResume() - Enable interactions
- onPause() - Save temporary data
- onStop() - Release resources
- onDestroy() - Final cleanup
-
1. State ManagementMengelola state aplikasi dengan rememberSaveable untuk mempertahankan data saat configuration changes.
-
2. Lifecycle AwarenessMemahami kapan Activity dibuat, dimulai, dijeda, dihentikan, dan dihancurkan untuk optimasi resource.
-
3. Configuration HandlingMenangani perubahan konfigurasi seperti screen rotation tanpa kehilangan data atau state user.
Menampilkan gambar dessert yang berubah berdasarkan progress penjualan
Tracking total revenue dari penjualan dessert dengan persistence
Menghitung jumlah dessert yang terjual untuk unlock dessert baru
Monitoring perubahan lifecycle untuk debugging dan learning




📂 Access Source Code
🔗 View on GitHubComplete source code untuk Dessert Clicker App dengan Activity Lifecycle implementation
Comments
Post a Comment