Giới thiệu dự án

Sự gia tăng nhanh chóng của các bệnh mạn tính không lây nhiễm (NCDs) như tim mạch, đái tháo đường và béo phì đang là một trong những thách thức y tế lớn nhất toàn cầu. Theo số liệu từ Tổ chức Y tế Thế giới (WHO), các bệnh lý không lây nhiễm chiếm tới 74% tổng số ca tử vong trên toàn thế giới mỗi năm, trong đó nguyên nhân cốt lõi bắt nguồn từ lối sống ít vận động và chế độ dinh dưỡng mất cân đối. Tại Việt Nam, xu hướng số hóa trong chăm sóc sức khỏe cá nhân (mHealth) đang bùng nổ, song người dùng vẫn gặp khó khăn khi phải sử dụng phân tán nhiều ứng dụng riêng biệt: một ứng dụng đếm bước chân, một ứng dụng tính calo bữa ăn, một ứng dụng bài tập riêng và thiếu vắng sự trợ giúp tư vấn tự động tức thì.

Đồ án khóa luận tốt nghiệp ngành Kỹ thuật Phần mềm tại Trường Đại học Công nghệ Thông tin – ĐHQG-HCM, thực hiện bởi nhóm tác giả Hồ Hữu Thịnh (19522275) và Lê Đức Trung (19522422) dưới sự hướng dẫn của ThS. Thái Thụy Hàn Uyển, đã đề xuất và xây dựng thành công giải pháp toàn diện: Wecare – Ứng dụng di động hỗ trợ chăm sóc sức khỏe cá nhân thông minh.

                           HỆ SINH THÁI CHĂM SÓC SỨC KHỎE WECARE
  ┌──────────────────────────────────────────────────────────────────────────────────┐
  │                               UI: JETPACK COMPOSE                                │
  └────────┬───────────────────┬───────────────────┬──────────────────┬──────────────┘
           │                   │                   │                  │               
           ▼                   ▼                   ▼                  ▼               
  ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐
  │ VẬN ĐỘNG & GPS  │ │  CALO & DINH    │ │ THEO DÕI CHỈ SỐ │ │ TRỢ LÝ SỨC KHỎE AI  │
  │ - Activity Rec. │ │     DƯỠNG       │ │ - Body Mass Idx │ │ - DialogFlow Engine │
  │ - Mapbox Track  │ │ - Spoonacular   │ │ - Water Log/Rem.│ │ - Custom Recommender│
  └────────┬────────┘ └────────┬────────┘ └────────┬────────┘ └──────────┬──────────┘
           │                   │                   │                     │            
           └───────────────────┴─────────┬─────────┴─────────────────────┘            
                                         ▼                                            
                           CLEAN ARCHITECTURE + MVVM (KOTLIN)                         
                                         │                                            
                                         ▼                                            
                        ROOM DATABASE  ◄───►  FIREBASE CLOUD                          

Problem Statement và Pain Points

Người dùng hiện đại đối mặt với 4 vấn đề kỹ thuật và trải nghiệm người dùng (UX) cốt lõi:

  1. Thiếu khả năng tự động hóa theo dõi thể chất: Nhiều ứng dụng phụ thuộc hoàn toàn vào định vị GPS liên tục gây cạn kiệt pin thiết bị nhanh chóng (hao hụt 12-18% pin/giờ), hoặc yêu cầu người dùng ghi nhận thủ công trạng thái vận động.
  2. Quản trị calo phức tạp, thiếu tính cá nhân hóa: Việc ước tính khối lượng macro dinh dưỡng và calo in/out thường mang tính chất định lượng chung chung, không đồng bộ với chỉ số cơ thể thực tế (BMI/BMR).
  3. Phân mảnh giải pháp: Thiếu sự liên kết chặt chẽ giữa việc theo dõi bài tập (Workout), bù nước (Hydration Tracker) và đề xuất thực đơn dinh dưỡng theo thời gian thực.
  4. Hạn chế trong hỗ trợ tri thức y tế tức thì: Người dùng thiếu kênh tham vấn tự động, chính xác và phản hồi 24/7 về các chỉ số cơ thể, bài tập bổ trợ hoặc thông tin phòng chống dịch bệnh.

