2016-07-22 3 views
0

В моем MainActivity я используюСвязь между службой и классом

Intent serviceIntent = new Intent(this, myService.class); 
bindService(serviceIntent,serviceConn, Context.BIND_AUTO_CREATE); 

для создания службы соединения blutetooth, если is.connect() возвращает истину, я хочу передать переменный из службы в отдельный класс без использования вещателя. Если я создаю CheckIfConnected() int service, как мне его назвать из отдельного класса?

Thanks

ответ

1

Самый простой способ общаться легко и без плотного соединения кода приложения, попробуйте использовать events. Мое избранное: EventBus - android library. Вот как вы можете это сделать:

Добавьте это в build.gradle файл (модуль уровня)

compile 'org.greenrobot:eventbus:3.0.0' 

Далее создайте Plain Old Java Object (POJO), чтобы представить ваше мероприятие!

public class ServiceConnectedEvent{ 
    private boolean isServiceConnected; 

    ServiceConnectedEvent(boolean isConnected){ 
     this.isServiceConnected = isConnected; 
    } 

    public boolean isServiceConnected{ 
     return this.isServiceConnected; 
    } 
} 

Далее, в службе, которая будет выступать в качестве publisher, опубликовать событие так:

EventBus.getDefault().post(new ServiceConnectedEvent(true)); 

Теперь в классе, который вы хотите уведомить о состоянии подключения услуги, вы можете зарегистрировать его, чтобы сделать его subscriber так:

EventBus.getDefault().register(this); 

чтобы действительно получить уведомление в своем классе, добавьте этот метод:

public void onEvent(ServiceConnectedEvent event){ 
    if(event.isServiceConnected()){ 
     //do what you need when service is connected 
    } 
} 

Помните, что вы можете вернуть все, что хотите, как переменную по вашему выбору!

Если вы находитесь внутри деятельности или фрагмента, вы можете unregister события внутри onDestroy:

@Override 
public void onDestroy(){ 
    super.onDestroy(); 

    EventBus.getDefault().unregister(this); 
} 

Это должно сделать вашу связь между вашим сервисом и любым другим классом легко !!

Надеюсь, вы получите его работу - удачи и счастливого кодирования!

0

Возможно, вы можете использовать метод обратного вызова. Вы можете создать свой собственный класс Intent, который расширяет его, но обладает интерфейсом, который содержит метод, который вы хотите вызвать. Затем вы можете переопределить метод connect(), который затем вызовет этот метод интерфейса перед возвратом true. Затем вам нужно будет сделать ваш отдельный класс реализовать ваш CustomIntent.ConnectInterface и сделать его переопределением вашего метода интерфейса. Я думаю, что это сработает, если я правильно пойму вашу проблему.

public class CustomIntent extends Intent { 
    public interface ConnectInterface { 
     public void connectInterfaceCallback(); 
    } 
    private ConnectInterface callback; 
    public CustomIntent(ConnectInterface callback){ 
     super(); 
     this.callback = callback; 
    } 
    @Override 
    public boolean connect() { 
     if(super.connect()){ 
     callback.connectInterfaceCallback(); 
     return true; 
     } else { 
     return false; 
     } 
    } 
} 

И потом:

public class SeparateClass implements CustomIntent.ConnectInterface { 
    ... 
    @Override 
    public void connectInterfaceCallback() { 
     ... 
    } 
} 
+0

Отредактировано с помощью небольшого примера, иллюстрирующего то, что я пытался сказать. – h3X3n

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