Ответ 1
Вы можете использовать bindService(Intent intent, ServiceConnection conn, int flags)
вместо startService
для запуска службы. И conn
будет внутренним классом, как:
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mMyService = ((CommunicationService.MyBinder) service).getService();
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
mMyService
является экземпляром вашего CommunicationService
.
В своем CommunicationService
просто переопределите:
public IBinder onBind(Intent intent) {
return new MyBinder();
}
и следующий класс в CommunicationService
:
public class MyBinder extends Binder {
public CommunicationService getService() {
return CommunicationService.this;
}
}
Таким образом, вы можете использовать mMyService
для доступа к любым общедоступным методам и полям в вашей деятельности.
Кроме того, вы можете использовать интерфейс обратного вызова для доступа к активности в своей службе.
Сначала напишите интерфейс, например:
public interface OnChangeListener {
public void onChanged(int progress);
}
и в вашем сервисе добавьте общедоступный метод:
public void setOnChangeListener(OnChangeListener onChangeListener) {
this.mOnChangeListener = onChangeListener;
}
вы можете использовать onChanged
в своей службе в любом месте и реализовать только в своей деятельности:
public void onServiceConnected(ComponentName name, IBinder service) {
mMyService = ((CommunicationService.MyBinder) service).getService();
mMyService.setOnChangeListener(new OnChangeListener() {
@Override
public void onChanged(int progress) {
// anything you want to do, for example update the progressBar
// mProgressBar.setProgress(progress);
}
});
}
ps: bindService
будет выглядеть следующим образом:
this.bindService(intent, conn, Context.BIND_AUTO_CREATE);
и не забывайте
protected void onDestroy() {
this.unbindService(conn);
super.onDestroy();
}
Надеюсь, что это поможет.