亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

Android服藥提醒APP開發(fā):從需求分析到MVVM架構(gòu)與AlarmManager實(shí)戰(zhàn)

Android服藥提醒APP開發(fā):從需求分析到MVVM架構(gòu)與AlarmManager實(shí)戰(zhàn) 簡介本資源是一套面向計(jì)算機(jī)專業(yè)本科生的Android畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)項(xiàng)目聚焦老年人健康管理場景解決獨(dú)居或慢性病老人漏服、錯(cuò)服藥物的現(xiàn)實(shí)問題。項(xiàng)目采用Android原生開發(fā)技術(shù)棧基于Java語言實(shí)現(xiàn)涵蓋首頁展示、個(gè)性化用藥提醒設(shè)置、服藥記錄查詢及個(gè)人中心等核心模塊具備完整的前后端交互邏輯與本地?cái)?shù)據(jù)管理能力。壓縮包共5個(gè)文件包含前端源碼、后臺(tái)服務(wù)代碼、數(shù)據(jù)庫SQL腳本、詳細(xì)使用說明文檔及README指引總大小46.04MB結(jié)構(gòu)清晰便于分模塊學(xué)習(xí)與調(diào)試。已有296人下載學(xué)習(xí)適合Android初學(xué)者鞏固Activity生命周期、AlarmManager定時(shí)機(jī)制、SQLite數(shù)據(jù)存儲(chǔ)及UI適配等關(guān)鍵技術(shù)點(diǎn)亦可作為課程設(shè)計(jì)或畢設(shè)答辯的完整參考方案。1. 項(xiàng)目概述一個(gè)源于真實(shí)需求的畢業(yè)設(shè)計(jì)選題做畢業(yè)設(shè)計(jì)那會(huì)兒選題是個(gè)讓人頭疼的事兒。既要能體現(xiàn)大學(xué)四年所學(xué)又得有點(diǎn)實(shí)際價(jià)值不能是那種“為了做而做”的空中樓閣。當(dāng)時(shí)我注意到家里的長輩特別是爺爺奶奶每天要吃好幾種藥時(shí)間、劑量都不一樣全靠一個(gè)小藥盒和記憶力經(jīng)常漏服或者記不清吃沒吃過。這讓我意識(shí)到一個(gè)簡單、易用、專門為老年人設(shè)計(jì)的服藥提醒應(yīng)用或許是個(gè)不錯(cuò)的切入點(diǎn)。它不只是一個(gè)簡單的鬧鐘更是一個(gè)結(jié)合了Android開發(fā)、用戶體驗(yàn)設(shè)計(jì)、數(shù)據(jù)持久化等多個(gè)知識(shí)點(diǎn)的綜合性項(xiàng)目非常適合作為計(jì)算機(jī)或軟件工程專業(yè)的畢業(yè)設(shè)計(jì)。這個(gè)“老年人服藥提醒APP”的核心目標(biāo)非常明確幫助認(rèn)知能力可能下降、對智能手機(jī)操作不熟悉的老年用戶準(zhǔn)時(shí)、準(zhǔn)確地服用藥物。它不是一個(gè)功能繁雜的健康管理平臺(tái)而是聚焦于“提醒”這一核心功能力求在交互上做到極致的簡潔和友好。整個(gè)項(xiàng)目從需求分析、UI/UX設(shè)計(jì)、編碼實(shí)現(xiàn)到測試打包完整地走了一遍軟件開發(fā)的流程。最終我不僅完成了一個(gè)能實(shí)際運(yùn)行的應(yīng)用還整理出了詳細(xì)的源碼和使用說明打包成了那個(gè)經(jīng)典的“(基于android的畢業(yè)設(shè)計(jì))老年人服藥提醒APP(源碼使用說明).zip”文件。這份資料對于正在尋找畢設(shè)靈感或者想學(xué)習(xí)如何開發(fā)一個(gè)具有人文關(guān)懷的實(shí)用型APP的同學(xué)來說應(yīng)該會(huì)很有幫助。2. 核心需求與設(shè)計(jì)思路拆解2.1 目標(biāo)用戶畫像與核心痛點(diǎn)分析在動(dòng)手寫一行代碼之前我們必須先搞清楚我們的用戶是誰以及他們最需要什么。這個(gè)APP的目標(biāo)用戶是60歲以上的老年人他們可能具有以下特征視力可能老化字體太小、顏色對比度低、圖標(biāo)過于抽象都會(huì)造成閱讀困難。操作不熟練對智能手機(jī)的觸控操作如長按、滑動(dòng)不熟悉容易誤觸。記憶力減退容易忘記是否吃過藥或者記錯(cuò)服藥時(shí)間??赡芑加卸喾N慢性病需要同時(shí)服用多種藥物每種藥物的服用周期如一天三次、隔天一次、劑量如1片、半片都可能不同。對復(fù)雜功能有抵觸心理功能太多、界面太花哨會(huì)讓他們感到困惑和害怕。基于以上分析我們提煉出幾個(gè)最核心的需求痛點(diǎn)極簡交互操作步驟盡可能少點(diǎn)擊區(qū)域要大避免復(fù)雜的導(dǎo)航。清晰可視字體必須足夠大關(guān)鍵信息如藥名、時(shí)間要突出顯示。強(qiáng)提醒能力提醒必須足夠醒目和持久能穿透老年人的日常生活。服藥記錄與確認(rèn)提供簡單的“已服藥”確認(rèn)機(jī)制并保留歷史記錄解決“吃沒吃過”的疑慮。家屬協(xié)同可選但重要允許子女遠(yuǎn)程為父母添加藥品和提醒并查看服藥記錄。注意很多同學(xué)做畢設(shè)容易陷入“技術(shù)炫技”的誤區(qū)給老年人APP加上圖表分析、社交分享等復(fù)雜功能這完全是本末倒置。我們的設(shè)計(jì)必須做減法一切以“降低認(rèn)知負(fù)荷”和“減少操作步驟”為最高原則。2.2 技術(shù)棧選型與架構(gòu)考量明確了需求接下來就要選擇實(shí)現(xiàn)的技術(shù)方案。作為一個(gè)Android畢業(yè)設(shè)計(jì)技術(shù)選型需要在“體現(xiàn)技術(shù)能力”和“保證項(xiàng)目可控性”之間取得平衡。開發(fā)環(huán)境與語言毫無疑問Android Studio是官方且最主流的IDE。語言選擇Kotlin是更優(yōu)解。雖然很多教學(xué)資料仍用Java但Kotlin語法更簡潔、空安全特性好能減少很多潛在的崩潰NullPointerException這對于一個(gè)需要穩(wěn)定運(yùn)行的提醒應(yīng)用至關(guān)重要。在畢設(shè)答辯時(shí)使用Kotlin也能體現(xiàn)你對技術(shù)趨勢的關(guān)注。架構(gòu)模式推薦采用MVVMModel-View-ViewModel架構(gòu)。這是目前Android官方推薦的應(yīng)用架構(gòu)。它將界面邏輯View與業(yè)務(wù)邏輯和數(shù)據(jù)ViewModel Model分離使得代碼更清晰、更易于測試和維護(hù)。對于服藥提醒這個(gè)業(yè)務(wù)邏輯相對清晰的項(xiàng)目MVVM能很好地管理藥品數(shù)據(jù)、提醒時(shí)間和UI狀態(tài)。數(shù)據(jù)持久化藥品信息、服藥計(jì)劃、歷史記錄都需要本地存儲(chǔ)。這里有兩個(gè)主流選擇Room Persistence Library它是SQLite的抽象層屬于Android Jetpack組件與MVVM架構(gòu)和LiveData/Flow能完美結(jié)合。它通過編譯時(shí)檢查SQL語句避免了大量模板代碼是存儲(chǔ)結(jié)構(gòu)化數(shù)據(jù)如藥品表、記錄表的最佳實(shí)踐。SharedPreferences適合存儲(chǔ)簡單的鍵值對比如用戶設(shè)置是否開啟聲音提醒、默認(rèn)提醒提前時(shí)間等。取舍雖然直接使用SQLite也能體現(xiàn)能力但Room更現(xiàn)代在畢設(shè)中采用能加分。因此核心數(shù)據(jù)藥品、記錄用Room簡單配置用SharedPreferences是比較合理的方案。定時(shí)提醒實(shí)現(xiàn)這是項(xiàng)目的技術(shù)核心。我們不能用簡單的Timer或Handler因?yàn)閼?yīng)用進(jìn)程可能被系統(tǒng)回收。必須使用系統(tǒng)級的調(diào)度機(jī)制。AlarmManager這是傳統(tǒng)的系統(tǒng)鬧鐘服務(wù)可以設(shè)置在特定時(shí)間觸發(fā)即使應(yīng)用未運(yùn)行或設(shè)備休眠。我們可以用它來在設(shè)定的服藥時(shí)間點(diǎn)觸發(fā)一個(gè)通知Notification。WorkManager屬于Jetpack組件用于處理可延遲的、保證執(zhí)行的后臺(tái)任務(wù)。它更適合處理非精確時(shí)間的任務(wù)如每天同步一次數(shù)據(jù)。對于精確到分鐘的藥物提醒AlarmManager仍然是更直接可靠的選擇。前臺(tái)服務(wù)Foreground Service如果希望提醒更“頑固”比如在提醒時(shí)持續(xù)播放聲音直到用戶操作可以考慮啟動(dòng)一個(gè)前臺(tái)服務(wù)。但這會(huì)消耗更多資源且需要向用戶申請“常駐通知”權(quán)限對老年人可能造成困擾。因此優(yōu)先采用高優(yōu)先級通知Priority: HIGH配合AlarmManager是更優(yōu)雅的方案。2.3 功能模塊設(shè)計(jì)根據(jù)核心需求我們將APP劃分為以下幾個(gè)主要模塊藥品管理模塊添加/編輯藥品輸入藥名、規(guī)格、圖片可選方便識(shí)別、服用劑量、備注如“餐后服用”。藥品列表以卡片或大列表形式展示所有藥品一目了然。刪除藥品簡單的刪除操作最好有二次確認(rèn)。服藥計(jì)劃模塊與藥品綁定設(shè)置提醒時(shí)間為每種藥添加一個(gè)或多個(gè)每日固定提醒時(shí)間如08:00 12:30 19:00。設(shè)置服藥周期每天、隔天、每周特定幾天等。計(jì)劃概覽以時(shí)間線或日歷形式展示今天的所有服藥計(jì)劃。提醒與通知模塊到點(diǎn)觸發(fā)在設(shè)定時(shí)間通過AlarmManager觸發(fā)發(fā)送一個(gè)高優(yōu)先級的系統(tǒng)通知。通知內(nèi)容清晰顯示藥名、劑量、服用說明。通知操作按鈕至少包括“已服用”和“稍后提醒”如10分鐘后。提醒方式震動(dòng)、響鈴可自定義鈴聲且鈴聲應(yīng)持久直到用戶處理。服藥記錄模塊自動(dòng)記錄用戶點(diǎn)擊通知的“已服用”后自動(dòng)生成一條帶有時(shí)間戳的記錄。手動(dòng)補(bǔ)錄允許用戶手動(dòng)添加過去某次的服藥記錄應(yīng)對忘記點(diǎn)擊的情況。記錄查看按日或按藥品查看歷史記錄界面簡潔。設(shè)置模塊通用設(shè)置默認(rèn)提醒提前時(shí)間、是否震動(dòng)、鈴聲選擇。數(shù)據(jù)管理備份與恢復(fù)服藥數(shù)據(jù)可導(dǎo)出為JSON文件。3. 核心功能實(shí)現(xiàn)細(xì)節(jié)與避坑指南3.1 數(shù)據(jù)庫設(shè)計(jì)與Room實(shí)戰(zhàn)數(shù)據(jù)庫是整個(gè)APP的數(shù)據(jù)基石設(shè)計(jì)的好壞直接影響后續(xù)開發(fā)的復(fù)雜度。實(shí)體Entity設(shè)計(jì)我們至少需要兩張表Medicine藥品和MedicineRecord服藥記錄。Medicine表包含藥品的靜態(tài)信息MedicineRecord表則記錄每次服藥的動(dòng)作。// Medicine.kt Entity(tableName medicines) data class Medicine( PrimaryKey(autoGenerate true) val id: Long 0, val name: String, // 藥品名稱 val dosage: String, // 劑量如“一次一片” val imageUri: String? null, // 藥品圖片本地URI可選 val note: String? null // 備注 ) // MedicineRecord.kt Entity(tableName medicine_records, foreignKeys [ForeignKey( entity Medicine::class, parentColumns [id], childColumns [medicineId], onDelete ForeignKey.CASCADE // 藥品刪除時(shí)關(guān)聯(lián)記錄也刪除 )] ) data class MedicineRecord( PrimaryKey(autoGenerate true) val id: Long 0, val medicineId: Long, // 關(guān)聯(lián)的藥品ID val takenTime: Long, // 服藥時(shí)間戳System.currentTimeMillis() val isTakenOnTime: Boolean true // 是否準(zhǔn)時(shí)服用點(diǎn)擊通知 vs 手動(dòng)補(bǔ)錄 )數(shù)據(jù)訪問對象DAO設(shè)計(jì)DAO定義了操作數(shù)據(jù)庫的方法。這里的關(guān)鍵是處理藥品與記錄的關(guān)系查詢。// MedicineDao.kt Dao interface MedicineDao { Insert suspend fun insert(medicine: Medicine): Long Update suspend fun update(medicine: Medicine) Delete suspend fun delete(medicine: Medicine) Query(SELECT * FROM medicines ORDER BY name ASC) fun getAllMedicines(): FlowListMedicine // 使用Flow便于在UI中觀察數(shù)據(jù)變化 // 查詢某藥品的所有記錄 Query(SELECT * FROM medicine_records WHERE medicineId :medId ORDER BY takenTime DESC) fun getRecordsForMedicine(medId: Long): FlowListMedicineRecord }數(shù)據(jù)庫類Database這是Room的入口需要定義數(shù)據(jù)庫版本和包含的實(shí)體列表。// AppDatabase.kt Database(entities [Medicine::class, MedicineRecord::class], version 1, exportSchema false) abstract class AppDatabase : RoomDatabase() { abstract fun medicineDao(): MedicineDao companion object { // 單例模式避免重復(fù)打開數(shù)據(jù)庫 Volatile private var INSTANCE: AppDatabase? null fun getDatabase(context: Context): AppDatabase { return INSTANCE ?: synchronized(this) { val instance Room.databaseBuilder( context.applicationContext, AppDatabase::class.java, medicine_reminder_db // 數(shù)據(jù)庫文件名 ).build() INSTANCE instance instance } } } }實(shí)操心得Room的ForeignKey和onDelete CASCADE非常有用。它保證了數(shù)據(jù)的一致性當(dāng)你刪除一種藥品時(shí)所有與之關(guān)聯(lián)的服藥記錄會(huì)被自動(dòng)清理避免了“孤兒記錄”。另外DAO方法返回FlowListT而不是LiveDataListT是更現(xiàn)代的做法配合ViewModel中的stateFlow或sharedFlow能更好地處理UI狀態(tài)。3.2 精準(zhǔn)定時(shí)提醒AlarmManager的正確姿勢實(shí)現(xiàn)定時(shí)提醒是項(xiàng)目的核心也是容易踩坑的地方。1. 設(shè)置鬧鐘我們需要為每個(gè)藥品的每個(gè)提醒時(shí)間點(diǎn)設(shè)置一個(gè)獨(dú)立的鬧鐘。關(guān)鍵是要生成一個(gè)唯一的requestCode通常可以用(藥品ID * 100 時(shí)間索引)的方式來構(gòu)造確保能精準(zhǔn)取消或更新某個(gè)特定提醒。// ReminderScheduler.kt (工具類) object ReminderScheduler { fun scheduleReminder(context: Context, medicineId: Long, medicineName: String, triggerTimeMillis: Long) { val alarmManager context.getSystemService(Context.ALARM_SERVICE) as AlarmManager val intent Intent(context, ReminderReceiver::class.java).apply { putExtra(medicine_id, medicineId) putExtra(medicine_name, medicineName) } // 使用PendingIntent并確保FLAG_UPDATE_CURRENT和唯一的requestCode val requestCode (medicineId.toString() triggerTimeMillis.toString()).hashCode() val pendingIntent PendingIntent.getBroadcast( context, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE // Android 12 需要FLAG_IMMUTABLE ) // 對于精確的提醒使用 setExactAndAllowWhileIdle (API 23) // 它即使在低電耗模式下也能工作是設(shè)置重要鬧鐘的推薦方式 if (Build.VERSION.SDK_INT Build.VERSION_CODES.M) { alarmManager.setExactAndAllowWhileIdle( AlarmManager.RTC_WAKEUP, // 使用真實(shí)時(shí)間并喚醒設(shè)備 triggerTimeMillis, pendingIntent ) } else { alarmManager.setExact(AlarmManager.RTC_WAKEUP, triggerTimeMillis, pendingIntent) } // 可以將這個(gè)requestCode存下來用于后續(xù)取消 } }2. 接收廣播并發(fā)送通知?jiǎng)?chuàng)建一個(gè)BroadcastReceiver如ReminderReceiver來接收AlarmManager觸發(fā)的廣播并在這里構(gòu)建和發(fā)送通知。// ReminderReceiver.kt class ReminderReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val medicineId intent.getLongExtra(medicine_id, -1L) val medicineName intent.getStringExtra(medicine_name) ?: 服藥時(shí)間到 // 創(chuàng)建通知渠道 (Android 8.0 必需) createNotificationChannel(context) val notificationManager NotificationManagerCompat.from(context) // 構(gòu)建一個(gè)點(diǎn)擊后打開App的Intent val openAppIntent Intent(context, MainActivity::class.java).apply { flags Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK } val pendingOpenAppIntent PendingIntent.getActivity( context, 0, openAppIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE ) // 構(gòu)建“已服用”和“稍后提醒”的Action按鈕 val takenAction NotificationCompat.Action.Builder( null, // 圖標(biāo)如果不需要可以傳null但最好提供一個(gè) 已服用, getTakenPendingIntent(context, medicineId) // 這個(gè)PendingIntent會(huì)觸發(fā)記錄服藥和取消本次提醒的邏輯 ).build() val snoozeAction NotificationCompat.Action.Builder( null, 10分鐘后, getSnoozePendingIntent(context, medicineId, medicineName) // 這個(gè)PendingIntent會(huì)重新設(shè)置一個(gè)10分鐘后的鬧鐘 ).build() // 構(gòu)建通知 val notification NotificationCompat.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_pill_notification) // 一個(gè)藥丸圖標(biāo) .setContentTitle(服藥提醒) .setContentText(該服用$medicineName 了) .setPriority(NotificationCompat.PRIORITY_HIGH) // 高優(yōu)先級 .setCategory(NotificationCompat.CATEGORY_REMINDER) .setContentIntent(pendingOpenAppIntent) // 點(diǎn)擊通知主體打開App .setAutoCancel(true) // 點(diǎn)擊后自動(dòng)消失 .setOngoing(true) // 設(shè)置為持續(xù)通知直到用戶操作慎用可能引起反感 .setSound(Settings.System.DEFAULT_NOTIFICATION_URI) // 使用默認(rèn)通知音 .setVibrate(longArrayOf(0, 500, 200, 500)) // 震動(dòng)模式等待0ms震動(dòng)500ms暫停200ms再震動(dòng)500ms .addAction(takenAction) .addAction(snoozeAction) .build() // 發(fā)送通知使用一個(gè)唯一的ID避免覆蓋 notificationManager.notify(medicineId.toInt(), notification) } private fun createNotificationChannel(context: Context) { if (Build.VERSION.SDK_INT Build.VERSION_CODES.O) { val channel NotificationChannel( CHANNEL_ID, 服藥提醒, NotificationManager.IMPORTANCE_HIGH // 高重要性會(huì)有聲音和彈出 ).apply { description 用于接收服藥時(shí)間提醒 enableVibration(true) vibrationPattern longArrayOf(0, 500, 200, 500) } val notificationManager context.getSystemService(NotificationManager::class.java) notificationManager.createNotificationChannel(channel) } } companion object { const val CHANNEL_ID medicine_reminder_channel } }避坑指南Android 8.0 (API 26) 以上必須創(chuàng)建通知渠道否則通知不會(huì)顯示。渠道創(chuàng)建一次即可通常放在Application類或主Activity中。PendingIntent的Flag從Android 12開始必須指定FLAG_IMMUTABLE或FLAG_MUTABLE。對于大多數(shù)廣播和Activity啟動(dòng)FLAG_IMMUTABLE是安全的。鬧鐘的精確性setExactAndAllowWhileIdle()是保證提醒準(zhǔn)時(shí)觸發(fā)的關(guān)鍵但它有觸發(fā)頻率限制每15分鐘最多一次。對于服藥提醒這完全足夠。通知ID使用medicineId作為通知ID是個(gè)好方法這樣同一個(gè)藥品的重復(fù)提醒會(huì)更新通知而不是創(chuàng)建一堆。后臺(tái)限制從Android 10開始后臺(tái)啟動(dòng)Activity受到限制。我們的“打開App”的PendingIntent可能在某些情況下失效。更穩(wěn)健的做法是點(diǎn)擊通知后先啟動(dòng)一個(gè)前臺(tái)服務(wù)再由服務(wù)啟動(dòng)Activity但這增加了復(fù)雜度。對于畢設(shè)說明你了解這個(gè)限制即可。3.3 為老年人設(shè)計(jì)的UI/UX實(shí)踐界面是老年用戶接觸APP的唯一途徑必須精心設(shè)計(jì)。1. 色彩與對比度背景與文字使用高對比度配色例如純白色背景搭配深灰色#333333或黑色文字。避免使用淺灰文字。重要操作按鈕使用鮮艷、明確的顏色如綠色確認(rèn)/完成和紅色刪除/警告。確保色盲用戶也能通過形狀和文字區(qū)分。狀態(tài)指示例如“已服藥”用綠色打勾“未服藥”用紅色時(shí)鐘圖標(biāo)清晰明了。2. 字體與布局字體大小所有正文文字至少使用18sp標(biāo)題使用24sp或更大。在res/values/dimens.xml中定義尺寸常量便于全局調(diào)整。按鈕尺寸遵循Material Design的觸摸目標(biāo)最小尺寸48dp x 48dp。我們的按鈕應(yīng)該更大例如高度設(shè)置為60dp。布局簡化一個(gè)界面只做一個(gè)主要任務(wù)。添加藥品的界面就只放名稱、劑量、時(shí)間等必要輸入框其他高級設(shè)置可以收起或放到二級頁面。使用CardView用卡片將不同的藥品或信息組隔開增加視覺層次感和可讀性。3. 交互優(yōu)化減少輸入盡可能提供選擇器而不是文本框。例如服藥時(shí)間用TimePickerDialog劑量可以用下拉選擇“1片”、“2片”、“半片”等。明確的反饋任何操作點(diǎn)擊、長按都要有即時(shí)反饋如按鈕的顏色變化、輕微的震動(dòng)performHapticFeedback或簡短的提示音。避免手勢操作盡量不要依賴左滑刪除、長按編輯等隱藏手勢。為每個(gè)項(xiàng)目提供明顯的“編輯”和“刪除”按鈕。語音輸入輔助在輸入藥名時(shí)可以啟用麥克風(fēng)圖標(biāo)調(diào)用系統(tǒng)語音識(shí)別方便不擅長打字的用戶。一個(gè)簡單的藥品列表項(xiàng)布局示例!-- item_medicine.xml -- androidx.cardview.widget.CardView android:layout_widthmatch_parent android:layout_heightwrap_content app:cardElevation4dp android:layout_margin8dp LinearLayout android:layout_widthmatch_parent android:layout_heightwrap_content android:orientationvertical android:padding16dp TextView android:idid/tvMedicineName android:layout_widthwrap_content android:layout_heightwrap_content android:textSize24sp !-- 大字體 -- android:textStylebold android:textColorcolor/primary_text_dark tools:text阿司匹林腸溶片 / TextView android:idid/tvMedicineDosage android:layout_widthwrap_content android:layout_heightwrap_content android:textSize20sp android:layout_marginTop8dp android:textColorcolor/secondary_text_dark tools:text劑量一次一片一日三次 / LinearLayout android:layout_widthmatch_parent android:layout_heightwrap_content android:orientationhorizontal android:layout_marginTop12dp !-- 大而明顯的操作按鈕 -- Button android:idid/btnEdit android:layout_width0dp android:layout_height60dp !-- 高觸摸目標(biāo) -- android:layout_weight1 android:layout_marginEnd4dp android:textSize18sp android:text編輯 android:backgroundTintcolor/colorPrimary / Button android:idid/btnDelete android:layout_width0dp android:layout_height60dp android:layout_weight1 android:layout_marginStart4dp android:textSize18sp android:text刪除 android:backgroundTintcolor/colorAccent / /LinearLayout /LinearLayout /androidx.cardview.widget.CardView4. 關(guān)鍵業(yè)務(wù)流程與代碼實(shí)現(xiàn)串聯(lián)4.1 從添加藥品到設(shè)置提醒的完整流程讓我們串聯(lián)起一個(gè)核心用戶旅程用戶添加一種新藥并設(shè)置提醒。1. 添加藥品界面 (AddMedicineActivity/ViewModel):用戶輸入藥名、劑量并點(diǎn)擊“設(shè)置提醒時(shí)間”。這里我們跳轉(zhuǎn)到一個(gè)專門設(shè)置時(shí)間的界面或者使用底部彈窗BottomSheetDialogFragment來添加多個(gè)時(shí)間點(diǎn)。2. 數(shù)據(jù)保存與鬧鐘設(shè)置當(dāng)用戶在時(shí)間設(shè)置界面點(diǎn)擊“保存”后我們需要做兩件事將藥品存入數(shù)據(jù)庫并為每個(gè)設(shè)置的時(shí)間點(diǎn)安排鬧鐘。// AddMedicineViewModel.kt class AddMedicineViewModel(private val medicineRepository: MedicineRepository) : ViewModel() { fun saveMedicine(medicine: Medicine, reminderTimes: ListLong) { viewModelScope.launch { // 1. 將藥品存入數(shù)據(jù)庫并獲取自動(dòng)生成的ID val newMedicineId medicineRepository.insertMedicine(medicine) // 2. 為每個(gè)提醒時(shí)間設(shè)置鬧鐘 reminderTimes.forEach { triggerTime - // 計(jì)算下一次觸發(fā)的時(shí)間戳如果設(shè)置的是每天08:00需要計(jì)算出下一個(gè)08:00的具體時(shí)間戳 val nextTriggerTime calculateNextTriggerTime(triggerTime) ReminderScheduler.scheduleReminder( context getApplication(), medicineId newMedicineId, medicineName medicine.name, triggerTimeMillis nextTriggerTime ) // 3. 可選將提醒時(shí)間關(guān)系也存入數(shù)據(jù)庫用于界面展示和下次計(jì)算 medicineRepository.insertReminderSchedule(newMedicineId, triggerTime) } } } private fun calculateNextTriggerTime(timeOfDay: Long): Long { // timeOfDay 是用戶選擇的“時(shí)分”轉(zhuǎn)換成的毫秒數(shù)從當(dāng)天00:00開始的偏移 val calendar Calendar.getInstance().apply { timeInMillis System.currentTimeMillis() set(Calendar.HOUR_OF_DAY, TimeUnit.MILLISECONDS.toHours(timeOfDay).toInt()) set(Calendar.MINUTE, (TimeUnit.MILLISECONDS.toMinutes(timeOfDay) % 60).toInt()) set(Calendar.SECOND, 0) set(Calendar.MILLISECOND, 0) } // 如果設(shè)置的時(shí)間已經(jīng)過了今天就設(shè)置為明天 if (calendar.timeInMillis System.currentTimeMillis()) { calendar.add(Calendar.DAY_OF_YEAR, 1) } return calendar.timeInMillis } }3. 主界面展示今日計(jì)劃 (MainActivity/ViewModel):主界面使用RecyclerView展示藥品列表或者更友好地展示一個(gè)“今日服藥計(jì)劃”時(shí)間線。這需要查詢數(shù)據(jù)庫并篩選出今天有提醒的藥品。// MainViewModel.kt class MainViewModel(private val medicineRepository: MedicineRepository) : ViewModel() { // 使用StateFlow來驅(qū)動(dòng)UI更新 val todaySchedule: StateFlowListTodayScheduleItem medicineRepository.getTodaySchedule() .stateIn( scope viewModelScope, started SharingStarted.WhileSubscribed(5000), initialValue emptyList() ) } // TodayScheduleItem 是一個(gè)數(shù)據(jù)類包含了藥品信息和對應(yīng)的下一個(gè)提醒時(shí)間 data class TodayScheduleItem( val medicine: Medicine, val nextReminderTime: String, // 格式化后的時(shí)間如“08:00” val isTaken: Boolean // 今天是否已服用 )4.2 通知交互與狀態(tài)更新當(dāng)提醒通知彈出用戶點(diǎn)擊“已服用”按鈕時(shí)需要完成以下邏輯1. 處理“已服用”點(diǎn)擊我們在ReminderReceiver中為“已服用”按鈕設(shè)置的PendingIntent應(yīng)該指向一個(gè)服務(wù)如IntentService或另一個(gè)BroadcastReceiver用于在后臺(tái)處理邏輯。// TakenActionService.kt class TakenActionService : IntentService(TakenActionService) { override fun onHandleIntent(intent: Intent?) { intent?.let { val medicineId it.getLongExtra(medicine_id, -1L) if (medicineId ! -1L) { // 1. 在數(shù)據(jù)庫中插入一條服藥記錄 val record MedicineRecord( medicineId medicineId, takenTime System.currentTimeMillis(), isTakenOnTime true // 因?yàn)槭屈c(diǎn)擊通知服用的算準(zhǔn)時(shí) ) // 使用Room需要在協(xié)程或線程中執(zhí)行 runBlocking { AppDatabase.getDatabase(this).medicineRecordDao().insert(record) } // 2. 取消當(dāng)前藥品的本次提醒鬧鐘避免重復(fù)提醒 // 我們需要知道是哪個(gè)具體的鬧鐘被觸發(fā)這需要我們在設(shè)置鬧鐘時(shí)保存requestCode // 這里簡化處理取消該藥品所有今天的鬧鐘并設(shè)置明天的鬧鐘 cancelAndRescheduleReminder(medicineId) // 3. 更新通知可選將當(dāng)前通知內(nèi)容改為“已服用”或者直接取消通知 val notificationManager NotificationManagerCompat.from(this) notificationManager.cancel(medicineId.toInt()) } } } }2. 處理“稍后提醒”“稍后提醒”的邏輯相對簡單就是取消當(dāng)前鬧鐘并重新設(shè)置一個(gè)10分鐘后的新鬧鐘。// 在ReminderScheduler中新增一個(gè)方法 fun scheduleSnooze(context: Context, medicineId: Long, medicineName: String, delayMinutes: Int) { val triggerTime System.currentTimeMillis() TimeUnit.MINUTES.toMillis(delayMinutes.toLong()) scheduleReminder(context, medicineId, medicineName, triggerTime) }5. 開發(fā)中常見問題與調(diào)試技巧5.1 AlarmManager不觸發(fā)或不準(zhǔn)時(shí)這是開發(fā)提醒類應(yīng)用最常見的問題。問題鬧鐘到了時(shí)間沒響。排查步驟檢查PendingIntent確保PendingIntent的requestCode是唯一的。如果兩個(gè)鬧鐘使用了相同的requestCode和PendingIntent后設(shè)置的會(huì)覆蓋先設(shè)置的。使用(medicineId, time)組合生成唯一碼。檢查觸發(fā)時(shí)間triggerTimeMillis必須是基于RTC_WAKEUP或ELAPSED_REALTIME_WAKEUP的正確時(shí)間戳。用Log.d()打印出你計(jì)算出的時(shí)間戳和當(dāng)前時(shí)間戳進(jìn)行對比。檢查廣播接收器確保ReminderReceiver在AndroidManifest.xml中正確注冊。receiver android:name.receiver.ReminderReceiver android:enabledtrue android:exportedfalse / !-- 通常不需要導(dǎo)出 --檢查Doze模式Android 6.0的Doze模式會(huì)延遲網(wǎng)絡(luò)和CPU活動(dòng)。使用setExactAndAllowWhileIdle()可以突破部分限制但仍有最小間隔??梢栽谠O(shè)置中為你的應(yīng)用關(guān)閉電池優(yōu)化需要引導(dǎo)用戶操作。使用adb命令調(diào)試在終端輸入adb shell dumpsys alarm可以查看系統(tǒng)當(dāng)前所有的鬧鐘設(shè)置檢查你的鬧鐘是否在其中以及下一次觸發(fā)時(shí)間是否正確。5.2 后臺(tái)限制與通知不顯示問題應(yīng)用在后臺(tái)或被清理后通知不出現(xiàn)。解決方案確保通知渠道已創(chuàng)建在App啟動(dòng)時(shí)如Application的onCreate或主Activity創(chuàng)建通知渠道。前臺(tái)服務(wù)?;顚τ诳煽啃砸髽O高的場景可以考慮在觸發(fā)提醒時(shí)啟動(dòng)一個(gè)前臺(tái)服務(wù)。前臺(tái)服務(wù)會(huì)有一個(gè)常駐通知告訴用戶應(yīng)用正在運(yùn)行提醒功能。但這會(huì)消耗更多電量需要權(quán)衡。引導(dǎo)用戶設(shè)置在應(yīng)用內(nèi)友好地提示用戶將你的APP加入“白名單”或“不受電池優(yōu)化限制”的列表。這可以通過Intent跳轉(zhuǎn)到系統(tǒng)的電池優(yōu)化設(shè)置頁面來實(shí)現(xiàn)。val intent Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS) intent.data Uri.parse(package:$packageName) startActivity(intent)5.3 數(shù)據(jù)庫操作導(dǎo)致主線程阻塞或UI卡頓問題在主線程執(zhí)行Room的插入、查詢操作導(dǎo)致應(yīng)用無響應(yīng)ANR。黃金法則永遠(yuǎn)不要在UI線程執(zhí)行數(shù)據(jù)庫操作正確做法使用協(xié)程Coroutines在ViewModel或Repository層使用viewModelScope.launch或CoroutineScope(Dispatchers.IO).launch來執(zhí)行掛起suspend的DAO操作。使用返回Flow的查詢Room支持DAO方法返回FlowT。在ViewModel中收集這個(gè)Flow并更新到StateFlow或LiveDataUI通過觀察這些數(shù)據(jù)容器來更新。這樣數(shù)據(jù)庫查詢會(huì)在后臺(tái)線程自動(dòng)進(jìn)行。// 在ViewModel中 init { viewModelScope.launch { medicineRepository.getAllMedicinesFlow().collect { medicineList - _uiState.value uiState.value.copy(medicines medicineList) } } }5.4 應(yīng)用被殺死后數(shù)據(jù)與鬧鐘的恢復(fù)問題用戶強(qiáng)制停止應(yīng)用或重啟手機(jī)后之前設(shè)置的鬧鐘失效。解決方案監(jiān)聽設(shè)備重啟廣播并在應(yīng)用再次啟動(dòng)時(shí)重新設(shè)置所有鬧鐘。在AndroidManifest.xml中注冊一個(gè)監(jiān)聽BOOT_COMPLETED廣播的接收器。uses-permission android:nameandroid.permission.RECEIVE_BOOT_COMPLETED/ receiver android:name.receiver.BootReceiver android:enabledtrue android:exportedtrue intent-filter action android:nameandroid.intent.action.BOOT_COMPLETED / action android:nameandroid.intent.action.QUICKBOOT_POWERON / !-- 部分廠商 -- /intent-filter /receiver在BootReceiver的onReceive中從數(shù)據(jù)庫讀取所有有效的服藥計(jì)劃并重新調(diào)用ReminderScheduler.scheduleReminder為每個(gè)計(jì)劃設(shè)置鬧鐘。同樣在應(yīng)用主Activity啟動(dòng)時(shí)例如在MainActivity的onCreate中也可以執(zhí)行一次鬧鐘恢復(fù)邏輯以應(yīng)對應(yīng)用被系統(tǒng)意外終止的情況。5.5 針對老年人的測試要點(diǎn)字體縮放在手機(jī)設(shè)置中調(diào)大系統(tǒng)字體測試你的APP布局是否會(huì)錯(cuò)亂、文字是否被截?cái)?。屏幕閱讀器開啟TalkBackAndroid內(nèi)置屏幕閱讀器測試所有按鈕和文本是否都有合理的contentDescription能否通過滑動(dòng)和雙擊順利操作。顏色反轉(zhuǎn)/高對比度模式開啟這些輔助功能檢查你的UI是否仍然清晰可辨。真實(shí)場景模擬將手機(jī)放在一邊等待鬧鐘觸發(fā)。觀察通知的醒目程度是否容易被忽略鈴聲和震動(dòng)是否足夠。嘗試在嘈雜環(huán)境中測試。開發(fā)這樣一個(gè)APP技術(shù)實(shí)現(xiàn)只是基礎(chǔ)更重要的是對特定用戶群體的深刻理解和關(guān)懷。每一次代碼編寫和界面設(shè)計(jì)都要問自己“我的爺爺奶奶能用得順手嗎” 這個(gè)過程讓我深刻體會(huì)到好的軟件不僅是功能的堆砌更是用戶體驗(yàn)的打磨。這份畢業(yè)設(shè)計(jì)源碼和說明希望能為你提供一個(gè)扎實(shí)的起點(diǎn)你可以在此基礎(chǔ)上增加更多貼心的功能比如用藥歷史統(tǒng)計(jì)圖表供子女查看、與智能藥盒的藍(lán)牙連接等讓它變得更加完善和實(shí)用。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
九九综合久久| 久草国产在线视频| 手机看片1025| 天美传媒在线一区| 国产不卡免费在线视频| 美女97超碰| 婷婷丁香人妻| 人妻中文字幕日韩电影| 91高清日| 久久亚洲AV成人精品无码| 青青草视频爽一爽| 天天做天天爱| 人妻天天爽夜夜爽爽| 97这里有精品| 日本狠狠干| 台湾佬中文娱乐网久久久久久久久久com | 欧美淫乱视频| 国产AV激情无码久久无码| 欧洲乱码一区二区| 九九九九热| 91大学精品激情戏| 男人天堂毛片| 日日狠狠久久偷偷色综合免费| 玖玖大干人妻| 成年女人18级毛片毛片免费观看| 欧美淫乱视频| 91N欧美| 夜夜欢天天干| 一区二区三区 丝袜 高跟 美腿| 夜夜骑日日| 日本色色色视频| 中文字幕神马久久| 国产高清在线观看欧美| 射丝袜大香蕉| 久久久一级| 91操熟女| 天天综合网91入口| 伊人久久大香线蕉无码| 91精品免费| 天天色播亚洲综合网站| 久久久免费高清中文视频| 國產尤物AV尤物在線觀看| 在线色资源| 在线国产探花| 一二三区操逼国产91| 97蜜桃综合| 国产毛片片精品天天看视频| 欧美一区二区三区大综合| 五月丁香六月综合缴清无码| 色在线69堂| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 亚州综合色图| 全球成人中文在线| 女人综合网| 蜜桃中文字日产乱幕4区| 人人干黄色| 97精品国产精品免费观看| 高清成年美女黄网站免费大全| 精品一二三区四视频| 日本www操操操| 99少妇| 青娱乐av在线| 日韩成人精品视频自拍| 国产熟女自拍| 黑人性欧美| 日本免费一级AAA大片器| 婷婷五月天成人网| 2019男人的天堂| 把腿张开老子CAO烂你| 大香蕉琪琪日本女优不卡| 萌白酱自拍视频| 欧美色院| 人人操天天爽| av在线资源| 神马久久久久久久| 麻豆a'v电影| 亚洲精品视频二区| 欧美一级久久久丰满| 精品久久久一本一道| 国产精品久久久视频| 韩国黄片aaaa| av网站免费看| 97 国产精品| 香蕉一区二区三区在线视频| 国产黄色 A 片免费看| 超碰九区| 久久精品中文字幕女同| 九九热免费国产视频婷婷伊人| 性爱视频无打码在线观看| 亚洲欧美天| 快点操死我| 黄色性爱网网| 一区二区三区黄色片a| 怡春院久久| 亚洲Av噜噜一区二区三区妖精| 91狠狠综合久久久| av在线免费一区二区| 欧美78P| 天天插天天操天天摸天天射天天看| 免费观看有码高清视频| 性爱av网站| 波多野结衣之双飞调教在线播放| 新91视频.cmp| 91亚洲丝袜| 国产久久一区二区三区野外在线| 亚洲一区日韩| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 亚洲精品国产无码高清| 欧美亚洲激情| 78久久| 素人伊尹大香蕉免费下载视频| 亚洲情色1区| 超碰在线91| 无码黑人精品一区二区三区三| w w w.久久精品| 天天影视综合色| 久久久久9| 欧美熟女妇同| 亚洲欧美中日韩| 男人的天堂网免费| 婷婷导航| 亚洲各类熟们中文字幕| 婷婷午夜成人色中色| 视频国产欧美在线播放| 一级婬片120分钟试看| 伊人九九九| 春色综合免费| 老熟妇综合| 99999久久久久9国产精品| 五月激情影院| 一区二区三区在线资源| 激情四射五月天| 国产精品视频白浆免费| 操比国产| 97久久视频| 人人考人人摸人人干| 国产区性爱在线视频秋霞豆| 成人午夜视频免费播放| 五月天婷婷基地| 婷婷在线视频| 日本91白丝| 亚洲激情网一二三四区| 伊人网在线视频| 丁香六月婷婷久久综合| 尤物黄色在线观看网站| 日本综合色图| 混色激情av| 亚洲情色婷婷五月天| 天天干美少妇一区| 亚洲情色电影网| 国产馆极品诱惑| 色妹子A V| 67194无码不卡| 久无码| 九一综合精品视品av| 大香蕉十区| 色诱avtt| 亚洲一区制服诱惑| 9久久久久久| 东京热男人天堂| 四虎精品永久在线播放| 免费福利视频中文字幕| 伊人黄色视频免费观看| 亚洲黑丝在线| 蜜桃色院一区久久| 中文字幕免费看| 国内精品久9| 黑人性欧美| 超碰97欧美| 日本性感人妻91| 欧美日韩国产三级黄色| 日韩有码免费视频| 人妻酒店出差被中出免费在线播放| 国产人妻精品一区二区三区秋霞| 国产一线二线三线av| 九九九久久久| 天天天天天天天天天天干美女| 97人人模人人爽人人| 欧美综合骚| 青青草在线视频欧美| 丝袜狂射91| 亚洲欧美97| 日本人妻丰满熟妇久久久久久| 日本成人A片免费看| 日韩另类| 日韩美女高潮喷水视频| 亚洲精品九九九| 超碰精品日韩欧美国产| 国产精品无码在线| 久久侵犯人妻爽爽爽| 九九热免费国产视频婷婷伊人| WWW.加勒比人妻一区不卡.com| 久久久久久裸体| 国产日韩久久| 女同性恋久久| 美女91在线观看| 淫纸中9区| 日本黄大片在线观看视频| 黄片无码在线制服| 神马久久啊啊| 中文操逼字幕| 被体育老师抱着c到高潮| 九九久久久九九| 免看60秒涩涩视频| 少妇久久久| 美国一区二区免费视频| 中文字幕片| 美女黄色91| 岛国大片国产| 丝袜综合| 国产无马在线| 欧美天堂在线| 久久亚洲精品成人av| 99蜜桃臀亚洲成人在线观看| 日韩免费在线视频观看| 美腿丝袜高跟网免费视频免费视频| 午夜精品久久久| 丁香六月婷婷久久综合| 天天cao在线| 亚洲另类电影| 97碰碰色| 高清不卡一二三区视频......| 欧美碰碰综合色| 天天综合色| 中文字幕三四五区| 任我爽视频在线观看| 日韩在线国产字幕| 啊啊啊97视频| 伊人激情| 欧美精品三级黄片| 久久久久久久久久久久久久久久9| 国产精品麻豆成人av| 久久超碰98| 欧美性爱日韩性爱| 女人的天堂大香蕉网| 尤物网址| 人妻另类| 欧美少妇第一页| 99re热有精品视频国产| 日韩丨制服丨中文|在线| 亚洲欧美日韩夜夜| 78久久| yazhousetuoumei| 成人性爱免费播放| 亚洲人久久久网| 乱色视频中文字幕| 亚洲高清无毛一区二区| 九九亚洲色在线观看| 99精品久久| 熟妇人妻精品一区二区| 97青青操视频| 成人一道本免费视频| 啊嗯好大视频在线观看| 自拍偷拍 日韩无码| 日本在线伊人啪啪| 四季AV一区二区凹凸精品小说| 91成人在线免费视频| 清纯唯美亚洲另类| 超碰在97| 91网亚洲| 91粉芽高清在线一区二区| 午夜视频久久久久一区| 欧美激情精品久久久久久| 久久超碰、| 午夜黄色免费在线观看| 久久黄片国产一区二区| 丰满欧美放荡少妇在线| 蜜桃久久久久久| 国产福利小视频高清在线观看| 99re99| 91美女看B| 亚洲va综合va国产va中文| 97干天天| 日韩乱插| 视频在线中文字幕| 欧美特大AA级黄片| 亚洲AV无线| 99ri精品| 国产亚洲日韩在线三区黑人| 久久久久久久九九九九| 九九热精品视频六| 人人摸人人舔一区二区| 天天影视射综合网| 久久蜜色情在线视频xxx免费观看| 五月婷婷性爱| 欧美日韩性爱操大逼| 一区AV| 狠狠爱大香蕉| 人妻丰满熟妇av无码区蜜桃| 国内外毛片在线观看| 超碰99热中文字幕| 久久久久9| 无码天天操| 女人精品内射国产99| 天天综合~91| 久久大香蕉手机高清视频| 日本123区操B视频| 黄色高清无码无码破解免费暗网| 久久久久亚洲?V片无码V| www久久国产精品| 国产精品一区二区密臀| 992大香蕉| 综合网亚洲1| 色亚州人久干视频在线观看免费版| 97超碰热线| 人人喜人人妻| 免费看污网站| 美女高潮视频91| 欧美日日网| 色婷婷丁香五月| 亚洲AV无码成人精品久久| 又大又长又粗又爽又黄| 亚洲国产精品无码AV在线| 97资源视频| 国产丝袜欧美在线视频| 国产精品点击进入在线影院| 日本免费中文字幕在线| 操逼操逼逼操操逼91| 日韩成人高清一区二区| 中文字幕精品一区二区精| 久久久亚洲高清不打码| 家庭乱伦性爱av| 国产精品色片一区二区| 97人人模人人爽人人| 九九色逼| 91蜜臀在线久久久久| 青青欧美在线| 亚洲色图欧美另类在线| 青青草中日韩在线| 精品少妇一区二区| 女人精品内射国产99| 翔田千里A片一区二区| 强奸乱伦AV一天堂网| 成人性爱AV在线免费观看| 奇米四色网| 成人乱人伦一区二区| 日韩欧美tv一区二区在线观看| 无码av永久免费专区网站| 中日韩欧美精品无码AⅤ一区二区| 国产综合操逼高清| 91超碰人人| 97色涩| 大香蕉日亚洲日本亚大| 校园春色 欧美| 国产亚洲深夜激情| 日韩女模中文造逼| 青娱乐蜜桃臀AV色婷| 国产熟妇一区二区| 深夜激情| 久久 国产 无码| 久久久亚洲高清不打码| 亚洲色五月| 96精品久久久久中文字幕| 亚洲日产专区婷婷| 亚洲无码精品AV久久久| 国产动漫操逼视频| 蜜臀少妇一区二区| 国产精品第二页| 超碰九九| 一级特级aaaa毛片免费观看 | 91九久| 久久骚少妇| 色婷婷日韩精品一区二区三区| 亚洲欧美黄| 国产精品无码av嫩草| 又黄又爽在线观看视频| 日韩精品一区,二区 九九...老司机| 欧美色性情| 日日操丁香五月天| 人妻日日夜夜精品| 9美女超碰在线免费观看| 一级做a爰片性色毛片久久| 色综合久久88色综合久久天天| 亚州少妇| 欧美色图99| 无码操逼视频一下| 99青草| 天天操天天干美女网址导航| 98人妻精品一区二区色欲| 色综合色综合网| 欧美页片| 亚洲情欲| 亚洲激情在线| 90后后入| 天天躁日日躁XXXXYY| 欧美久久婷婷| 午夜男女爽爽大片免费观看| 五月天春色激情网| 久久岛国| 天天操天天插| 性猛交| 在线另类| 东京热91| 91久久久久久| 96精品久久久| 天天躁日日躁AAA片李宗瑞| 夜精品久无码| 芊芊操逼视频无码| xxx亚洲午夜天堂| 91亚洲人| 熟女人妻av在线资源,黄色的资源| 疯操AV| 国产精品久久久久综合| 青青草在线视频播放器| 91free福利| 性欧美| 国产精品久久久鸭无码的功能| 91精品久久久久久久久久| 黄片国产精品一区二区| 国产25页| 嫖老熟女A片一二三区| 久久精品国产久精国产| 国产强奸超碰AV| 十八禁电影伊人网| 午夜色婷婷| 78超碰| 婷婷色一区| 亚洲少妇在线观看| 不卡超碰护士AV在线免费播放| 97欧美视频| 国产大片精久久久久久| 日韩性爱视频在线免费观看| 久久99草| 色狠狠综合| 9 1果冻精品视频| 大香交伊人网| 麻豆视频国产一区二区| 亚州欧美总和| 欧美一级色| 大香蕉狠狠爱| 精品一久久久| 色九区| 啪啪视频免费在线观看| 欧美综合在线91| 人人干人人操人人..com| 九九热re99re6在线精品| 伊人亚洲国产一成人久久精品,久久| 久草加勒比一区在线| 国产超碰在线一区| 国产成人bd在线观看| 啊啊啊好大好深| 91在线美女| 在线无码视频| 91欧美色| 久久只有精品一区二区三区| 国产情侣自拍在线播放| 精品视频一区二区| 视频黄站| 国产夜夜艹| 夜夜影视四色| 69视频入口| 亚洲欧美日韩中文久久自慰| 乱人伦 国语对白:视频直接看| 欧美 精品国产制服第一页| 色综合加勒比四四季| 日韩探花精品在线视频| 亚洲一区二区三区在线激情| 精久久久| 国产超碰在线一区| 大香蕉AV在线| 一区二区三区探花在线观看| 熟女人妻精品一区二区视频| 久久高清无码夜夜操| 久久99操天天日| 强奸乱伦大香蕉| 天天伊人| 麻豆一区二区三区在线看| 伊人久久大香蕉线AV五月天| 国内91熟女人妻丝袜天天精品视频在线| 国产成人自拍视频视频| 亚洲牲交| 男人综合网| 五月天久久婷婷亚洲 | 亚洲欧美日韩制服另类| 色偷偷人人玩人人舔人人操人人摸人人爽| 性感女人网页在线观看视频| 久久综合九九| 激情视屏国产乱伦强奸| 高清国产成人无码| 日本加勒比无码专区| 果冻传媒一区二区三区| yy少妇精品久久| 超碰99热中文字幕| 我爱大香蕉| 99久久久无码国产精品性男| 综合久久久久久久综合网| 精品一区二区三区麻豆| 日本一二三免费久久| 尤物视频偷拍免费| 九九九草| 97超碰色中文字幕| 99热日| 97这里只精品| 国产精品久久久999| 超碰97男人| 久久综合日韩亚洲欧美| 四虎永久在线精品免费网址| 天天操夜夜操| 婷婷色婷婷| 日韩啪啪视频| 亚洲综合在线视频| 婷婷五月天基地| 色色99| 青青草中文-久久青草精品一区二区三 | 91 国产丝袜在线放观看| 久久久精品国产亚洲伊人| 大香交伊人网| 亚洲黑丝在线| 天天干天天日天天射黄色大片| 日韩美女久久一区二区三区| 日本三级小说中文字幕| 蜜桃久久久久久久| 精品人妻夜夜草| 久久99手机免费视频| 精品97精品97| 欧美最大综合网| 天天操福利视频综合网站| 香港久久久| 中文字幕成人乱码熟女精品国50| 91啪啪| 亚洲AV麻豆Aⅴ无码电影一| 亚洲国产成人7777| 郑州宾馆老熟女露脸啪啪| 在线观看日韩av不卡| 国产亚洲精品自在线亚洲情侣| 开心五月婷婷激情| 久久香蕉国产传媒一区剧情天美| 亚洲做性| 高清国产av无码| 91在线美女| 亚洲97在线| 试看日韩黄片| 久久久亚洲熟妇熟女| 91肉丝| 涩综合导航| 成人三一级一片aaa| 人妻99p| 天天综合AV| 美女毛片999| 男人的天堂三级| 操碰97| 91色图| 国语精品内射在线观看| 五月婷婷色色| 欧美亚洲AN| 黑人在线91| 激情抓乳插进去啪啪啪日韩| 国产精品青草综合久久| 伊人国产av| 本道在线| 91P0RNY大屁股人妻| 凸凹视频在线观看| 欧美内射少妇| 欧美伊人电影| 国产亚洲日韩在线三区黑人| 狠狠中文字幕| 欧美日韩97在线| 久久久久亚洲Av无码专区老牛影视| 精品日韩人妻视频| 日韩精品 资源| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 精品久久久久9999| 精品少妇一区二区三区| 国产9 9在线 | 亚洲| 日本天天操| 天天操天天7| 日日干天天干夜夜爽| 久/久精品99看9| 色眯眯av| 中文字幕精品一区欧美| 色妺妺在线视频| 天美传媒精品久久视频| 日韩乱伦影音先锋| 91美女视频在线| 好色综合| 五月天婷婷成人网| 男女香蕉一区二区| 亚洲精品毛片在线观看| 福利风月五月天影院| 超碰97伊人| 性做久久久久久免费观看软件| juliaann丝袜大战黑鬼| www.av家庭乱伦| 国产女人高潮视频| 欧美综合色,www| 九九性爱网| 亚洲国产蜜臀系列在线观看| 国产免a费看黄片在线| 日本精品国产视频| 牛牛AV人人夜夜澡人人爽| 色综合久久久久| 人人操超碰在线| 亚洲精品一区二区三区在线播放| 亚洲日韩乱码中文无码蜜桃臀网站 | 日本人体九九九九九九| 亚洲熟女诱惑| 婷婷五月天成人网| 亚洲欧美视| 最近2019中文字幕国语免费版| 亚洲自拍欧美色综合| 在线国产福利网址导航 | 超碰成人公开| 99精品久久久久久| 国产精品无码AV网站| 欧美最大综合网| 囯产操逼片| 亚洲狠狠入| 99re国产中文字幕| 欧美不在线| 国产超碰国产97| 成人毛片免费| 中文字幕天天操| 伦伦成年午夜免费视频| 后入式999| 91精品黄在线观看| 久久免费少妇| 99精品热| 人妻aa| 亚洲天堂一二| 花野真衣| 亚洲色图91| 亚洲吊色| 粉嫩在线一区二区懂色| 九七色图| 97久久免费| 日韩欧美国产高清视频| 天天干人人乐| 婷婷情色五月天| 日本一区二区不卡精品| 日日躁夜夜躁狠狠躁超爽| 欧美一级三级| 久久性爱精品一区| 久久国产精品视频| 婷婷久久综合久| 亚洲一区在线观看欧洲 | 国产成人精品亚洲日本| 日韩欧美加勒比| 亚洲自拍一区夜夜操| 少妇滛荡视频| 日韩日本欧美在线观看| 久久久9 9 9精品| 久草精品热视| 影音先锋中文字幕日本好一区二区| 99re99在线视频| 精品人妻一区二区免费蜜桃| 首页中文字幕中文字幕免费| 91综合在线| 人妻大香蕉| 欧美在线色图| 超碰99在线| 黑人狂躁日本妞一区二区三区| 久久久国产护士丝袜美腿一| 青青草在线视频人人想人人上| 99久久精品国产高潮| 一起草高清无码| 欧美色图亚洲色,麻豆| 96AV久久久| 中文字幕在线高清男人的天堂 | 偷拍综合亚洲| 亚洲精品97在线| 欧美日韩精品一区二区三区高清| 久久久新亚洲AV| 性色高清..……| 操b网站亚洲无码| 久久曰曰| 天天做日日爱夜夜爽| 欧美精品久久96人妻无码| 91模特在线观看| 欧美嫩性色| 日韩去日本高清在| 亚洲国产婷婷在线播放| 一级做受视频免费是看美女| 欧综合网| 91久热| 亚洲精品不卡一二三区| 伊人97色天使| 国产超碰国产97| 18禁超污无遮挡无码免费网| av在线观看不卡网站| 视频不卡中文字幕| 99999久久精| 久久久三区二区一区| 欧美日韩婷婷中文| 欧美三级不卡| 国产欧美伊人| 91久久精品蜜臀| 丁香五月大香蕉| 婷婷色播婷婷| 99热在线播放| 婷色五月| 九九热在线精品视频| 久久精品美女一区| 国产三级电影免费观看| 无码人妻丰满热妇又大又粗| 国产高清26uuu| 天天草夜夜草高潮片| 欧美日韩黄片精品在线| 欧美十八禁视频| 天天上日日上日韩精品| 天天射天天操天天干天天吃2018| 性综合网| 色吧5亚洲| 一道本东京热加勒比一区二区三区| 美中日韩无码| 亚洲蜜乳av| 欧美人体性爱互联网第一页婷婷日本| 欧美亚洲激情一二三| 中文字幕狠狠玩| 日韩欧美传媒一区国产| 亚洲情色视频| 中文字幕一区二区视频在线观看 | 伊人久久国产免费观看视频| 青青草啪啪网| 九热超碰| 一区二区不卡视| 岛国免费视频在线| jk白丝没脱就开始啪啪| 黄片直播三级黄片两女一男| 9+1视频网址| 精品人人| 日韩无码AB| 91亚.色| 亚洲精品黑丝| 中文字幕成人乱码熟女精品国50| 久久精品人妻一区| 成人性爱AV在线免费观看| 日韩操逼HD| 免费操逼视频下载| 九九九九九九九精品视频| 18精品一区| 亚洲综合射| 欧美日韩狠狠爱| 囯产精品久久久久久久久久梁医生 | 夜色综合| 亚洲日本激情| 尤物一级在线免费观看| 丁香五月激情综合国产| 久久久艹艹艹| 欧洲自拍色图gif在线| 高清无码人妻久久久一区二区三区aⅴ| 欧美成熟性爱精品| 亚洲综合在线视频| 久久久111| 好色综合| 国产1769在线| 91视频成人福利网站在线一区| 久热这里| 日本成人A片免费看| AV中文在线可看| 天天干1区2区在线| 亚洲精品一区二区精品| 蜜桃视频精品一区二区| 亚洲熟女少妇免费视频| 一区二区三区亚洲| 四虎影库国产精品免费| 偷拍导航视频网站| 老司机老司机午夜影院| 九九久久国产精品| 综合另类| 久操大香蕉手机视频在线看 | 天美欧美国产| 久久大黄片| 色婷婷六月| 夜夜无码| 国产精点久久久成人| 日韩欧美被操黄免费观看| 69天堂| 青青草中文-久久青草精品一区二区三| 欧洲亚洲人人爽爽视频| 麻豆综合一区av| 中文字幕91综合| 亚洲人妻精品一区二区| www.色综合| 欧美日韩系列| 亚洲色图欧美视频| 搡老熟女国产1000部| 丁香六月激情| 级品肉射| 国产精品亚洲无码| 磁力99AV| 欧美一区二区日韩三区| 色哟哟-国产专区| 亚洲无码视频免费在线观看网址!| 欧美男人一区| 欧美资源| 宅男91视频在线播放| 97精品网| 97国产精品国| 超碰在线人妻中文字幕| 国产精品午夜成人福利| 91一区二区三区蜜桃| 精品久久久久黄少妇| A级片日韩欧美国产欧美视频精选观看 | 精品三级在线专区| 日韩久久超碰色| 熟女激情综合网| 97精品第3页| 久久社区一区二区三区| 99热国产| 国产亚洲色婷婷久久99精品91| 日天天九九天堂666| 91在线页| 操操逼视频| 超碰97在线中文| 欧美综合区| 日本一区二区三区四区五区六区七区八区九区| 夜夜爽爽爽| 白丝被操91| 日本高清熟女久久一区| 91人妻Pr| 91丨人妻丨国产丨丝袜| 99九九久久| 国产精品成人蜜臀AV在线| 啊啊啊啊免费视频| 有码人妻系列| 高清成年美女黄网站免费大全| 精品久久久一本一道| 亚码激情| 在线色导航| 97日韩欧美亚洲| 亚洲欧洲美腿丝袜| 国产精品一区二区校花| 精品丰满熟妇人妻一区| 又黑又大又粗| 一区二区影院| 久久中出| 丝袜色综合| 午夜天天碰综合视频| av网页一区二区三区| 日韩欧美女求操每天更新| 日日夜夜国产综合| 九月婷婷综合| 日韩激情毛片一级久久久| 无码九九| 亚洲色图欧美色图制服丝袜| 国产 丝袜 欧美中文 另类| 亚洲色图欧美激情| 本道在线| 麻豆福利视频导航| 亚洲激情网| 思思热免费在线视频| 亚洲激情视频| 天天天堂影视日韩亚洲91| 日韩99神马视频播放片在线播放| 久久精品国产亚洲AV高级北京| 97精品视频| julia ann久久| 青青草吊丝| 99热这里只有精品8| 日本三级一区二区 在线| 999久久久九九九九| 色偷偷人人玩人人舔人人操人人摸人人爽 | 国产色综合亚洲色综合吹潮| 男人的天堂99| 亚洲自拍青操视频| 九一精品牛牛一区二区| 91在线|亚| 天天插天天操| 高清无码 国产精品| 日韩精品资源专区二区| 手机在线大香蕉| 久久久久久无码人妻中文字幕| 青青草白白色| 97爱欧美| 九月丁香婷婷| 久久99热这里只频精品6学生| 久久激情亚洲精品无码?V| 亚洲av无码国产精品字幕| 久久精品熟妇丰满人妻99| 黑人性欧美| 热热色AV| 无码九九| 亚洲AV人人澡人人爱| 久久久久久9999| 亚洲美欧999| 国产精品视频电影| 狼人综合婷婷激情四射 | 91久久精品蜜臀| 亚洲超碰在线| 秋霞视频一区二区| 熟女视频久久| 国产精品99久久久www| 亚洲AV性爱电影| 国产Aα| 亚洲色系另类精品国产| 日韩簧片免费看| CCYY草草影院地址入口| 一级一性爱免费视频| 亚洲国产97| 夜夜爽夜夜操| 色欲av国内精品久久久久久| 亚洲天堂加勒比| 亚洲图片小说欧洲| 日本二三四区| 亚洲 在线| 操东北女人| 久久精品国产亚洲5555| 成人精品在线免费视频| 欧美色网| 中文字幕日韩电影人妻| 国产AV色黄看到爽| 操逼国产免费| 亚洲乱码尤物193YW| 妺妺跟我一起洗澡没忍住| 2024人人操人人摸| 欧美躁死她一区二区| 天天射网| 诱惑人妻欧美一区在线播放| 北条麻妃性愛视频| 久久久久久九九九九九九| 免费男人的天堂| 精品视频久久| 激情黄色片在线观看| 草莓精品视频在线免费观看| 久操网视频| 韩国一级婬片A片AAAAA| 男人的天堂亚洲| 亚洲美欧999| 亚洲色悠悠久久88| 亚洲双插| 人人操人人色网| 午夜福利激情在线视频| 99精品成人免费看| 一二三四日本视频高清| 黄呦呦在线| 99超碰网| 国产无码精品成人| 日va操| 夂久色| 最新精品久久蜜桃| 伊人网在线点播| 日本操逼无码| 久热香蕉精品在线视频| 久久极品伊人| 色色色色色色色色综合| 深夜视频| av在线不卡一区二区三区| 丁香五月久久| 性色国产东北露脸精品视频| 亚洲做性| 国产精品盗摄 偷窥盗摄| 妺妺跟我一起洗澡没忍住| 久久女人视频| 欧美精品不卡一二三四在线91| 中文字幕丰满人妻日本| 欧美少妇性爱网站| 亚洲情色婷婷五月天| 欧洲精品欧洲精品| 免费成人自拍视频在线| 亚洲一区二区性爱电影| 一区二区首页| 伊人网在线点播| 久综合国内精品自在自线| 99ri视频| 亚洲熟女乱色一区二区三区久久久 | 动漫av中文| 丰满人妻一区二区三区色-百度| 波多野结衣先锋影音| 国产精品老熟女一区二区| 操死我了啊啊啊| 看免费一级在线播放毛片| 亚洲高清在线| 人人操人人射人人干| 搡老熟女免费视频 | 成人精品一区二区91毛片不卡| 久久性视频| 色悠久久久av| 日韩一区二区精彩视频| 试看福利| 毛片久久| 男人天堂2019亚洲| av影院十区| 日韩无码AB| 亚洲情色在线| 91欧美亚洲| 五月色网| 天堂av最新电影网| 国产女人和拘做爰视频| 91在线美女| 久久高潮妇女视频| 操人91| 青青草视频在线观看一区二区| 特级大荫道BBwBBwBBW| 久久97视频| 在免费jIzzjIzz在线视频| 天天综合网1| 9国产超碰| 97精品一二区| 免费试看60秒| 国产乱码久久| 99re98| 九九无码| 日日不卡av| 操碰97| 大香蕉草草| 99久视频| 亚洲精品电影| 婷婷五月天激情小说| www男人天堂| 色色婷婷五月天| 四虎av在线| 人妻少妇久久久| 久久二| av优播| av网站免费看| 欧美色图片91| 日本欧美韩国国产在线| 亚洲一区二区专区-国产丝袜精品丝袜-成人AV| 国产自制av蜜乳| 国产视频一区二区三区久久亚洲天堂| 日韩欧美亚洲自拍偷拍| 中文字幕丝袜人妻| 操操逼视频| 91 亚洲情侣偷拍 久久| 国产三区免费在线观看| 影音资源男人日韩| 91久热| 欧美97爱| 麻豆九九九| 最新的亚洲无吗| 日曰骚久久精品| 美女露胸露屁股| 一级毛片久久久久久久女人18| 鸥美极品| 色婷婷小说| 精品视频在线观看精品| 1204av韩国| 精品国产www久久| 欧美激情高清性猛交| 日本有码影片下载 | 国产欧美后入| 一块操欧美性爱| 翔田千里AV无码秘 三区| 国产60区。| 日韩黄色一区二区三区| 少妇熟女一区二区三区| yazhousetuoumei| 欧美黄片欧美黄片xxx| 好爽视频在线观看| 色综合加勒比四四季| 丁香五月综合| 亚洲欧美情色| 亚洲天堂日本| 深爱五月天| 国产最新小视频在线播放下载| 日韩毛片9| 一二三啪啪专区| 国产福利av精彩对白| 神马久久久久久久| 中出后入| 99热亚洲天堂| 手机在线看片免费人成视频| 亚洲欧美天堂| 亚洲色棕合| 国产久久一区二区三区野外在线| 天堂中文资源在线bt| 亚洲天堂精品日韩电影| 人妻素股| 欧色综合| 九九伊人网| 无码黑人精品一区二区三区三| 九九九九九精品| 日本久久999| 欧美最婬乱婬爆婬性视频 | 黄片www.| 99久久精品欧美国产| 日韩欧视频| 加勒比伊人影院| 欧美有码亚洲中文字幕一区二区三区四区| 中日韩欧美精品无码AⅤ一区二区| 国产毛片片精品天天看视频| 91麻豆天美国产欧美高潮| 东北女人的毛片| 亚洲中文字幕噜噜噜久久久| 殴美大黄片| 欧美探花网| 夜夜骑夜夜操| 日韩无码第3页| 久久久内射良家| 色香在线| 嗯嗯啊啊操死我| www.色婷婷| 久久久 国产精品| 国产亚洲女v在线观看| AAAA欧美日韩| 超碰97护士| 传媒在线观看一区二区三区| AV久日| 亚码人妻| 操逼精品视频| 性色高清在线| 一二三啪啪专区| 久久天天摸| 婷婷五月天成人网| 日本岛国黄色网址| 亚洲综合精品国产一区| 免费一级黄色录像影片| 强奸乱伦 亚洲一区| 欧美色宗合| 91亚洲高清| 国产精品网址| 亚洲av资源| 久久婷婷成人综合色怡春院| 亚洲少妇自拍中文字幕懂色| 五毛骚逼极品美女怕怕| 久久超碰98| m欧洲一级午老| 99青青草国产视频| 九九英色视频| 三级网站超变态精品| 天天做天天爱天天爽AV| 国产福利夜| 综合网欧| 狠狠亚洲| 久久宗合亚洲| 中文字幕欧美日本乱码一线二线 | 国产性感在线观看| 有码人妻系列| 亚洲精品欧美专业| 九九九九日本| 国产精品第二页| 韩国国产欧美情侣视频在线| 亚洲熟久久| 久久中久文96| 99re视频在线播放青草| 日韩小电影| 日韩无码一级黄色av片| 呦呦影院| 免费精品中文字幕| 无码人妻丰满热妇又大又粗| 日韩精品在线观看网站| www激情| 玖色AV| 久久av网| 亚洲成人妻日韩在线| 91少妇通奸网站| 婷婷丁香人妻 | 自拍视频一区在线观看| 极品美女福利在线观看| 国产精品视频精品一二| 亚洲第一页色| 国产传媒1234区| 亚洲精品97中文字幕| 久久精品国产99久久,亚洲日韩久久日本一区一区三区 | 9999九九九久久久| 男人天堂导航| 国产内射爽爽大片| 欧美一级特黄淫片在线观看| 91在线无码精品秘 软件| 玖玖人人爱| yy少妇精品久久| 亚洲男人在线观看天堂| 91久久久亚洲| 亚洲日韩精品一区视频在线| 大香蕉啪啪啪| 成人热久久精品| 日日骚一区二区三区| 富女玩鸭子一级毛片| 欧美精品久久久久久久久88| 天天欧美色|