Intereting Posts
Как получить силу сигнала LTE в Android? NotifyDataSetChange не работает с пользовательским адаптером Android: настройка уровня масштабирования в Картах Google для включения всех точек маркера BroadcastReceiver не работает после BOOT_COMPLETED Тихий вход для получения токена с помощью GoogleApiClient Изменение цвета фона вкладки TabLayout (библиотека поддержки дизайна Android) не занимает всего пространства табуляции DuplicateFileException m4b + игровые сервисы 9.0 Есть ли способ отключить затухание, что viewPager имеет прокрутку к краям? Android APK не будет генерировать при выполнении Используя привязку данных Android, как указать текст фиктивного (или «по умолчанию»), который будет отображаться во время предварительного просмотра макета в Android Studio? Может ли кто-нибудь дать один конкретный пример внедрения webview в android Невозможно удалить намерение дополнительно! Google GCM – Не получать push-уведомления в android Lollipop Android StackScrollLayout Default Style Fails для вкладки TabPageIndicator для ViewPagerIndicator. Почему и как исправить?

Связанный с запущенным сервисом на Android и как сделать

Я задаю досадный вопрос, который был (частично, на мой взгляд) рассмотрен здесь и здесь . Скажем, как во многих примерах мы хотим создать музыкальное приложение, используя (скажем) одно действие и службу. Мы хотим, чтобы служба сохранялась, когда активность остановлена ​​или уничтожена. Этот вид жизненного цикла предлагает начальный сервис:

Служба запускается, когда компонент приложения (например, активность) запускает его, вызывая startService (). После запуска служба может работать в фоновом режиме на неопределенный срок, даже если компонент, который начал ее, уничтожен

Хорошо, но мы также хотим иметь возможность общаться с сервисом, поэтому нам нужна привязка к сервису. Нет проблем, у нас есть как связанное, так и начатое обслуживание, поскольку этот ответ подсказывает :

  • При запуске активности (или какой-либо другой точке) мы вызываем startService ()
  • После этого мы вызываем bindService (), чтобы получить интерфейс IBinder , и исходим оттуда.

Пока что так хорошо, но проблема возникает из-за того, что, когда начинается действие, мы не знаем, есть ли сервис вокруг или нет. Возможно, он был запущен или, возможно, не был. Ответ может быть примерно таким:

  • При запуске попробуйте привязать к службе (используйте bindService () без флага BIND_AUTO_CREATE )
  • Если это не удается, запустите службу, используя startService() , а затем привяжите ее.

Эта идея основана на конкретном чтении документов для bindService() :

Подключитесь к службе приложений, создав ее, если необходимо.

Если флаг нуля означает, что «услуга действительно не нужна», мы в порядке. Поэтому мы пытаемся сделать что-то подобное, используя следующий код:

 private void connectToService() { Log.d("MainActivity", "Connecting to service"); // We try to bind to an existing service Intent bindIntent = new Intent(this, AccelerometerLoggerService.class); boolean bindResult = bindService(bindIntent, mConnection, 0); if (bindResult) { // Service existed, so we just bound to it Log.d("MainActivity", "Found a pre-existing service and bound to it"); } else { Log.d("MainActivity", "No pre-existing service starting one"); // Service did not exist so we must start it Intent startIntent = new Intent(this, AccelerometerLoggerService.class); ComponentName startResult = startService(startIntent); if (startResult==null) { Log.e("MainActivity", "Unable to start our service"); } else { Log.d("MainActivity", "Started a service will bind"); // Now that the service is started, we can bind to it bindService(bindIntent, mConnection, 0); if (!bindResult) { Log.e("MainActivity", "started a service and then failed to bind to it"); } else { Log.d("MainActivity", "Successfully bound"); } } } } 

И то, что мы получаем, является успешной привязкой каждый раз:

 04-23 05:42:59.125: D/MainActivity(842): Connecting to service 04-23 05:42:59.125: D/MainActivity(842): Found a pre-existing service and bound to it 04-23 05:42:59.134: D/MainActivity(842): onCreate 

Глобальный вопрос: «Я не понимаю, связаны ли они с запущенными службами и как их использовать?» Более конкретные вопросы:

  • Правильно ли это понимать документы, bindService() что флаг нуля, переданный bindService() означает «Не запускать службу»? Если нет, не существует способа вызвать bindService() без запуска службы?
  • Почему bindService() возвращает true даже если служба не запущена? В этом случае не похоже, что служба была запущена на основе вызовов Log .
  • Если предыдущей точкой является правильное / ожидаемое поведение bindService() , есть ли способ обхода (т.е. каким-то образом гарантировать, что startService вызывается только в том случае, если служба не запущена?)

PS Я перешел от проблемы в своем собственном коде: я startService() вызовы startService() независимо, так как повторные startService() просто игнорируются. Однако мне все же хотелось бы лучше понять проблемы.

Solutions Collecting From Web of "Связанный с запущенным сервисом на Android и как сделать"

  1. Если вы свяжетеService с флагом 0, то служба не запустится. Вы можете bindService с флагом BIND_AUTO_CREATE, и если служба не запущена, она будет запущена. Однако, когда вы отключите сервис, служба будет уничтожена.
  2. Функция bindService с флагом 0 всегда возвращает значение true.
  3. Вы всегда можете вызвать startService. Если служба уже запущена, новая служба не будет создана. Вызывается запущенная служба onStartCommand.

Не должно быть никаких проблем, если вы запустите службу в onCreate, а затем bindService в onResume и unbindService в onPause.