📊 System Monitor — Android
Aplicación Android en Kotlin que monitorea en tiempo real los cuatro principales recursos del sistema:
CPU · RAM · Disco · Red
Compatible con Android 5.0 (API 21) hasta Android 14 (API 34) — cubre los últimos 10+ años.
📁 Estructura del Proyecto
SystemMonitor/
├── app/src/main/
│ ├── AndroidManifest.xml
│ ├── java/com/systemmonitor/
│ │ ├── data/
│ │ │ ├── model/
│ │ │ │ └── Models.kt # SystemSnapshot, CpuStats, MemoryStats, DiskStats, NetworkStats
│ │ │ └── repository/
│ │ │ └── MonitorRepository.kt # Agrega todos los readers
│ │ ├── service/
│ │ │ ├── MonitorService.kt # Foreground Service principal
│ │ │ └── BootReceiver.kt # Reinicia el servicio tras el arranque
│ │ ├── ui/
│ │ │ ├── MainActivity.kt # ViewPager2 + TabLayout con 5 tabs
│ │ │ ├── MonitorViewModel.kt # ViewModel compartido (StateFlow)
│ │ │ ├── SettingsActivity.kt # Pantalla de preferencias
│ │ │ ├── dashboard/DashboardFragment.kt # Panel con 4 cards + gráfico combinado
│ │ │ ├── cpu/CpuFragment.kt # Historial línea + barra por núcleo
│ │ │ ├── memory/MemoryFragment.kt # Pie chart + historial
│ │ │ ├── disk/DiskFragment.kt # Pie chart interno + externo
│ │ │ └── network/NetworkFragment.kt # Gráfico dual Rx/Tx + totales
│ │ └── utils/
│ │ ├── CpuReader.kt # Lee /proc/stat
│ │ ├── ResourceReaders.kt # MemoryReader, DiskReader, NetworkReader
│ │ └── FormatUtils.kt # Formateo de bytes, velocidades, %
│ └── res/
│ ├── layout/ # 6 layouts XML
│ ├── drawable/ # 8 íconos vectoriales
│ ├── values/ # colors, strings, themes, arrays
│ ├── xml/preferences.xml
│ └── menu/main_menu.xml
└── build.gradle, settings.gradle, gradle.properties
🔧 APIs Nativas Utilizadas
Recurso
API Android
Clase/Archivo
CPU
/proc/stat (Linux kernel)
CpuReader.kt
CPU frecuencia
/sys/devices/system/cpu/cpu0/cpufreq/
CpuReader.kt
Memoria RAM
ActivityManager.MemoryInfo
ResourceReaders.kt
Disco
StatFs (interno + externo)
ResourceReaders.kt
Red (velocidad)
TrafficStats
ResourceReaders.kt
MonitorService extiende LifecycleService para:
Ejecutarse en primer plano con notificación persistente (silenciosa, prioridad baja)
Mostrar CPU / RAM / velocidad de red en la notificación
Reiniciarse automáticamente (START_STICKY) si el SO la mata
Cancelar automáticamente las coroutines al destruirse (lifecycleScope)
Botón "Detener" en la notificación sin abrir la app
Notificación: CPU 23.4% | RAM 61.2% | ↓ 1.2 MB/s
📈 Gráficos (MPAndroidChart v3.1.0)
Fragment
Gráfico
Dashboard
LineChart — CPU + RAM combinados, últimas 30 muestras
CPU
LineChart historial + BarChart uso por núcleo (coloreado por nivel)
Memoria
PieChart Usado/Libre + LineChart historial
Disco
PieChart Usado/Libre (interno y externo por separado)
Red
LineChart dual — velocidad Rx y Tx en tiempo real
🔋 Optimización de Batería
Técnica
Implementación
Intervalo configurable
1s / 2s / 5s / 10s / 30s / 60s (defecto 2s)
Sin WakeLock
El SO gestiona el scheduling; la prioridad foreground mantiene el servicio
Sin alarmas repetitivas
Coroutine delay() en lugar de AlarmManager
Notificación silenciosa
IMPORTANCE_LOW, setSilent(true), PRIORITY_LOW
LifecycleService
Las coroutines se cancelan automáticamente al destruir el servicio
offscreenPageLimit
Evita recrear fragments al cambiar de tab
🚀 Cómo Compilar y Ejecutar
Android Studio Hedgehog 2023.1+ (o superior)
JDK 11+
Android SDK API 21–34
Clonar / descomprimir el proyecto
Abrir Android Studio → Open → carpeta SystemMonitor/
Esperar sincronización de Gradle (descarga dependencias ~100 MB primera vez)
Conectar dispositivo con Depuración USB activada o lanzar emulador
Pulsar ▶ Run (Shift+F10)
Android 13+: se pedirá permiso de notificaciones → Permitir
El servicio de monitoreo arranca automáticamente
Para detenerlo: menú ⋮ → "Iniciar/Detener"
🛠️ Configuración (Settings)
Opción
Descripción
Intervalo de muestreo
Frecuencia de actualización de datos
Iniciar al arrancar
Reinicia el monitoreo tras reiniciar el dispositivo
Permiso
Propósito
FOREGROUND_SERVICE
Requerido para ejecutar el servicio en primer plano
RECEIVE_BOOT_COMPLETED
Reiniciar tras arranque del dispositivo
POST_NOTIFICATIONS
Mostrar notificación persistente (Android 13+)
ACCESS_NETWORK_STATE
Estado de la conexión de red
READ_PHONE_STATE
TrafficStats en algunos dispositivos
Android
API
Soporte
5.0 Lollipop
21
✅ mínimo
6.0 Marshmallow
23
✅
7.0 Nougat
24
✅
8.0 Oreo
26
✅ startForegroundService()
9.0 Pie
28
✅
10 Q
29
✅
11 R
30
✅
12 S
31
✅ PendingIntent FLAG_IMMUTABLE
13 Tiramisu
33
✅ POST_NOTIFICATIONS
14
34
✅ foregroundServiceType dataSync
🏗️ Dependencias Principales
androidx. lifecycle :lifecycle- service :2.6.2 // LifecycleService
com.github.PhilJay :MPAndroidChart :v3.1.0 // Gráficos
androidx. work :work- runtime- ktx :2.8.1 // WorkManager (backup)
kotlinx- coroutines- android :1.7.3 // Coroutines
androidx. navigation :navigation- fragment- ktx :2.7.4
UI Layer ┌─ DashboardFragment ─┐
(Fragments) ├─ CpuFragment ├──► MonitorViewModel (StateFlow)
├─ MemoryFragment │ │
├─ DiskFragment │ │ bind
└─ NetworkFragment ───┘ ▼
MonitorService (FG)
Domain/Data │
Layer MonitorRepository
/ | | \
CpuReader Mem Disk Network
/proc/stat AM StatFs TrafficStats
✅ Buenas Prácticas Aplicadas
MVVM con ViewModel + StateFlow + collect en repeatOnLifecycle
ViewBinding — sin findViewById en ningún Fragment
Coroutines con Dispatchers.IO para lectura de archivos del sistema
LifecycleService — cancelación automática de coroutines
START_STICKY — el servicio se reinicia si el OS lo mata
Notificación silenciosa — no interrumpe al usuario
min/targetSdk correctos — retrocompatibilidad hasta API 21
ProGuard configurado para release builds