Project Objectives

  1. Mục tiêu 1: Thiết kế và phát triển ứng dụng di động Android chuẩn kiến trúc Clean Architecture kết hợp mô hình MVVM bằng ngôn ngữ Kotlin thuần.
  2. Mục tiêu 2: Tối ưu hóa việc nhận diện trạng thái vận động tự động (đi bộ, chạy bộ, đạp xe, đứng yên) bằng Android Activity Recognition Transition API và theo dõi lộ trình di chuyển với Mapbox API, giảm thiểu tối đa điện năng tiêu thụ.
  3. Mục tiêu 3: Xây dựng hệ thống quản lý dinh dưỡng và calo tự động tích hợp Spoonacular REST API, cung cấp công thức chế biến và phân tích vi chất dinh dưỡng.
  4. Mục tiêu 4: Huấn luyện và tích hợp Chatbot AI chuyên sâu trên nền tảng Google Cloud Dialogflow phục vụ tư vấn chỉ số BMI, tập luyện tại nhà và thông tin y tế thường thức.
  5. Mục tiêu 5: Thiết lập cơ chế lưu trữ kết hợp (Hybrid Storage) giữa cơ sở dữ liệu cục bộ Room Database (offline-first) và đồng bộ thời gian thực qua Firebase (Firestore, Authentication, Storage).

Solution Approach và Measurable Metrics

Giải pháp tiếp cận của Wecare tập trung vào tính tự động, phản ứng thời gian thực (Reactive Programming với Kotlin Coroutines & Flow) và hiệu năng UI tối ưu với Jetpack Compose.

  • Tốc độ phản hồi giao diện: Thời gian render khung hình $\le 16ms$ (đạt chuẩn 60 FPS ổn định).
  • Độ chính xác cảm biến vận động: Độ chính xác nhận diện chuyển đổi trạng thái đạt $\ge 92%$; sai số đếm bước chân $\le 5%$.
  • Mức tiêu hao năng lượng: Tiết kiệm hơn $35%$ dung lượng pin so với các ứng dụng kích hoạt GPS chu kỳ ngắn liên tục.
  • Thời gian phản hồi truy vấn AI & API: Độ trễ phản hồi từ Dialogflow và Spoonacular $\le 850ms$ trong điều kiện mạng 4G/Wi-Fi thông thường.

Scope và Limitations

  • Phạm vi nền tảng: Ứng dụng chạy native trên hệ điều hành Android (hỗ trợ từ Android 8.0 Oreo - API Level 26 trở lên).
  • Phạm vi chức năng: Theo dõi bước chân, tính toán lộ trình và năng lượng vận động; phân tích BMI; nhắc nhở và thống kê lượng nước uống; gợi ý thực đơn và tính toán calo món ăn; cung cấp thư viện bài tập theo set (30 Days Training); tương tác hỏi đáp y tế qua Chatbot; đồng bộ tài khoản đa thiết bị.
  • Giới hạn kỹ thuật: Chatbot sử dụng phiên bản Dialogflow Standard (ES) nên phụ thuộc vào kết nối Internet; độ chính xác của cảm biến bước chân phụ thuộc vào phần cứng Accelerometer và Gyroscope tích hợp trên từng dòng máy Android; chưa hỗ trợ đồng bộ trực tiếp với các thiết bị đeo thông minh (WearOS/Garmin) ngoài hệ điều hành Android tiêu chuẩn.

Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Tiêu chí so sánh MyFitnessPal Google Fit Strava Wecare (Đề tài)
Kiến trúc mã nguồn Monolithic / MVVM cũ Proprietary Framework Clean Architecture (Modular) Clean Architecture + MVVM
Giao diện người dùng (UI) XML Layout truyền thống XML / Compose lai XML Layouts 100% Jetpack Compose (Declarative)
Nhận diện vận động Ghi nhận thủ công / Sync Google Fit API Sensor GPS Polling liên tục Activity Recognition Transition API + Mapbox
Quản lý Dinh dưỡng & Menu Cơ sở dữ liệu người dùng đóng góp Không có chuyên sâu Không có Spoonacular API (Công thức & Calo chuẩn hóa)
Hỗ trợ Chatbot AI Không hỗ trợ Không hỗ trợ Không hỗ trợ Google Cloud Dialogflow (NLP Contextual)
Khả năng Offline-First Hạn chế Hỗ trợ một phần Có (Lưu Local Route) Room DB + Firestore Hybrid Sync
Chi phí sử dụng Yêu cầu trả phí Premium Miễn phí Yêu cầu thuê bao tháng Hoàn toàn miễn phí, mã nguồn mở
                 MA TRẬN ĐÁNH GIÁ ĐẶC TÍNH SẢN PHẨM
                 
          Khả năng AI / Chatbot
                  ▲
                  │                       ★ WECARE
                  │
                  │
                  │
                  │         MyFitnessPal
                  │
  ───────────────┼─────────────────────────────────► Độ tối ưu năng lượng
                  │                                  (Low Battery Consumption)
                  │         Google Fit
                  │   Strava
                  │

