From cb99bd7dad1b305a434c5c6c99ca65e782eb0f34 Mon Sep 17 00:00:00 2001 From: cloudroam <cloudroam> Date: 星期五, 11 四月 2025 17:32:12 +0800 Subject: [PATCH] add: 消息提醒 --- app/src/main/java/com/example/firstapp/App.kt | 154 ++++++++++++++++++++++++++++++++------------------- 1 files changed, 96 insertions(+), 58 deletions(-) diff --git a/app/src/main/java/com/example/firstapp/App.kt b/app/src/main/java/com/example/firstapp/App.kt index 93f6053..a3992f7 100644 --- a/app/src/main/java/com/example/firstapp/App.kt +++ b/app/src/main/java/com/example/firstapp/App.kt @@ -3,49 +3,32 @@ import android.annotation.SuppressLint import android.app.Application import android.app.PendingIntent -import android.bluetooth.BluetoothAdapter -import android.bluetooth.BluetoothDevice import android.content.Context import android.content.Intent import android.content.IntentFilter import android.location.Geocoder -import android.net.ConnectivityManager -import android.net.wifi.WifiManager import android.os.Build +import androidx.annotation.NonNull import androidx.lifecycle.MutableLiveData import androidx.multidex.MultiDex -import androidx.work.Configuration -import androidx.work.WorkManager +import androidx.work.* +import com.example.firstapp.core.Core +import com.example.firstapp.database.repository.CodeRepository +import com.example.firstapp.database.repository.KeywordRepository +import com.example.firstapp.database.repository.MsgRepository +import com.example.firstapp.database.service.RetrofitClient +import com.example.firstapp.receiver.CactusReceiver +import com.example.firstapp.service.ReminderWorker +import com.example.firstapp.utils.* +import com.example.firstapp.utils.tinker.TinkerLoadLibrary import com.gyf.cactus.Cactus import com.gyf.cactus.callback.CactusCallback import com.gyf.cactus.ext.cactus import com.hjq.language.MultiLanguages -import com.hjq.language.OnLanguageListener -import com.example.firstapp.core.Core -import com.example.firstapp.database.repository.CodeRepository -import com.example.firstapp.database.repository.MsgRepository -import com.example.firstapp.receiver.CactusReceiver -import com.example.firstapp.service.BluetoothScanService -import com.example.firstapp.service.HttpServerService -import com.example.firstapp.utils.ACTION_START -import com.example.firstapp.utils.AppInfo -import com.example.firstapp.utils.CactusSave -import com.example.firstapp.utils.FRONT_CHANNEL_ID -import com.example.firstapp.utils.FRONT_CHANNEL_NAME -import com.example.firstapp.utils.FRONT_NOTIFY_ID -import com.example.firstapp.utils.FRPC_LIB_VERSION -import com.example.firstapp.utils.HistoryUtils -import com.example.firstapp.utils.Log -import com.example.firstapp.utils.SettingUtils -import com.example.firstapp.utils.SharedPreference - -import com.example.firstapp.utils.tinker.TinkerLoadLibrary import com.king.location.LocationClient import com.xuexiang.xutil.file.FileUtils import frpclib.Frpclib -import io.reactivex.Observable import io.reactivex.disposables.Disposable -import io.reactivex.schedulers.Schedulers import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.SupervisorJob import java.io.BufferedWriter @@ -53,18 +36,17 @@ import java.io.FileWriter import java.io.IOException import java.text.SimpleDateFormat -import java.util.Date -import java.util.Locale -import java.util.TimeZone +import java.util.* import java.util.concurrent.TimeUnit @Suppress("DEPRECATION") -class App : Application(), CactusCallback, Configuration.Provider by Core { +class App : Application(), CactusCallback, Configuration.Provider { val applicationScope = CoroutineScope(SupervisorJob()) val database by lazy { AppDatabase.getInstance(this) } val msgRepository by lazy { MsgRepository(database.msgDao()) } val codeRepository by lazy { CodeRepository(database.codeDao()) } + val keywordRepository by lazy { KeywordRepository(RetrofitClient.apiService,database.keywordDao()) } companion object { const val TAG: String = "SmsForwarder" @@ -142,19 +124,27 @@ } catch (ex: IOException) { ex.printStackTrace() } - //使用默认的处理方式让APP停止运行 defaultHandler?.uncaughtException(thread, throwable) } try { context = applicationContext initLibs() + PreferencesManager.init(this) - //纯客户端模式 - if (SettingUtils.enablePureClientMode) return + try { + if (SettingUtils.enablePureClientMode) return + } catch (e: Exception) { + // 捕获SettingUtils未初始化的异常 + Log.e(TAG, "SettingUtils未初始化: ${e.message}") + // 继续执行后续代码,不返回 + } - //初始化WorkManager - WorkManager.initialize(this, Configuration.Builder().build()) + // 初始化WorkManager + WorkManager.initialize(this, getWorkManagerConfiguration()) + + // 设置定时检查提醒的WorkManager + setupReminderWorker() //动态加载FrpcLib val libPath = filesDir.absolutePath + "/libs" @@ -290,6 +280,13 @@ } } + @NonNull + override fun getWorkManagerConfiguration(): Configuration { + return Configuration.Builder() + .setMinimumLoggingLevel(android.util.Log.DEBUG) + .build() + } + /** * 初始化基础库 */ @@ -297,39 +294,39 @@ Core.init(this) Log.init(applicationContext) // 配置文件初始化 - /* SharedPreference.init(applicationContext) + SharedPreference.init(applicationContext) // X系列基础库初始化 // XBasicLibInit.init(this) // 初始化日志打印 isDebug = SettingUtils.enableDebugMode Log.init(applicationContext) // 转发历史工具类初始化 - HistoryUtils.init(applicationContext) +// HistoryUtils.init(applicationContext) // 版本更新初始化 // XUpdateInit.init(this) // 运营统计数据 // UMengInit.init(this) // 初始化语种切换框架 - MultiLanguages.init(this) +// MultiLanguages.init(this) // 设置语种变化监听器 - MultiLanguages.setOnLanguageListener(object : OnLanguageListener { - override fun onAppLocaleChange(oldLocale: Locale, newLocale: Locale) { - // 注意:只有setAppLanguage时触发,clearAppLanguage时不触发 - Log.i(TAG, "监听到应用切换了语种,旧语种:$oldLocale,新语种:$newLocale") - switchLanguage(newLocale) - } - - override fun onSystemLocaleChange(oldLocale: Locale, newLocale: Locale) { - Log.i(TAG, "监听到系统切换了语种,旧语种:$oldLocale,新语种:$newLocale") - switchLanguage(newLocale) - *//*val isFlowSystem = SettingUtils.isFlowSystemLanguage //MultiLanguages.isSystemLanguage(context)取值不对,一直是false - Log.i(TAG, "监听到系统切换了语种,旧语种:$oldLocale,新语种:$newLocale,是否跟随系统:$isFlowSystem") - if (isFlowSystem) { - CommonUtils.switchLanguage(oldLocale, newLocale) - }*//* - } - }) - switchLanguage(MultiLanguages.getAppLanguage(this))*/ +// MultiLanguages.setOnLanguageListener(object : OnLanguageListener { +// override fun onAppLocaleChange(oldLocale: Locale, newLocale: Locale) { +// // 注意:只有setAppLanguage时触发,clearAppLanguage时不触发 +// Log.i(TAG, "监听到应用切换了语种,旧语种:$oldLocale,新语种:$newLocale") +// switchLanguage(newLocale) +// } +// +// override fun onSystemLocaleChange(oldLocale: Locale, newLocale: Locale) { +// Log.i(TAG, "监听到系统切换了语种,旧语种:$oldLocale,新语种:$newLocale") +// switchLanguage(newLocale) +// *//*val isFlowSystem = SettingUtils.isFlowSystemLanguage //MultiLanguages.isSystemLanguage(context)取值不对,一直是false +// Log.i(TAG, "监听到系统切换了语种,旧语种:$oldLocale,新语种:$newLocale,是否跟随系统:$isFlowSystem") +// if (isFlowSystem) { +// CommonUtils.switchLanguage(oldLocale, newLocale) +// }*//* +// } +// }) +// switchLanguage(MultiLanguages.getAppLanguage(this)) } @SuppressLint("CheckResult") @@ -452,4 +449,45 @@ // ) // } + /** + * 设置定时提醒Worker + * 配置为每天运行一次检查是否有新的提醒内容 + */ + private fun setupReminderWorker() { + Log.d(TAG, "设置定时提醒Worker") + + // 方式1:使用周期性执行 + val constraints = Constraints.Builder() + .setRequiredNetworkType(NetworkType.CONNECTED) + .build() + + // 创建周期性工作请求 + val reminderWorkRequest = PeriodicWorkRequestBuilder<ReminderWorker>( + ReminderWorker.REPEAT_INTERVAL, + ReminderWorker.REPEAT_INTERVAL_TIME_UNIT + ) + .setConstraints(constraints) + .addTag("reminder_worker") + .build() + + // 使用 REPLACE 策略确保新配置生效 + WorkManager.getInstance(this).enqueueUniquePeriodicWork( + "reminder_work", + ExistingPeriodicWorkPolicy.REPLACE, + reminderWorkRequest + ) + + // 方式2:设置在特定时间执行(例如每天上午9点和下午18点) + // 可根据需要设置多个不同时间点的提醒 + ReminderWorker.setupScheduledWorker(this, 9, 0) // 上午9:00 + ReminderWorker.setupScheduledWorker(this, 13, 50) // 下午18:00 + + // 注意:不再立即执行一次提醒检查,避免重复提醒 + // 如果需要立即检查,可以设置一个延迟,例如5分钟后执行 + val delayedWorkRequest = OneTimeWorkRequestBuilder<ReminderWorker>() + .setInitialDelay(5, TimeUnit.MINUTES) // 延迟5分钟执行 + .build() + WorkManager.getInstance(this).enqueue(delayedWorkRequest) + } + } \ No newline at end of file -- Gitblit v1.9.3