应用程序如何与服务进行通信

5

我希望能够从我的Android应用程序与我的Android服务进行通信。我有两个选项,但我不知道该选择哪个:

  1. 将服务与应用程序注册
  2. 使用LocalBinder从应用程序连接到服务。

解决方案1:

应用程序:

public class MyApplication extends Application {

    MyService myService;

    public void setMyService(MyService myService) {
        this.myService = myService;
    }

    public void testCallService(){
        myService.sendResponseApdu("test".getBytes());
    }
}

还有服务:

public class MyService extends HostApduService {

    @Override
    public void onCreate() {
        super.onCreate();
        ((MyApplication)getApplication()).setMyService(this);
    }

    @Override
    public byte[] processCommandApdu(byte[] commandApdu, Bundle extras) {
        return new byte[0];
    }

    @Override
    public void onDeactivated(int reason) {

    }
}

应用程序使用对服务的引用来调用服务。 该服务是本地服务(不是远程服务)。 这种方法在所有情况下都适用吗?

解决方法2

使用LocalService方法并使用ServiceConnection绑定到服务,遵循示例上的方式http://developer.android.com/reference/android/app/Service.html#LocalServiceSample

解决方案2可行。解决方案1也可行吗?与解决方案2相比,解决方案1有什么优缺点?


1
为什么你要继承Application呢?这不是与一个Service通信的好的设计方法。 - Squonk
我们扩展应用程序以进行一次性初始化并保留对会话的引用。 - userM1433372
6个回答

2
根据官方Android文档,服务旨在在后台执行长时间运行的操作,如果服务与活动之间有大量交互,则建议使用绑定服务。使用绑定服务的原因是绑定具有丰富的通信接口优势。

https://dev59.com/zVTTa4cB1Zd3GeqPtIQb#5066187

我曾经在一个类似的应用程序上工作,我选择了绑定服务,原因是可以通过接口从活动到服务进行通信,并使用Localbroadcastreceiver从服务向活动传递事件。

0
我认为第二种方法最好,因为第一种方法的耦合更紧密。

0

使用绑定器,或说 AIDLS 用于进程间通信时,最好总是通过引用来使用。如果出现泄漏或死引用的情况,您的应用程序将会崩溃。


在哪些情况下,解决方案1会导致死引用? - userM1433372

0
如果您想要完全解耦,可以使用广播接收器。

0

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接