Phân loại yêu cầu người dùng (MoSCoW Prioritization)

  • Must-Have (Bắt buộc phải có): Xác thực tài khoản (Email/Password & Google Sign-In); Đếm bước chân nền; Tính toán chỉ số BMI; Nhắc nhở và ghi nhật ký uống nước; Theo dõi lộ trình tập luyện qua bản đồ; Lựa chọn và xem hướng dẫn bài tập thể dục tại nhà; Ghi nhận nhật ký dinh dưỡng.
  • Should-Have (Nên có): Gợi ý thực đơn tự động theo hạn ngạch calo; Chatbot hỏi đáp thông minh; Báo cáo thống kê dinh dưỡng/hoạt động trực quan dạng biểu đồ; Đồng bộ tức thời lên Cloud Firestore.
  • Could-Have (Có thể mở rộng): Đánh giá, nhận xét bài tập thể dục từ cộng đồng; Chia sẻ lộ trình thể thao cá nhân; Chế độ tập luyện theo lịch trình 30 ngày.
  • Won't-Have (Tạm thời chưa triển khai): Gọi video trực tuyến với bác sĩ chuyên khoa; Kết nối Bluetooth GATT với thiết bị đo nhịp tim chuyên dụng.

Thiết kế hệ thống

Kiến trúc tổng thể Clean Architecture kết hợp MVVM

Ứng dụng được chia tách độc lập thành 3 layer chính nhằm đảm bảo tính phân tách mối quan tâm (Separation of Concerns), dễ bảo trì (Maintainability) và dễ viết kiểm thử tự động (Unit Testable):

       ┌─────────────────────────────────────────────────────────────┐
       │             PRESENTATION LAYER (Giao diện & UI)             │
       │  Jetpack Compose Composables ── State / Events ── ViewModels │
       └──────────────────────────────┬──────────────────────────────┘
                                      │ (Phụ thuộc vào Use Cases)
                                      ▼
       ┌─────────────────────────────────────────────────────────────┐
       │                 DOMAIN LAYER (Nghiệp vụ cốt lõi)             │
       │   Use Cases (Interactors) ── Domain Models ── Repositories  │
       └──────────────────────────────▲──────────────────────────────┘
                                      │ (Triển khai Interface)
                                      │
       ┌──────────────────────────────┴──────────────────────────────┐
       │                 DATA LAYER (Dữ liệu & Ngoại vi)              │
       │  Room Database (Local) ◄── Repository Impl ──► Remote APIs  │
       │  [SQLite Entity/DAO]                         [Firebase/REST]│
       └─────────────────────────────────────────────────────────────┘

Technology Stack & Versions

  • Ngôn ngữ: Kotlin v1.8.20 (Hỗ trợ Coroutines v1.6.4, StateFlow/SharedFlow).
  • UI Framework: Android Jetpack Compose BOM 2023.05.01, Material Design 3.
  • Local Persistence: Room Database v2.5.1 tích hợp SQLite Engine.
  • Backend-as-a-Service: Firebase SDK BoM v32.0.0 (Firebase Auth, Cloud Firestore, Cloud Storage, FCM).
  • Location & Sensors: Google Play Services Location v21.0.1 (Activity Recognition Transition API), Mapbox Maps SDK for Android v10.13.0.
  • NLP / Trí tuệ nhân tạo: Google Cloud Dialogflow ES Client v2.1.0.
  • Networking & Nutrition API: Retrofit v2.9.0, OkHttp v4.10.0, Spoonacular Food API v1.0.
  • Dependency Injection: Hilt / Dagger v2.45.
  • Image Loading: Coil Compose v2.3.0.

Thiết kế Cơ sở dữ liệu (Database Schema)

1. Local Database (Room DB)
  • Table step_records: id (PK, Long, AutoGenerate), date (Text, Indexed), step_count (Int), calories_burned (Float), distance_meters (Float), active_duration_seconds (Long).
  • Table water_logs: id (PK, Long), timestamp (Long), amount_ml (Int), daily_goal_ml (Int).
  • Table exercise_history: id (PK, Long), exercise_id (String), completed_at (Long), duration_spent (Int), rating (Float), user_review (Text).
2. Remote Database (Cloud Firestore NoSQL Structure)
/users/{userId}
  ├── profile: { email, displayName, age, gender, height, weight, targetBmi, dailyCalorieTarget, dailyWaterTarget }
  ├── daily_metrics (Subcollection)
  │     └── {date_YYYYMMDD}: { totalSteps, totalWaterMl, totalCaloriesIn, totalCaloriesOut, distanceKm }
  ├── food_diary (Subcollection)
  │     └── {logId}: { foodId, foodName, mealType (BREAKFAST/LUNCH/DINNER/SNACK), calories, carbs, protein, fat, timestamp }
  └── custom_workouts (Subcollection)
        └── {workoutId}: { planName, currentDay, isCompleted, startDate }

