Как служба Android обновит пользовательский интерфейс активности, которая его начала? - программирование
Подтвердить что ты не робот

Как служба Android обновит пользовательский интерфейс активности, которая его начала?

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

Что я хочу сделать, это в основном медиаплеер. Я хочу, чтобы медиапроигрыватель работал на службе, потому что я хочу, чтобы она играла также, когда активность не отображается.

Мой вопрос: как я могу обновить пользовательский интерфейс моей активности в зависимости от рабочего потока службы (например, изменения песни и я хочу, чтобы ее имя отображалось)?

Я предполагаю, что я мог бы использовать Local Broadcast Manager, чтобы отправлять намерения из моей службы в свою активность и вызывать обновления пользовательского интерфейса (это кажется правильным?)

НО... Я хочу, чтобы мой сервис делал некоторые вещи во время воспроизведения музыки (например, запрос/обновление БД). По этой причине я думал о запуске службы в другом процессе (или потоке?).

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

Надеюсь, я объяснил, в чем мои сомнения... любой может помочь?

Большое спасибо!

4b9b3361

Ответ 1

Используйте асинхронную задачу в своей службе, чтобы обрабатывать работу, которая вам нужна в фоновом режиме. Когда вам нужно обновить интерфейс, используйте метод progressUpdate async-задачи, чтобы отправить трансляцию обратно в любую интересующую вас активность.

Псевдо пример.

активность

onCreate → startService и создайте новый широковещательный приемник. Не забудьте переопределить метод onReceive и проверить конкретные намерения.

    mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);

    broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if(intent.getAction().equals(yourActionType)) {
                //do work here
            } 
        }
    };

onResume → регистрироваться как широковещательный приемник

    IntentFilter filter = new IntentFilter();
    filter.addAction(yourActionType);
    mLocalBroadcastManager.registerReceiver(broadcastReceiver, filter);

Сервис

onCreate → создать диспетчер передачи.

   mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);

onStartCommand → при необходимости создать и выполнить новую задачу async. (onStart можно вызвать несколько раз)

Задача Async

doInBackground → Запустите любую нужную фоновую задачу. В этом случае играет музыка. Выполнять периодические вызовы publishProgress

onProgressUpdate → sendBroadcast, указывающий обновленный статус

    Intent broadcastIntent = new Intent(yourActionType);
    broadcastIntent.putExtra(whateverExtraData you need to pass back);
    mLocalBroadcastManager.sendBroadcast(broadcastIntent);

onPostExecute → завершение отправки sendBroadcast задачи