Я прочитал documentation about Bound Services, где показано, что вы можете легко общаться через сообщения от активности к удаленному (т.е. не в том же контексте) услуг, но есть ли способ, чтобы отправлять сообщения от службы до Связанные должности? Например, моя активность связана с работающей фоновой службой того же приложения, отправляет ей сообщение и при приеме этого сообщения служба отвечает сообщением о деятельности. Как это реализовать? Можете ли вы указать мне какую-то документацию, которая объясняет эту тему?Как удаленная служба может отправлять сообщения связанным действиям?
ответ
Нашел пример в справочной документации по адресу Remote Messenger Service Sample.
ПРИМЕЧАНИЕ. Это относится только к службам и действиям в процессе, а не к удаленному, как заданный вопрос.
Использование службы для связи с деятельностью включает в себя создание слушателя, который вы можете передать службе из этой деятельности.
Вам необходимо сделать услугу, связанную с деятельностью.
Первый шаг - сделать сервис. В службе убедитесь, что у вас есть объект 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;
}
}
Надеется, что это помогает.
Отличный пример, спасибо, что потратили так много времени, чтобы объяснить концепцию. –
@ Danuofr это работает в процессе. Есть ли способ отправить произвольный прослушиватель через границы процесса? – dcow
Только проблема с этим ответом: это только для локальной службы. Но задается вопрос о том, как это сделать с помощью удаленного сервиса. Но благодарю вас за это. Но, может быть, обратите внимание, что это не ответ на реальный вопрос :) –
- 1. Удаленная служба Vs. Местная служба
- 2. Редакция: Удаленная служба
- 3. Насколько плохо удаленная служба?
- 4. Nodejs может отправлять сообщения владельцу сообщения отправителю
- 5. Удаленная служба Android
- 6. Может ли приложение отправлять сообщения «Входящие» пользователям?
- 7. не может отправлять сообщения в чате
- 8. Android HttpURLConnection не может отправлять данные сообщения
- 9. PHP mailer не может отправлять html-сообщения
- 10. Twilio - не может отправлять SMS-сообщения никому?
- 11. не может отправлять сообщения/v2/субъекты
- 12. Azure EventHub отправитель не может отправлять сообщения
- 13. Logstash не может отправлять сообщения Graylog
- 14. Socket.io не может отправлять два последовательных сообщения?
- 15. Может ли служба Windows получать сообщения Windows?
- 16. Как отправлять сообщения на Java?
- 17. LWP :: UserAgent не может отправлять сообщения с TLS1.1
- 18. Отправлять нежелательные сообщения в TOMCAT
- 19. Как отправлять сообщения в твиттер?
- 20. Как отправлять сообщения нескольким пользователям?
- 21. Как отправлять сообщения в жилах?
- 22. Как отправлять сообщения между компаниями
- 23. Как отправлять сообщения в Tropo
- 24. Удаленная остановка Служба без прав администратора
- 25. OMNET отправлять сообщения
- 26. Как Apache Kafka может отправлять сообщения нескольким группам потребителей?
- 27. Как клиент может отправлять и получать сообщения одновременно с сокетами?
- 28. Может ли служба отчетов SQL отправлять электронную почту?
- 29. Удаленная служба Windows все еще работает
- 30. Удаленная служба Android с помощью helpl
Есть ли реальная ситуация в мире, где нам понадобится привязка удаленного обслуживания? –