两个Android前台服务之间的通信:意图与广播?

时间:2018-03-08 05:57:48

标签: android android-intent broadcastreceiver

因此,我的应用 FooService BarService 中有两项服务。在这些服务之间进行通信的最有效方式是什么?更具体地说,通过使用 startForegrounService 发送意图与使用本地广播管理器发送广播的动作的通信有何不同?

使用onStartCommand

FooService.class

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    final int i = super.onStartCommand(intent, flags, startId);
    String intentAction = null;
    if(intent!=null)
        intentAction = intent.getAction();
    if(intentAction ==null)
        return i;
    switch (intentAction) {
        case "Message A":
         // do something with Message A    

            break;
        case "Message B":
         // do something with Message B
        default:
            return i;
    }
    return i;
}

BarService.class

Intent myIntent = new Intent(this, FooService.class).setAction("Message A");

startService(myIntent);

1 个答案:

答案 0 :(得分:0)

最好是使用LocalBroadCast Manager。使用Intents来启动和停止服务,您每次都必须处理onStartCommand而不是启动这两项服务并使用LocalBroadCast Manager进行通信非常有效。

在你的Foo服务中,

LocalBroadcastManager broadcaster;
 @Override
    public void onCreate() {
        broadcaster = LocalBroadcastManager.getInstance(this);
    }

发送您的广播

Intent intent = new Intent("com.FooService");
 broadcaster.sendBroadcast(intent);

在您的BarService中

private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {

            //Your Action here

        }
    };


@Override
    protected void onCreate() {
        super.onCreate();
        LocalBroadcastManager.getInstance(this).registerReceiver((mMessageReceiver),
                new IntentFilter("com.FooService")
        );
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
    }

编辑1

比较绑定服务和LocalBroadCast管理器绑定服务的效率要高得多,因为它们只绑定一次并且可以相互通信而无需启动任何Intent。

Here is an example explaining the binding