在服务和班级之间进行沟通

时间:2016-07-22 15:10:41

标签: java android service

在我的MainActivity中,我使用

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

创建一个blutetooth连接服务,如果is.connect()返回true,我想在不使用广播器的情况下将服务中的变量传递给单独的类。如果我创建CheckIfConnected() int服务,我如何从一个单独的类中调用它?

由于

2 个答案:

答案 0 :(得分: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
   }
}

请记住,您可以将您想要的任何内容传回给您所选择的变量!

如果您在活动或片段中,可以在unregisteronDestroy举办活动:

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

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

这应该使您的服务和任何其他课程之间的沟通变得轻松!

我希望你能让它运转起来 - 祝你好运,编码愉快!

答案 1 :(得分: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() {
      ...
   }
}