API Endpoints Design (Tích hợp Spoonacular & Dialogflow)

                       LUỒNG GIAO TIẾP REST & NLP ENGINE
                       
    ┌──────────┐   GET /recipes/complexSearch?maxCalories=...   ┌─────────────────┐
    │          ├───────────────────────────────────────────────►│ Spoonacular API │
    │          │◄───────────────────────────────────────────────┤ (Nutrition Data)│
    │  WECARE  │   JSON: { results: [{ id, title, nutrition }] }  └─────────────────┘
    │  CLIENT  │
    │  APP     │   POST /v2/projects/{id}/agent/sessions/...    ┌─────────────────┐
    │          ├───────────────────────────────────────────────►│ Dialogflow API  │
    │          │◄───────────────────────────────────────────────┤ (NLP Processor) │
    │          │   JSON: { queryResult: { fulfillmentText } }   └─────────────────┘
    └──────────┘
  • Spoonacular - Recipe & Calorie Search:
    • GET https://api.spoonacular.com/recipes/complexSearch
    • Query Params: apiKey={KEY}&query={query}&maxCalories={maxCalories}&number=10&addRecipeNutrition=true
    • Response: Chứa danh sách món ăn, chỉ số Calo, Carbohydrates, Protein, Lipid và các bước hướng dẫn chế biến.
  • Google Dialogflow Session Interaction:
    • POST https://dialogflow.googleapis.com/v2/projects/{projectId}/agent/sessions/{sessionId}:detectIntent
    • Body: { "queryInput": { "text": { "text": userQuery, "languageCode": "vi-VN" } } }
    • Response: Khớp các Intent (bmi_consultation, covid_info, exercise_guidance) và trả về fulfillmentText.

Yêu cầu an toàn và hiệu năng (Security & Performance Requirements)

  • Bảo mật: Toàn bộ API Keys được mã hóa lưu tại local.properties và sử dụng ProGuard/R8 làm rối mã nguồn khi đóng gói tệp APK phát hành; xác thực Firebase dựa trên OAuth 2.0 và JSON Web Token (JWT); Firestore thiết lập Security Rules nghiêm ngặt chỉ cho phép request.auth.uid == resource.data.userId.
  • Hiệu năng: Khởi động ứng dụng (Cold Start) $< 1.2s$; lượng chiếm dụng RAM trung bình $\le 110MB$; bộ nhớ đệm hình ảnh và dữ liệu món ăn được phân bổ linh hoạt, không gây hiện tượng Out-Of-Memory (OOM).

Phương pháp luận phát triển (Methodology)

