ISCSApplication.kt 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. package com.grkj.iscs
  2. import android.app.AlarmManager
  3. import android.app.Application
  4. import android.app.PendingIntent
  5. import android.content.Context
  6. import android.content.Intent
  7. import ch.qos.logback.classic.Level
  8. import com.drake.statelayout.StateConfig
  9. import com.grkj.data.data.EventConstants
  10. import com.grkj.data.database.DbReadyGate
  11. import com.grkj.data.di.LogicManager
  12. import com.grkj.iscs.common.GlobalManager
  13. import com.grkj.iscs.features.splash.activity.SplashActivity
  14. import com.grkj.shared.model.EventBean
  15. import com.grkj.shared.utils.ArcSoftUtil
  16. import com.grkj.shared.utils.i18n.I18nManager
  17. import com.grkj.shared.utils.i18n.LanguageCatalog
  18. import com.grkj.shared.utils.i18n.LanguageStore
  19. import com.grkj.shared.utils.i18n.source.AssetsI18nSource
  20. import com.grkj.shared.utils.i18n.source.FileI18nSource
  21. import com.grkj.ui_base.business.ModbusBusinessManager
  22. import com.grkj.ui_base.config.ISCSConfig
  23. import com.grkj.ui_base.service.CheckKeyInfoTask
  24. import com.grkj.ui_base.utils.CommonUtils
  25. import com.grkj.ui_base.utils.ble.BleUtil
  26. import com.grkj.ui_base.utils.modbus.ModBusController
  27. import com.kongzue.dialogx.DialogX
  28. import com.scwang.smart.refresh.footer.ClassicsFooter
  29. import com.scwang.smart.refresh.header.ClassicsHeader
  30. import com.scwang.smart.refresh.layout.SmartRefreshLayout
  31. import com.sik.cronjob.managers.CronJobScanner
  32. import com.sik.sikcore.SIKCore
  33. import com.sik.sikcore.crash.GlobalCrashCatch
  34. import com.sik.sikcore.extension.toJson
  35. import com.sik.sikcore.log.LogUtils
  36. import com.sik.sikcore.thread.ThreadUtils
  37. import com.tencent.mmkv.MMKV
  38. import dagger.hilt.android.HiltAndroidApp
  39. import me.jessyan.autosize.AutoSizeConfig
  40. import org.greenrobot.eventbus.EventBus
  41. import org.greenrobot.eventbus.Subscribe
  42. import org.greenrobot.eventbus.ThreadMode
  43. import org.slf4j.Logger
  44. import org.slf4j.LoggerFactory
  45. /**
  46. * 启动入口
  47. */
  48. @HiltAndroidApp
  49. class ISCSApplication : Application() {
  50. private val logger: Logger = LoggerFactory.getLogger(ISCSApplication::class.java)
  51. companion object {
  52. /**
  53. * 检查钥匙信息任务
  54. */
  55. val checkKeyInfoTask: CheckKeyInfoTask by lazy { CheckKeyInfoTask() }
  56. }
  57. /**
  58. * 程序创建
  59. */
  60. override fun onCreate() {
  61. super.onCreate()
  62. DialogX.init(this)
  63. SIKCore.init(this)
  64. //todo 模拟器不支持
  65. ArcSoftUtil.checkActiveStatus(this)
  66. ArcSoftUtil.initEngine(this)
  67. if (!EventBus.getDefault().isRegistered(this)) {
  68. EventBus.getDefault().register(this)
  69. }
  70. GlobalCrashCatch.instance.init(this).setGlobalCrashHandlerListener {
  71. logger.error("异常发生", it)
  72. true
  73. }
  74. if (ISCSConfig.DEBUG) {
  75. LogUtils.setGlobalLogLevel(Level.DEBUG)
  76. } else {
  77. LogUtils.setGlobalLogLevel(Level.INFO)
  78. }
  79. System.loadLibrary("sqlcipher") // 新库必须手动加载
  80. MMKV.initialize(this)
  81. I18nManager.init(
  82. defaultLocale = LanguageStore.resolveEffectiveLocale(this),
  83. initialSources = arrayOf(
  84. AssetsI18nSource(this, "i18n"),
  85. FileI18nSource(this, "i18n")
  86. ),
  87. eagerLoad = true
  88. )
  89. // 建议:可提前刷新一下目录(不强制)
  90. LanguageCatalog.refresh(this)
  91. // 若“跟随系统”,监听系统语言变化
  92. LanguageStore.registerSystemLocaleObserver(this)
  93. if (ISCSConfig.isInit) {
  94. BleUtil.instance?.initBle(this)
  95. }
  96. AutoSizeConfig.getInstance().isCustomFragment = true
  97. StateConfig.emptyLayout = com.grkj.ui_base.R.layout.layout_empty
  98. ThreadUtils.runOnIO {
  99. DbReadyGate.await()
  100. ModbusBusinessManager.registerMainListener()
  101. LogicManager.init(this@ISCSApplication)
  102. }
  103. }
  104. @Subscribe(threadMode = ThreadMode.MAIN)
  105. open fun onEvent(event: EventBean<*>) {
  106. when (event.code) {
  107. EventConstants.EVENT_START_MODBUS -> {
  108. ThreadUtils.runOnIO {
  109. ModBusController.interruptReadTrashBinStatus(false)
  110. ModBusController.start()
  111. logger.info("Application 连接完成,开始初始化")
  112. ModBusController.initDevicesStatus()
  113. }
  114. }
  115. EventConstants.EVENT_RESTART_APP -> {
  116. scheduleRestart(this)
  117. }
  118. EventConstants.EVENT_START_MODBUS_COMPLETE -> {
  119. if (ISCSConfig.isInit) {
  120. val jobList = CronJobScanner.scanJobs(checkKeyInfoTask)
  121. logger.info("扫描任务结果:${jobList.toJson()},开始注册")
  122. GlobalManager.cronJobManager.registerJobs(jobList)
  123. }
  124. }
  125. }
  126. }
  127. /**
  128. * 计划重启
  129. */
  130. private fun scheduleRestart(context: Context) {
  131. val restartIntent = Intent(context, SplashActivity::class.java).apply {
  132. addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK)
  133. }
  134. val pi = PendingIntent.getActivity(
  135. context,
  136. 0,
  137. restartIntent,
  138. PendingIntent.FLAG_CANCEL_CURRENT or PendingIntent.FLAG_IMMUTABLE
  139. )
  140. val am = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
  141. am.setExact(
  142. AlarmManager.RTC,
  143. System.currentTimeMillis() + 2000,
  144. pi
  145. )
  146. Runtime.getRuntime().exit(0)
  147. }
  148. override fun onTerminate() {
  149. if (EventBus.getDefault().isRegistered(this)) {
  150. EventBus.getDefault().unregister(this)
  151. }
  152. super.onTerminate()
  153. }
  154. //static 代码段可以防止内存泄露
  155. init {
  156. //设置全局的Header构建器
  157. SmartRefreshLayout.setDefaultRefreshHeaderCreator { context, layout ->
  158. ClassicsHeader(context).apply {
  159. this.setAccentColor(CommonUtils.getColor(com.grkj.ui_base.R.attr.colorTextPrimary))
  160. }
  161. }
  162. //设置全局的Footer构建器
  163. SmartRefreshLayout.setDefaultRefreshFooterCreator { context, p1 ->
  164. ClassicsFooter(context).apply {
  165. this.setAccentColor(CommonUtils.getColor(com.grkj.ui_base.R.attr.colorTextPrimary))
  166. }
  167. }
  168. }
  169. }