Каким образом лучше абстрагировать механизм привязки Android-Service, и стоят ли свеч попытки уменьшить повторяемость кода?
Решение через копирование кода для каждого Service (по android.com/guide):
/** Точка доступа к ChatServerService. */
private ChatServerService mChatServerService;
/** Точка доступа к ChatClientService. */
private ChatClientService mChatClientService;
/** Объект подключения к Service'у ChatServerService */
private final ServiceConnection mServerConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
// Получение объекта сервиса при успешном подключении
mChatServerService = ((ChatServerService.LocalBinder) service).getService();
};
@Override
public void onServiceDisconnected(ComponentName arg0) {
Toast.makeText(getBaseContext(), "Неявный разрыв...", Toast.LENGTH_LONG).show();
mChatServerService = null;
};
};
/** Объект подключения к Service'у ChatClientService */
private final ServiceConnection mClientConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
// Получение объекта сервиса при успешном подключении
mChatClientService = ((ChatClientService.LocalBinder) service).getService();
};
@Override
public void onServiceDisconnected(ComponentName arg0) {
Toast.makeText(getBaseContext(), "Неявный разрыв...", Toast.LENGTH_LONG).show();
mChatClientService = null;
};
};
Зачем вы делаете ServiceConnection анонимным классом? Сделайте свой класс реализующий интерфейс ServiceConnection, типа:
public class MyServiceConnection implements ServiceConnection {
private Class<?> myServiceBinderClz;
private Service myService;
public MyServiceConnection(Class<?> myServiceBinderClz) {
this.myServiceBinderClz=myServiceBinderClz;
}
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
myService = ((myServiceBinderClz) service).getService();
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
myService=null;
}
public Service getService() {return myService;}
}
Тогда вызываем типа:
MyServiceConnection myServiceConnection = new MyServiceConnection(ServerChatService.LocalBinder.class);
mServerChatService=myServiceConnection.getService();
Просьба ногами не бить, если не компилируется. Тут точно есть синтаксические ошибки - здесь только изложена идея.
Продвижение своими сайтами как стратегия роста и независимости