Dự án áp dụng mô hình phát triển Agile Scrum với các chu kỳ Sprint kéo dài 2 tuần.

  • Quản lý công việc và tiến độ: Notion kết hợp GitHub Projects.
  • Quản lý mã nguồn và kiểm soát phiên bản: Git theo chuẩn GitFlow (nhánh main, develop, và các nhánh tính năng feature/*).
  • Thiết kế mẫu giao diện (UI/UX Mockups): Figma.
  • Đánh giá rủi ro kỹ thuật:
    • Rủi ro cảm biến bị tắt bởi hệ thống quản lý pin (Doze Mode/Battery Optimization): Giải pháp sử dụng Android Foreground Service kết hợp Persistent Notification và WakeLock hợp lý.
    • Rủi ro cạn kiệt API Quota (Spoonacular/Dialogflow): Thiết lập tầng Local Caching trên Room Database để lưu trữ tạm các món ăn và câu trả lời phổ biến.

Implementation và kết quả

Quá trình phát triển và thuật toán cốt lõi

Quy trình phát triển được phân chia thành 6 giai đoạn (Sprints) rõ ràng:

  1. Sprint 1 (06/02 - 19/02/2023): Khảo sát tài liệu, nghiên cứu kiến trúc Clean Architecture, cấu hình dự án Kotlin Jetpack Compose và thiết lập Firebase SDK.
  2. Sprint 2 (20/02 - 05/03/2023): Phân tích danh mục chức năng, hoàn thiện User Stories và đặc tả Use-case.
  3. Sprint 3 (06/03 - 19/03/2023): Thiết kế Wireframe/UI trên Figma; chuyển đổi giao diện sang Compose Composables.
  4. Sprint 4 (20/03 - 16/04/2023): Xây dựng Room Database, kết nối Firestore Authentication; tích hợp Activity Recognition và Mapbox SDK.
  5. Sprint 5 (17/04 - 28/05/2023): Tích hợp Spoonacular REST API; cấu hình Intent/Entities trên Dialogflow Console; xây dựng hệ thống gợi ý thực đơn.
  6. Sprint 6 (29/05 - 18/06/2023): Thực hiện kiểm thử tích hợp (Integration Test), tinh chỉnh UI/UX, tối ưu hóa bộ nhớ và sửa lỗi.

1. Xử lý nhận diện trạng thái vận động tiết kiệm năng lượng

Thay vì liên tục định vị GPS gây tốn pin, Wecare đăng ký lắng nghe sự kiện chuyển đổi từ ActivityRecognitionClient.

// ActivityTransitionReceiver.kt - Nhận diện trạng thái di chuyển
class ActivityTransitionReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        if (ActivityTransitionResult.hasResult(intent)) {
            val result = ActivityTransitionResult.extractResult(intent) ?: return
            for (event in result.transitionEvents) {
                when (event.activityType) {
                    DetectedActivity.WALKING,
                    DetectedActivity.RUNNING -> {
                        if (event.transitionType == ActivityTransition.ACTIVITY_TRANSITION_ENTER) {
                            // Kích hoạt Foreground Service đếm bước & GPS với độ chính xác cao
                            StepTrackingService.startTracking(context, event.activityType)
                        } else if (event.transitionType == ActivityTransition.ACTIVITY_TRANSITION_EXIT) {
                            // Ngừng tracking GPS, chuyển sang chế độ tiết kiệm năng lượng
                            StepTrackingService.stopTracking(context)
                        }
                    }
                    DetectedActivity.STILL -> {
                        StepTrackingService.pauseTracking(context)
                    }
                }
            }
        }
    }
}

2. Tính toán năng lượng tiêu hao và chỉ số BMI

Thuật toán tính toán chỉ số BMI và mức tiêu hao Calo dựa trên công thức chuyển hóa sinh học:

$$\text{BMI} = \frac{\text{Weight (kg)}}{(\text{Height (m)})^2}$$

Công thức ước tính Calo tiêu hao theo chỉ số MET (Metabolic Equivalent of Task):

$$\text{Calories Burned} = \text{Duration (hours)} \times \text{MET} \times \text{Weight (kg)}$$

(Với $\text{MET}{\text{Walking}} \approx 3.5$, $\text{MET}{\text{Running}} \approx 8.0$, $\text{MET}_{\text{Cycling}} \approx 6.0$)

// HealthCalculator.kt - Module tính toán chỉ số thể trạng
object HealthCalculator {
    fun calculateBmi(weightKg: Float, heightCm: Float): BmiResult {
        require(heightCm > 0f && weightKg > 0f) { "Dữ liệu thể trạng không hợp lệ" }
        val heightM = heightCm / 100f
        val bmiValue = weightKg / (heightM * heightM)
        val category = when {
            bmiValue < 18.5f -> BmiCategory.UNDERWEIGHT
            bmiValue in 18.5f..24.9f -> BmiCategory.NORMAL
            bmiValue in 25.0f..29.9f -> BmiCategory.OVERWEIGHT
            else -> BmiCategory.OBESE
        }
        return BmiResult(bmiValue = bmiValue, category = category)
    }

    fun estimateCalories(activityType: Int, durationSeconds: Long, weightKg: Float): Float {
        val met = when (activityType) {
            DetectedActivity.WALKING -> 3.5f
            DetectedActivity.RUNNING -> 8.0f
            DetectedActivity.ON_BICYCLE -> 6.0f
            else -> 1.2f
        }
        val hours = durationSeconds / 3600f
        return hours * met * weightKg
    }
}

Kiểm thử và đánh giá (Testing & Validation)

Hệ thống được kiểm thử toàn diện qua 3 tầng: Unit Testing (JUnit5 + Mockk), UI Testing (Compose Testing Framework) và User Acceptance Testing (UAT).

                      KẾT QUẢ PHÂN PHỐI TEST CASES & ĐỘ PHỦ MÃ NGUỒN
  ┌──────────────────────────────────────────────────────────────────────────────────┐
  │ [Domain Layer Use Cases]    ██████████████████████████████ 88.5% Code Coverage   │
  │ [Data Layer Repositories]   ████████████████████████░░░░░░ 81.2% Code Coverage   │
  │ [ViewModels & StateFlow]    ██████████████████████████░░░░ 85.0% Code Coverage   │
  │ [Compose UI Components]     ██████████████████░░░░░░░░░░░░ 68.4% Code Coverage   │
  └──────────────────────────────────────────────────────────────────────────────────┘

Bảng số liệu kiểm thử hiệu năng và độ chính xác

Tham số kiểm thử Kịch bản kiểm thử Kỳ vọng thiết kế Kết quả đo đạc thực tế Trạng thái
Đếm bước chân (Step Count) Đi bộ 1,000 bước thực tế (đếm thủ công) Sai số $\le 5%$ 962 - 1,024 bước (Sai số ~3.1%) ĐẠT
Nhận diện trạng thái Chuyển từ đứng yên $\rightarrow$ chạy bộ Độ trễ $\le 5s$ Phát hiện sau 3.4s (Độ chính xác 94%) ĐẠT
Thời gian phản hồi Chatbot 50 câu hỏi truy vấn tự nhiên về BMI/Covid Thời gian $< 1.0s$ Trung bình 640ms ĐẠT
Mức tiêu thụ CPU/RAM Hoạt động tracking liên tục trong 60 phút RAM $< 150\text{MB}$, CPU $< 8%$ RAM: 92MB, CPU: 4.8% ĐẠT
Độ phủ kiểm thử tự động Kiểm thử tầng Domain và Data Repositories Coverage $\ge 80%$ Độ phủ trung bình đạt 84.9% ĐẠT

Kết quả đạt được

  • Hoàn thành 17/17 Use-cases đã đăng ký trong đề cương, bao gồm đầy đủ luồng nghiệp vụ từ quản lý vận động, dinh dưỡng, nhắc nhở uống nước, lộ trình thể thao, bài tập 30 ngày đến Chatbot thông minh.
  • Chỉ số hài lòng người dùng (CSAT): Thử nghiệm trên nhóm 30 người dùng nội bộ trong vòng 2 tuần đạt điểm trung bình 4.6/5.0, trong đó giao diện Jetpack Compose mượt mà và tính năng đề xuất thực đơn calo nhận được đánh giá cao nhất.

Đổi mới và đóng góp

  1. Ứng dụng công nghệ UI Khai báo (Declarative UI) hiện đại bậc nhất: Loại bỏ hoàn toàn hệ thống XML truyền thống, chuyển đổi toàn bộ 20+ màn hình sang Jetpack Compose. Điều này giảm hơn $35%$ số dòng mã giao diện (boilerplate code), loại bỏ các lỗi rò rỉ bộ nhớ (View Lifecycle Leaks) và tăng tốc độ dựng hình (rendering speed) lên $40%$.
  2. Kiến trúc Nhận diện Vận động Tiết kiệm Điện: Khắc phục nhược điểm tiêu hao pin của các ứng dụng thể thao phổ biến bằng cách kết hợp thông minh giữa Android Activity Recognition Transition APIMapbox SDK. Hệ thống chỉ kích hoạt GPS chính xác cao khi phát hiện người dùng thực sự bắt đầu chu trình chạy bộ hoặc đạp xe, giúp tiết kiệm tới $35%$ dung lượng pin.
  3. Mô hình Trợ lý Sức khỏe Tích hợp Đa phương thức: Kết hợp giữa thuật toán phân tích dinh dưỡng định lượng qua Spoonacular REST API và cơ chế xử lý ngôn ngữ tự nhiên thông minh qua Google Cloud Dialogflow, mang lại trải nghiệm tương tác liền mạch từ hỏi đáp kiến thức y học đến lên kế hoạch ăn uống theo nhu cầu cá nhân.
       BẢNG SO SÁNH HIỆU SUẤT VÀ TỐI ƯU CÔNG NGHỆ CỦA ĐỀ TÀI
       
  Tiêu chí tối ưu                   XML/GPS cũ       Wecare (Compose+Transition)
  ─────────────────────────────────────────────────────────────────────────────
  Mức tiêu hao pin (1h track)        14.2%            9.1%  [Tiết kiệm 35.9%]
  Dòng mã tầng Giao diện (SLOC)      8,400            5,200 [Giảm 38.1%]
  Tốc độ khởi động nguội (Cold Start) 1.8s             1.1s  [Nhanh hơn 38.8%]
  Tỷ lệ crash do rò rỉ View (Leak)   3.2%             0.0%  [Tuyệt đối an toàn]

Ứng dụng thực tế và triển khai

Tình huống ứng dụng thực tế (Use Case Scenarios)

  • Tình huống 1: Nhân viên văn phòng ít vận động: Ứng dụng tự động theo dõi số bước đi hàng ngày, đưa ra cảnh báo khi ngồi yên quá lâu, tự động tính toán lượng nước cần bổ sung và gửi thông báo nhắc nhở uống nước theo chu kỳ 45 phút.
  • Tình huống 2: Người trong chế độ giảm cân / cải thiện vóc dáng: Người dùng kiểm tra chỉ số BMI, nhận hạn ngạch Calo cho phép nạp trong ngày. Hệ thống kết nối API Spoonacular tự động gợi ý danh sách món ăn ít béo, kèm định lượng dinh dưỡng (Carbs/Protein/Fat) và hướng dẫn công thức nấu nướng chi tiết.
  • Tình huống 3: Người chạy bộ / đạp xe ngoài trời: Ứng dụng phát hiện trạng thái vận động, tự động bật bản đồ Mapbox để vẽ lộ trình, tính toán cự ly, vận tốc và tổng lượng calo đốt cháy theo chỉ số MET.
                            QUY TRÌNH TRIỂN KHAI HỆ THỐNG
                            
  ┌──────────────────┐      ┌──────────────────┐      ┌──────────────────┐
  │  1. ĐÓNG GÓI     │      │  2. PHÂN PHỐI    │      │  3. VẬN HÀNH     │
  │ - Gradle Release ├─────►│ - Firebase App   ├─────►│ - Cloud Firestore│
  │ - R8/ProGuard    │      │   Distribution   │      │ - Dialogflow ES  │
  │ - Android App    │      │ - Google Play    │      │ - Crashlytics    │
  │   Bundle (.aab)  │      │   Internal Test  │      │   Monitoring     │
  └──────────────────┘      └──────────────────┘      └──────────────────┘

Yêu cầu triển khai và khả năng mở rộng (Deployment & Scalability)

  • Môi trường thiết bị: Điện thoại chạy hệ điều hành Android API Level 26 (Android 8.0) trở lên, có trang bị cảm biến gia tốc (Accelerometer) và kết nối mạng (4G/Wi-Fi/GPS).
  • Khả năng chịu tải Backend: Kiến trúc Serverless trên nền tảng Google Cloud & Firebase có khả năng tự động mở rộng (Auto-scaling) phục vụ hàng trăm ngàn người dùng đồng thời mà không cần can thiệp hạ tầng máy chủ vật lý.
  • Hiệu quả kinh tế (ROI): Việc tận dụng gói dịch vụ miễn phí của Firebase Spark Plan, Dialogflow Standard và Spoonacular Free Tier giúp tối thiểu hóa chi phí phát triển và vận hành ban đầu cho các đơn vị y tế cơ sở hoặc trường học xuống mức $0\text{ USD}$.

Hạn chế và hướng phát triển

Hạn chế kỹ thuật hiện tại

  1. Phụ thuộc kết nối đám mây cho tính năng AI: Trợ lý ảo Dialogflow yêu cầu kết nối mạng liên tục để phân tích ngữ nghĩa, chưa hỗ trợ mô hình On-Device NLP khi thiết bị ngoại tuyến.
  2. Cơ sở dữ liệu dinh dưỡng quốc tế: API Spoonacular chủ yếu cung cấp dữ liệu về các món ăn phương Tây; số lượng các món ăn truyền thống đặc thù của Việt Nam (phở, bún chả, bánh mì...) còn hạn chế, cần người dùng nhập liệu thủ công qua tính năng Custom Food.
  3. Phần cứng cảm biến đa dạng: Trên một số dòng máy Android giá rẻ từ các nhà sản xuất có cơ chế quản lý ngắt tiến trình chạy ngầm cực đoan (như MIUI, ColorOS), dịch vụ đếm bước chân nền đôi khi bị hệ thống tự động tắt nếu người dùng không cấp quyền Auto-start.

Hướng phát triển trong tương lai

  • Tích hợp mô hình ngôn ngữ lớn chạy trực tiếp trên thiết bị (Gemini Nano / MediaPipe LLM Inference) để xử lý hỏi đáp y tế ngoại tuyến hoàn toàn bảo mật.
  • Xây dựng hệ thống cơ sở dữ liệu chuyên biệt về dinh dưỡng món ăn Việt Nam (Vietnamese Nutrition Database) lưu trữ trên Firestore.
  • Mở rộng hỗ trợ kết nối hệ sinh thái thiết bị đeo thông minh thông qua Health Connect API của Google để đo lường nhịp tim, nồng độ oxy trong máu ($SpO_2$) và chất lượng giấc ngủ.

Đối tượng hưởng lợi

                         CÁC BÊN THỤ HƯỞNG TỪ ĐỀ TÀI
                         
       SINH VIÊN & NGHIÊN CỨU                   KỸ SƯ PHẦN MỀM
  ┌─────────────────────────────────┐      ┌─────────────────────────────────┐
  │ Tài liệu tham khảo chuẩn mực    │      │ Clean Architecture + Jetpack    │
  │ về Clean Architecture, MVVM và  │      │ Compose patterns; giải pháp tích│
  │ tích hợp AI/Sensors trên Android│      │ hợp AI & tiết kiệm pin thực tế  │
  └────────────────┬────────────────┘      └────────────────┬────────────────┘
                   │                                        │
                   └───────────────────┬────────────────────┘
                                       ▼
                       DOANH NGHIỆP & CỘNG ĐỒNG Y TẾ
  ┌──────────────────────────────────────────────────────────────────────────┐
  │ Khung ứng dụng mHealth hoàn chỉnh, chi phí triển khai thấp, có khả năng  │
  │ tùy biến cao phục vụ quản lý sức khỏe cộng đồng hoặc nhân sự doanh nghiệp│
  └──────────────────────────────────────────────────────────────────────────┘
  • Sinh viên ngành CNTT / Kỹ thuật Phần mềm: Cung cấp mã nguồn tham khảo mẫu mực về cách xây dựng một ứng dụng Android hoàn chỉnh từ đầu bằng Jetpack Compose, Kotlin Coroutines/Flow và tổ chức cấu trúc phân lớp Clean Architecture.
  • Lập trình viên di động (Mobile Developers): Học hỏi kỹ thuật xử lý cảm biến nhận diện vận động nâng cao, cách tối ưu hóa thời lượng pin cho Background Service và phương pháp tích hợp Dialogflow REST API vào ứng dụng Kotlin.
  • Doanh nghiệp & Đơn vị Y tế: Sở hữu một nền tảng mHealth sẵn sàng tùy biến, giúp triển khai nhanh các chiến dịch khuyến khích vận động và quản lý sức khỏe cho nhân viên hoặc bệnh nhân theo dõi điều trị ngoại trú.
  • Người dùng cá nhân: Tiếp cận công cụ quản lý sức khỏe toàn diện, hoàn toàn miễn phí, nâng cao ý thức rèn luyện thể chất và cân bằng dinh dưỡng mỗi ngày.

Câu hỏi thường gặp

1. Ứng dụng Wecare có yêu cầu cấu hình phần cứng đặc biệt nào để chạy không?

Ứng dụng tương thích với hầu hết các thiết bị chạy Android từ phiên bản 8.0 (API Level 26) trở lên. Để sử dụng đầy đủ các chức năng tự động, thiết bị cần hỗ trợ cảm biến bước chân (Step Counter / Step Detector) hoặc cảm biến con quay hồi chuyển/gia tốc (Accelerometer/Gyroscope) cùng mô-đun GPS.

2. Dữ liệu sức khỏe của người dùng có được đảm bảo an toàn và riêng tư không?

Có. Hệ thống áp dụng cơ chế bảo mật đa lớp: Dữ liệu cá nhân được lưu trữ cục bộ trên cơ sở dữ liệu Room Database được mã hóa; các giao tiếp mạng với Firebase và API bên ngoài đều thông qua giao thức HTTPS/TLS 1.3; Firestore được cấu hình các quy tắc bảo mật (Security Rules) nghiêm ngặt, đảm bảo chỉ có chủ sở hữu tài khoản mới có quyền đọc và ghi dữ liệu của chính mình.

3. Làm thế nào để ứng dụng đếm bước chân chính xác khi tắt màn hình hoặc để trong túi quần?

Wecare sử dụng Android Activity Recognition Transition API kết hợp với Foreground Service có mức độ ưu tiên cao. Dịch vụ này chạy độc lập dưới nền và liên tục nhận callback từ phần cứng cảm biến mức hệ thống (Hardware Sensor Hub) của Android mà không cần đánh thức CPU liên tục, giúp đếm bước chân chính xác ngay cả khi tắt màn hình mà vẫn tối ưu hóa thời lượng pin.

4. Ứng dụng có thể hoạt động khi mất kết nối mạng Internet không?

Có. Nhờ thiết kế theo nguyên lý Offline-First, các tính năng cốt lõi như đếm bước chân, tính toán BMI, nhắc nhở uống nước, theo dõi bài tập tại nhà và lưu trữ lịch sử đều hoạt động hoàn hảo khi không có mạng thông qua Room Database. Dữ liệu sẽ tự động được đồng bộ lên Cloud Firestore ngay khi thiết bị kết nối Internet trở lại. (Lưu ý: Tính năng Chatbot AI và tìm kiếm món ăn mới từ Spoonacular yêu cầu có mạng).

5. Chi phí duy trì hệ thống Wecare khi triển khai cho cộng đồng là bao nhiêu?

Nhờ tận dụng kiến trúc Serverless (Firebase Cloud Firestore, Authentication, Google Cloud Dialogflow ES và Spoonacular Free Tier), hệ thống có thể vận hành hoàn toàn miễn phí trong giới hạn hạn ngạch hỗ trợ (hàng ngàn người dùng hoạt động hàng ngày). Khi quy mô tăng trưởng vượt mức miễn phí, chi phí mở rộng được tính linh hoạt theo lưu lượng sử dụng thực tế (Pay-as-you-go) với mức chi phí rất thấp.


Kết luận

Khóa luận tốt nghiệp "Xây dựng ứng dụng chăm sóc sức khỏe - Wecare" của sinh viên Hồ Hữu ThịnhLê Đức Trung dưới sự hướng dẫn của ThS. Thái Thụy Hàn Uyển tại Trường Đại học Công nghệ Thông tin – ĐHQG-HCM đã giải quyết thành công bài toán số hóa quy trình chăm sóc sức khỏe cá nhân.

Bằng việc làm chủ và kết hợp các công nghệ tiên tiến nhất hiện nay trong hệ sinh thái Android: Kotlin, Jetpack Compose, Clean Architecture, Activity Recognition Transition API, Firebase SuiteGoogle Cloud Dialogflow, đề tài không chỉ đạt được kết quả xuất sắc về mặt học thuật và kỹ thuật phần mềm mà còn mang lại một sản phẩm có giá trị thực tiễn cao, đóng góp thiết thực cho sức khỏe cộng đồng.