Я унаследовал приложение Foros, которое необходимо использовать датчики часов для записи данных о здоровье, таких как частота сердечных сокращений, температура и ускорение. Приложению сделано в Java, около 7 лет, и оно не следует за какой -либо конкретной архитектурой. Архитектура приложения (https://developer.android.com/topic/architecture). Я разделил большую часть кода на пользовательский интерфейс и бизнес -логику, но я застрял в основной функциональности, которая является услугой, отвечающей за запуск трекеров для здоровья. < /P>
Сервис Начало, когда я нажимаю кнопку запуска, которая помещается в компонент JetPack. Затем он работает, пока пользователь снова не остановит его. Он должен быть в состоянии работать в фоновом режиме, поэтому пользователь может работать в течение нескольких дней, если это необходимо. < /P>
Мои вопросы: < /p>
< Strong> Как/где я должен инициализировать сервис, чтобы я мог начать и остановить его с композиции? Архитектура? > MonitoringService (Service)
[*] mainActivity (fragmentActivity)
-forapp (composable) < /p>
--- Timerscreen (Composable) < /p>
--- TimerviewModel (AndroidViewModel) < /p>
Сервис - это просто тестер прямо сейчас и имеет переплет, функция запуска и остановки, которая начинает регистрировать каждую секунду для моделирования записи данных о медицинских Записывает или нет. Затем обновите ViewModel. Сервис и ViewModel затем передаются через WearApp, Timerscreen. Это делается в попытке подключить сервис и просмотр, поэтому я могу начать и прекратить запись с Timerscreen. Он несколько сработал, но иногда, когда я открываю или перезагружаю приложение, служба не подключена.class MainActivity : FragmentActivity() {
private val TAG = "Testing"
private val _serviceState = MutableStateFlow(null)
private val serviceState = _serviceState.asStateFlow()
private var isBound = false
private val viewModel: TimerViewModel by viewModels()
private val monitoringServiceConnection = object : ServiceConnection {
override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
Log.i(TAG, "Service connected")
val binder = service as MonitoringService.LocalBinder
val monitoringService = binder.getService()
_serviceState.value = monitoringService
isBound = true
viewModel.observeService(monitoringService)
}
override fun onServiceDisconnected(name: ComponentName?) {
Log.i(TAG, "Service disconnected")
isBound = false
_serviceState.value = null
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.i(TAG, "MainActivity onCreate")
// Start the service first to ensure it stays alive
Intent(this, MonitoringService::class.java).also { intent ->
startService(intent)
}
setContent {
val service by serviceState.collectAsState()
if (service != null) {
WearApp(timerViewModel = viewModel, service = service)
} else {
Loading()
}
}
}
override fun onStart() {
super.onStart()
Log.i(TAG, "MainActivity onStart")
// Bind to the service when activity starts
Intent(this, MonitoringService::class.java).also { intent ->
bindService(intent, monitoringServiceConnection, Context.BIND_AUTO_CREATE)
}
}
override fun onStop() {
super.onStop()
Log.i(TAG, "MainActivity onStop")
// Unbind from the service when activity stops
if (isBound) {
unbindService(monitoringServiceConnection)
isBound = false
}
}
override fun onDestroy() {
super.onDestroy()
Log.i(TAG, "MainActivity onDestroy")
}
}
< /code>
А и мой монитор: < /p>
class MonitoringService : Service() {
private val TAG: String = "Testing"
private val handler = Handler(Looper.getMainLooper())
private val serviceScope = CoroutineScope(Dispatchers.Default + SupervisorJob())
private val _serviceState =
MutableStateFlow(ServiceState(isRecording = false, isRecordingExtra = false))
val serviceState: StateFlow = _serviceState.asStateFlow()
private val binder = LocalBinder()
inner class LocalBinder : Binder() {
fun getService(): MonitoringService = this@MonitoringService
}
private val logRunnable = object : Runnable {
override fun run() {
if (_serviceState.value.isRecording) {
Log.i(TAG, "Service is running!")
handler.postDelayed(this, 1000)
}
}
}
private val logExtraRunnable = object : Runnable {
override fun run() {
if (_serviceState.value.isRecordingExtra) {
Log.i(TAG, "Service Extra is running!")
handler.postDelayed(this, 1000)
}
}
}
override fun onCreate() {
super.onCreate()
Log.i(TAG, "MonitoringService onCreate")
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
Log.i(TAG, "MonitoringService onStartCommand")
// If service is killed and restarted, this ensures it restarts
return START_STICKY
}
override fun onBind(intent: Intent): IBinder {
Log.i(TAG, "MonitoringService onBind")
return binder
}
override fun onRebind(intent: Intent?) {
Log.i(TAG, "MonitoringService onRebind")
super.onRebind(intent)
}
override fun onUnbind(intent: Intent?): Boolean {
Log.i(TAG, "MonitoringService onUnbind")
// Allow rebinding
return true
}
fun startLogging() {
Log.i(TAG, "Logging started")
_serviceState.value = _serviceState.value.copy(isRecording = true)
handler.post(logRunnable)
}
fun stopLogging() {
Log.i(TAG, "Logging stopped")
_serviceState.value = _serviceState.value.copy(isRecording = false)
handler.removeCallbacks(logRunnable)
}
fun startRecordingExtra() {
if (!_serviceState.value.isRecordingExtra) {
Log.i(TAG, "Logging extra")
_serviceState.value = _serviceState.value.copy(isRecordingExtra = true)
handler.post(logExtraRunnable)
serviceScope.launch {
delay(5000L)
stopRecordingExtra()
}
}
}
private fun stopRecordingExtra() {
_serviceState.value = _serviceState.value.copy(isRecordingExtra = false)
handler.removeCallbacks(logExtraRunnable)
Log.i(TAG, "Stopped Extra Recording")
}
override fun onDestroy() {
super.onDestroy()
stopLogging()
stopRecordingExtra()
serviceScope.cancel()
Log.i(TAG, "MonitoringService onDestroy")
}
}
< /code>
Я пытался просмотреть другие сообщения, такие как: < /p>
Компоненты архитектуры Android ViewModel - Связь с обслуживанием /intentservice < /li>
Boundservice + Livedata + ViewModel наилучшая практика в новой рекомендуемой Android -рекомендуемой архитектуре < /li>
< /ul>
Но все, что я нахожу, кажется устаревшим. < / / p>
Я надеюсь, что все это имеет смысл, и что кто -то может мне помочь. < /p>
Подробнее здесь: https://stackoverflow.com/questions/794 ... chitecture
Как настроить услугу Android в рекомендуемой архитектуре приложения ⇐ Android
Форум для тех, кто программирует под Android
-
Anonymous
1739653170
Anonymous
Я унаследовал приложение Foros, которое необходимо использовать датчики часов для записи данных о здоровье, таких как частота сердечных сокращений, температура и ускорение. Приложению сделано в Java, около 7 лет, и оно не следует за какой -либо конкретной архитектурой. Архитектура приложения (https://developer.android.com/topic/architecture). Я разделил большую часть кода на пользовательский интерфейс и бизнес -логику, но я застрял в основной функциональности, которая является услугой, отвечающей за запуск трекеров для здоровья. < /P>
Сервис Начало, когда я нажимаю кнопку запуска, которая помещается в компонент JetPack. Затем он работает, пока пользователь снова не остановит его. Он должен быть в состоянии работать в фоновом режиме, поэтому пользователь может работать в течение нескольких дней, если это необходимо. < /P>
Мои вопросы: < /p>
< Strong> Как/где я должен инициализировать сервис, чтобы я мог начать и остановить его с композиции? Архитектура? > MonitoringService (Service)
[*] mainActivity (fragmentActivity)
-forapp (composable) < /p>
--- Timerscreen (Composable) < /p>
--- TimerviewModel (AndroidViewModel) < /p>
Сервис - это просто тестер прямо сейчас и имеет переплет, функция запуска и остановки, которая начинает регистрировать каждую секунду для моделирования записи данных о медицинских Записывает или нет. Затем обновите ViewModel. Сервис и ViewModel затем передаются через WearApp, Timerscreen. Это делается в попытке подключить сервис и просмотр, поэтому я могу начать и прекратить запись с Timerscreen. Он несколько сработал, но иногда, когда я открываю или перезагружаю приложение, служба не подключена.class MainActivity : FragmentActivity() {
private val TAG = "Testing"
private val _serviceState = MutableStateFlow(null)
private val serviceState = _serviceState.asStateFlow()
private var isBound = false
private val viewModel: TimerViewModel by viewModels()
private val monitoringServiceConnection = object : ServiceConnection {
override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
Log.i(TAG, "Service connected")
val binder = service as MonitoringService.LocalBinder
val monitoringService = binder.getService()
_serviceState.value = monitoringService
isBound = true
viewModel.observeService(monitoringService)
}
override fun onServiceDisconnected(name: ComponentName?) {
Log.i(TAG, "Service disconnected")
isBound = false
_serviceState.value = null
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.i(TAG, "MainActivity onCreate")
// Start the service first to ensure it stays alive
Intent(this, MonitoringService::class.java).also { intent ->
startService(intent)
}
setContent {
val service by serviceState.collectAsState()
if (service != null) {
WearApp(timerViewModel = viewModel, service = service)
} else {
Loading()
}
}
}
override fun onStart() {
super.onStart()
Log.i(TAG, "MainActivity onStart")
// Bind to the service when activity starts
Intent(this, MonitoringService::class.java).also { intent ->
bindService(intent, monitoringServiceConnection, Context.BIND_AUTO_CREATE)
}
}
override fun onStop() {
super.onStop()
Log.i(TAG, "MainActivity onStop")
// Unbind from the service when activity stops
if (isBound) {
unbindService(monitoringServiceConnection)
isBound = false
}
}
override fun onDestroy() {
super.onDestroy()
Log.i(TAG, "MainActivity onDestroy")
}
}
< /code>
А и мой монитор: < /p>
class MonitoringService : Service() {
private val TAG: String = "Testing"
private val handler = Handler(Looper.getMainLooper())
private val serviceScope = CoroutineScope(Dispatchers.Default + SupervisorJob())
private val _serviceState =
MutableStateFlow(ServiceState(isRecording = false, isRecordingExtra = false))
val serviceState: StateFlow = _serviceState.asStateFlow()
private val binder = LocalBinder()
inner class LocalBinder : Binder() {
fun getService(): MonitoringService = this@MonitoringService
}
private val logRunnable = object : Runnable {
override fun run() {
if (_serviceState.value.isRecording) {
Log.i(TAG, "Service is running!")
handler.postDelayed(this, 1000)
}
}
}
private val logExtraRunnable = object : Runnable {
override fun run() {
if (_serviceState.value.isRecordingExtra) {
Log.i(TAG, "Service Extra is running!")
handler.postDelayed(this, 1000)
}
}
}
override fun onCreate() {
super.onCreate()
Log.i(TAG, "MonitoringService onCreate")
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
Log.i(TAG, "MonitoringService onStartCommand")
// If service is killed and restarted, this ensures it restarts
return START_STICKY
}
override fun onBind(intent: Intent): IBinder {
Log.i(TAG, "MonitoringService onBind")
return binder
}
override fun onRebind(intent: Intent?) {
Log.i(TAG, "MonitoringService onRebind")
super.onRebind(intent)
}
override fun onUnbind(intent: Intent?): Boolean {
Log.i(TAG, "MonitoringService onUnbind")
// Allow rebinding
return true
}
fun startLogging() {
Log.i(TAG, "Logging started")
_serviceState.value = _serviceState.value.copy(isRecording = true)
handler.post(logRunnable)
}
fun stopLogging() {
Log.i(TAG, "Logging stopped")
_serviceState.value = _serviceState.value.copy(isRecording = false)
handler.removeCallbacks(logRunnable)
}
fun startRecordingExtra() {
if (!_serviceState.value.isRecordingExtra) {
Log.i(TAG, "Logging extra")
_serviceState.value = _serviceState.value.copy(isRecordingExtra = true)
handler.post(logExtraRunnable)
serviceScope.launch {
delay(5000L)
stopRecordingExtra()
}
}
}
private fun stopRecordingExtra() {
_serviceState.value = _serviceState.value.copy(isRecordingExtra = false)
handler.removeCallbacks(logExtraRunnable)
Log.i(TAG, "Stopped Extra Recording")
}
override fun onDestroy() {
super.onDestroy()
stopLogging()
stopRecordingExtra()
serviceScope.cancel()
Log.i(TAG, "MonitoringService onDestroy")
}
}
< /code>
Я пытался просмотреть другие сообщения, такие как: < /p>
Компоненты архитектуры Android ViewModel - Связь с обслуживанием /intentservice < /li>
Boundservice + Livedata + ViewModel наилучшая практика в новой рекомендуемой Android -рекомендуемой архитектуре < /li>
< /ul>
Но все, что я нахожу, кажется устаревшим. < / / p>
Я надеюсь, что все это имеет смысл, и что кто -то может мне помочь. < /p>
Подробнее здесь: [url]https://stackoverflow.com/questions/79442243/how-do-i-set-up-an-android-service-in-the-recommended-app-architecture[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия