Привязка сервиса к активности в Android
Я пытаюсь написать простой медиа-плеер, который воспроизводит потоковое аудио с помощью RTSP. У меня есть GUI-activity и сервис, который выполняет воспроизведение. Мой вопрос заключается в том, как лучше всего взаимодействовать между активностью и сервисом (например, обновление gui на основе состояния игрока).
Я знаю, что могу привязать службу к действию с помощью onBind (), но если я правильно понимаю, это остановит службу, если действие будет убито. Я хочу продолжить воспроизведение, даже если пользователь завершает действие. Существует ли какой-либо стандартный или предпочтительный способ решения этой проблемы?
6 ответов:
" если вы запустите службу 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объект, который возвращает сервис свой!--16--> метод, позволяющий клиенту затем совершать обратные вызовы к службе. Служба будет работать до тех пор, пока соединение установлено (независимо от того, сохраняет ли клиент ссылку на службуIBinder). ОбычноIBinderвозвращается для сложного интерфейса, который был написан в AIDL.услуга может быть как запущен и имеет привязанные к нему соединения. В таком случае система будет поддерживать работу службы до тех пор, пока она не будет запущена или к ней будет установлено одно или несколько подключений с помощью
Context.BIND_AUTO_CREATEфлаг. Как только ни одна из этих ситуаций не выполняется, службаonDestroy()вызывается метод и служба эффективно завершается. Вся очистка (остановка потоков, отмена регистрации получателей) должна быть завершена по возвращении изonDestroy()."
прежде всего, 2 вещи, которые нам нужно понять
клиент
он делает запрос к конкретному серверу
bindService(new Intent("com.android.vending.billing.InAppBillingService.BIND"), mServiceConn, Context.BIND_AUTO_CREATE);`здесь
mServiceConn- это экземплярServiceConnectionкласс (встроенный) это на самом деле интерфейс, который нам нужно реализовать с двумя (1-й для подключенной сети и 2-й сети не подключен) метод для мониторинга состояния сетевого подключения.сервер
- оно регулирует запрос клиент и сделать реплику своего собственного, который является частным для клиента, который отправляет запрос, и эта реплика сервера работает в другом потоке.
теперь на стороне клиента, как получить доступ ко всем методом сервера?
сервер отправляет ответ с IBind Object.so объект 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.приложение.Обслуживание и ручная обработка резьбы, если вы хотите.
если пользователь откажется, то
onDestroy()метод будет вызван. Этот метод должен остановить любую службу, которая используется в приложении. Поэтому, если вы хотите продолжить службу, даже если пользователь отступает из приложения, просто удалитеonDestroy(). Надеюсь, это поможет.
Comments