Привязка сервиса к активности в Android



Я пытаюсь написать простой медиа-плеер, который воспроизводит потоковое аудио с помощью RTSP. У меня есть GUI-activity и сервис, который выполняет воспроизведение. Мой вопрос заключается в том, как лучше всего взаимодействовать между активностью и сервисом (например, обновление gui на основе состояния игрока).



Я знаю, что могу привязать службу к действию с помощью onBind (), но если я правильно понимаю, это остановит службу, если действие будет убито. Я хочу продолжить воспроизведение, даже если пользователь завершает действие. Существует ли какой-либо стандартный или предпочтительный способ решения этой проблемы?

682   6  

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

    Ничего не найдено.