2012-05-11 2 views
6

Я прочитал documentation about Bound Services, где показано, что вы можете легко общаться через сообщения от активности к удаленному (т.е. не в том же контексте) услуг, но есть ли способ, чтобы отправлять сообщения от службы до Связанные должности? Например, моя активность связана с работающей фоновой службой того же приложения, отправляет ей сообщение и при приеме этого сообщения служба отвечает сообщением о деятельности. Как это реализовать? Можете ли вы указать мне какую-то документацию, которая объясняет эту тему?Как удаленная служба может отправлять сообщения связанным действиям?

ответ

4

Нашел пример в справочной документации по адресу Remote Messenger Service Sample.

+0

Есть ли реальная ситуация в мире, где нам понадобится привязка удаленного обслуживания? –

25

ПРИМЕЧАНИЕ. Это относится только к службам и действиям в процессе, а не к удаленному, как заданный вопрос.

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

Вам необходимо сделать услугу, связанную с деятельностью.

Первый шаг - сделать сервис. В службе убедитесь, что у вас есть объект Binder и метод для возврата объекта связующего. Ниже приведен пример, который я использовал в своем сервисе для извлечения моего связующего. Также обратите внимание, что это связующее имеет метод установки слушателя, который будет сохранен в службе как поле типа BoundServiceListener.

/** 
* Class used for the client Binder. Because we know this service always 
* runs in the same process as its clients, we don't need to deal with IPC. 
*/ 
public class DownloadBgBinder extends Binder { 

    public DownloadBgService getService() { 
     // Return this instance of LocalService so clients can call public methods 
     return DownloadBgService.this; 
    } 

    public void setListener(BoundServiceListener listener) { 
     mListener = listener; 
    } 
} 

@Override 
public IBinder onBind(Intent intent) { 
    return mBinder; 
} 

Теперь вам нужно создать какое-то интерфейс, который вы можете передать объект связующего, что ваша служба может использовать для отправки обновлений. Ниже мой BoundServiceListener.

public interface BoundServiceListener { 

    public void sendProgress(double progress); 
    public void finishedDownloading(); 
} 

Теперь в вашей деятельности вам необходимо создать объект ServiceConnection, который используется для привязки к службе. ТАК добавить что-то подобное.

/** Defines callbacks for service binding, passed to bindService() */ 
private ServiceConnection mConnection = new ServiceConnection() { 

    @Override 
    public void onServiceDisconnected(ComponentName arg0) { 
     mBound = false; 
    } 

    @Override 
    public void onServiceConnected(ComponentName name, IBinder service) { 
     // We've bound to LocalService, cast the IBinder and get LocalService instance 
     DownloadBgBinder binder = (DownloadBgBinder) service; 
     mService = binder.getService(); 
     binder.setListener(new BoundServiceListener() { 

      @Override 
      public void sendProgress(double progress) { 
       // Use this method to update our download progress 
      } 

      @Override 
      public void finishedDownloading() { 

      } 
     }); 

     mBound = true; 
    } 

Теперь ключевая строка заметить здесь

binder.setListener(new BoundServiceListener() { 

    @Override 
    public void sendProgress(double progress) { 
     // Use this method to update our download progress 
    } 

    @Override 
    public void finishedDownloading() { 

    } 
}); 

Эта часть, где я фактически посылает свой интерфейс BoundServiceListener к классу обслуживания. Класс обслуживания затем использует этот объект прослушивателя здесь

if (mListener!=null) 
     mListener.finishedDownloading(); 
    if (mListener!=null) 
     mListener.sendProgress(percent); 

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

Также обязательно включите следующее в свою деятельность, чтобы фактически связать и запустить службу.

Intent intent = new Intent(this, DownloadBgService.class); 
startService(intent); 
bindService(intent, mConnection, Context.BIND_AUTO_CREATE); 

Имейте в виду, что даже если вы привязываетесь к сервису, он фактически не запускается до тех пор, пока вы не позвоните в сервисный центр. Привязка к сервису просто подключает услугу к активности.метод StartService() вызывает услуги

onStartCommand(Intent intent, int flags, int startId) 

также объявить службу в манифесте

<service android:name=".services.DownloadBgService" /> 

Также отвязать услугу, когда активность уходит от

@Override 
protected void onStop() { 
    super.onStop(); 
    // Unbind from the service 
    if (mBound) { 
     unbindService(mConnection); 
     mBound = false; 
    } 
} 

Надеется, что это помогает.

+1

Отличный пример, спасибо, что потратили так много времени, чтобы объяснить концепцию. –

+0

@ Danuofr это работает в процессе. Есть ли способ отправить произвольный прослушиватель через границы процесса? – dcow

+2

Только проблема с этим ответом: это только для локальной службы. Но задается вопрос о том, как это сделать с помощью удаленного сервиса. Но благодарю вас за это. Но, может быть, обратите внимание, что это не ответ на реальный вопрос :) –

Смежные вопросы