ISCSApplication.kt 7.0 KB

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