«Если вы запустите службу Android с startService(..)
этой службой, она будет продолжать работать до тех пор, пока вы явно не вызовете ее stopService(..)
. Есть две причины, по которым служба может запускаться системой. Если кто-то позвонит, Context.startService()
система получит службу (создав ее и вызовет onCreate()
метод, если необходимо), а затем вызовите его onStartCommand(Intent, int, int)
метод с аргументами, предоставленными клиентом. Служба на этом этапе продолжит работу до тех пор, пока не будет вызвана Context.stopService()
или stopSelf()
. Обратите внимание, что несколько вызовов, которые Context.startService()
не следует вкладывать (хотя они приводят к нескольким соответствующим вызовам onStartCommand()
), поэтому нет независимо от того, сколько раз он запускался, служба будет остановлена один раз Context.stopService()
или метод, гарантирующий, что служба не будет остановлена, пока запущенные намерения не будут обработаны. stopSelf()
вызвана ; однако службы могут использовать своиstopSelf(int)
Клиенты также могут использовать Context.bindService()
для получения постоянного подключения к службе. Это также создает службу, если она еще не запущена (вызывается onCreate()
при этом), но не вызывает onStartCommand()
. Клиент получит IBinder
объект, который служба возвращает из своего onBind(Intent)
метода, позволяя клиенту затем делать обратные вызовы службе. Служба будет работать до тех пор, пока установлено соединение (независимо от того, сохраняет ли клиент ссылку на Службу IBinder
). Обычно IBinder
возвращается сложный интерфейс, написанный на AIDL.
Сервис может быть как запущен, так и привязан к нему. В таком случае система будет поддерживать работу службы до тех пор, пока она запущена или есть одно или несколько подключений к ней с Context.BIND_AUTO_CREATE
флагом. Если ни одна из этих ситуаций не выполняется, onDestroy()
вызывается метод службы, и служба эффективно завершается. Вся очистка (остановка потоков, отмена регистрации получателей) должна быть завершена после возврата из onDestroy()
. "
Прежде всего, две вещи, которые нам нужно понять
Клиент
он делает запрос на конкретный сервер
bindService(new Intent("com.android.vending.billing.InAppBillingService.BIND"), mServiceConn, Context.BIND_AUTO_CREATE);`
вот
mServiceConn
экземплярServiceConnection
класса (встроенный), это на самом деле интерфейс, который нам нужно реализовать с помощью двух (1-й для подключения к сети и 2-го метода для подключения к сети) для мониторинга состояния сетевого подключения.Сервер
Теперь на стороне клиента, как получить доступ ко всем методам сервера?
сервер отправляет ответ с помощью объекта IBind. поэтому объект IBind - это наш обработчик, который обращается ко всем методам обслуживания с помощью оператора (.).
MyService myService; public ServiceConnection myConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder binder) { Log.d("ServiceConnection","connected"); myService = binder; } //binder comes from server to communicate with method's of public void onServiceDisconnected(ComponentName className) { Log.d("ServiceConnection","disconnected"); myService = null; } }
теперь как вызвать метод, который находится в обслуживании
myservice.serviceMethod();
вот
myService
объект иserviceMethode
метод в обслуживании. Таким образом устанавливается связь между клиентом и сервером.источник
Я пытался позвонить
startService(oIntent); bindService(oIntent, mConnection, Context.BIND_AUTO_CREATE);
следовательно, и я мог бы создать липкую службу и привязаться к ней. Подробное руководство для примера привязанной службы .
источник
Существует метод unbindService , который примет ServiceConnection, который вы создадите при вызове bindService. Это позволит вам отключиться от службы, не отключая ее.
Это может создать проблему при повторном подключении к нему, поскольку вы, вероятно, не знаете, работает он или нет, когда снова запустите действие, поэтому вам придется учитывать это в своем коде действия.
Удачи!
источник
Это предвзятый ответ, но я написал библиотеку, которая может упростить использование служб Android, если они работают локально в том же процессе, что и приложение: https://github.com/germnix/acacia
В основном вы определяете интерфейс, аннотированный с помощью @Service и его реализующего класса, а библиотека создает и связывает службу, обрабатывает соединение и фоновый рабочий поток:
@Service(ServiceImpl.class) public interface MyService { void doProcessing(Foo aComplexParam); } public class ServiceImpl implements MyService { // your implementation } MyService service = Acacia.createService(context, MyService.class); service.doProcessing(foo); <application android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> ... <service android:name="com.gmr.acacia.AcaciaService"/> ... </application>
Вы можете получить экземпляр связанной службы android.app.Service для скрытия / отображения постоянных уведомлений, использовать свой собственный android.app.Service и вручную обрабатывать потоки, если хотите.
источник
Если пользователь отступит,
onDestroy()
метод будет вызван. Этот метод заключается в остановке любой службы, используемой в приложении. Поэтому, если вы хотите продолжить службу, даже если пользователь откажется от приложения, просто удалитеonDestroy()
. Надеюсь на эту помощь.источник