Шаблон инициализации ServiceConnection

276
28 января 2017, 09:19

Каким образом лучше абстрагировать механизм привязки 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;
    };
};
Answer 1

Зачем вы делаете 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();

Просьба ногами не бить, если не компилируется. Тут точно есть синтаксические ошибки - здесь только изложена идея.

READ ALSO
Как изменить иконку исполняемого файла

Как изменить иконку исполняемого файла

На днях столкнулся с такой проблемой: создал артефакт в IntellijIdea 2016программа мне выдала инсталятор и

329
PSQLException: ERROR: relation &ldquo;table_name&rdquo; does not exist

PSQLException: ERROR: relation “table_name” does not exist

Здравствуйте, не понимаю, что происходитОшибка появляется как то рандомно

373
проблемы с TabLayout

проблемы с TabLayout

Создаю TabLatout с использованием дополнительных классов SlidingTabLayout и SlidingTabStrip нашел в GitHube, эти классы позволяют прокручивать TabLayout

311
Проверять текст в listview

Проверять текст в listview

Не совсем понимаю принцип работы метода представленным в оффдокументации withItemContent

329