package com.grkj.iscs import android.app.AlarmManager import android.app.Application import android.app.PendingIntent import android.content.Context import android.content.Intent import ch.qos.logback.classic.Level import com.drake.statelayout.StateConfig import com.grkj.data.data.EventConstants import com.grkj.data.database.DbReadyGate import com.grkj.data.di.LogicManager import com.grkj.iscs.common.GlobalManager import com.grkj.iscs.features.splash.activity.SplashActivity import com.grkj.shared.model.EventBean import com.grkj.shared.utils.ArcSoftUtil import com.grkj.shared.utils.i18n.I18nManager import com.grkj.shared.utils.i18n.LanguageCatalog import com.grkj.shared.utils.i18n.LanguageStore import com.grkj.shared.utils.i18n.source.AssetsI18nSource import com.grkj.shared.utils.i18n.source.FileI18nSource import com.grkj.ui_base.business.ModbusBusinessManager import com.grkj.ui_base.config.ISCSConfig import com.grkj.ui_base.service.CheckKeyInfoTask import com.grkj.ui_base.utils.CommonUtils import com.grkj.ui_base.utils.ble.BleUtil import com.grkj.ui_base.utils.modbus.ModBusController import com.kongzue.dialogx.DialogX import com.scwang.smart.refresh.footer.ClassicsFooter import com.scwang.smart.refresh.header.ClassicsHeader import com.scwang.smart.refresh.layout.SmartRefreshLayout import com.sik.cronjob.managers.CronJobScanner import com.sik.sikcore.SIKCore import com.sik.sikcore.crash.GlobalCrashCatch import com.sik.sikcore.extension.toJson import com.sik.sikcore.log.LogUtils import com.sik.sikcore.thread.ThreadUtils import com.tencent.mmkv.MMKV import dagger.hilt.android.HiltAndroidApp import me.jessyan.autosize.AutoSizeConfig import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode import org.slf4j.Logger import org.slf4j.LoggerFactory /** * 启动入口 */ @HiltAndroidApp class ISCSApplication : Application() { private val logger: Logger = LoggerFactory.getLogger(ISCSApplication::class.java) companion object { /** * 检查钥匙信息任务 */ val checkKeyInfoTask: CheckKeyInfoTask by lazy { CheckKeyInfoTask() } } /** * 程序创建 */ override fun onCreate() { super.onCreate() DialogX.init(this) SIKCore.init(this) //todo 模拟器不支持 ArcSoftUtil.checkActiveStatus(this) ArcSoftUtil.initEngine(this) if (!EventBus.getDefault().isRegistered(this)) { EventBus.getDefault().register(this) } GlobalCrashCatch.instance.init(this).setGlobalCrashHandlerListener { logger.error("异常发生", it) true } if (ISCSConfig.DEBUG) { LogUtils.setGlobalLogLevel(Level.DEBUG) } else { LogUtils.setGlobalLogLevel(Level.INFO) } System.loadLibrary("sqlcipher") // 新库必须手动加载 MMKV.initialize(this) I18nManager.init( defaultLocale = LanguageStore.resolveEffectiveLocale(this), initialSources = arrayOf( AssetsI18nSource(this, "i18n"), FileI18nSource(this, "i18n") ), eagerLoad = true ) // 建议:可提前刷新一下目录(不强制) LanguageCatalog.refresh(this) // 若“跟随系统”,监听系统语言变化 LanguageStore.registerSystemLocaleObserver(this) if (ISCSConfig.isInit) { BleUtil.instance?.initBle(this) } AutoSizeConfig.getInstance().isCustomFragment = true StateConfig.emptyLayout = com.grkj.ui_base.R.layout.layout_empty ThreadUtils.runOnIO { DbReadyGate.await() ModbusBusinessManager.registerMainListener() LogicManager.init(this@ISCSApplication) } } @Subscribe(threadMode = ThreadMode.MAIN) open fun onEvent(event: EventBean<*>) { when (event.code) { EventConstants.EVENT_START_MODBUS -> { ThreadUtils.runOnIO { ModBusController.interruptReadTrashBinStatus(false) ModBusController.start() logger.info("Application 连接完成,开始初始化") ModBusController.initDevicesStatus() } } EventConstants.EVENT_RESTART_APP -> { scheduleRestart(this) } EventConstants.EVENT_START_MODBUS_COMPLETE -> { if (ISCSConfig.isInit) { val jobList = CronJobScanner.scanJobs(checkKeyInfoTask) logger.info("扫描任务结果:${jobList.toJson()},开始注册") GlobalManager.cronJobManager.registerJobs(jobList) } } } } /** * 计划重启 */ private fun scheduleRestart(context: Context) { val restartIntent = Intent(context, SplashActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK) } val pi = PendingIntent.getActivity( context, 0, restartIntent, PendingIntent.FLAG_CANCEL_CURRENT or PendingIntent.FLAG_IMMUTABLE ) val am = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager am.setExact( AlarmManager.RTC, System.currentTimeMillis() + 2000, pi ) Runtime.getRuntime().exit(0) } override fun onTerminate() { if (EventBus.getDefault().isRegistered(this)) { EventBus.getDefault().unregister(this) } super.onTerminate() } //static 代码段可以防止内存泄露 init { //设置全局的Header构建器 SmartRefreshLayout.setDefaultRefreshHeaderCreator { context, layout -> ClassicsHeader(context).apply { this.setAccentColor(CommonUtils.getColor(com.grkj.ui_base.R.attr.colorTextPrimary)) } } //设置全局的Footer构建器 SmartRefreshLayout.setDefaultRefreshFooterCreator { context, p1 -> ClassicsFooter(context).apply { this.setAccentColor(CommonUtils.getColor(com.grkj.ui_base.R.attr.colorTextPrimary)) } } } }