如何在不同的过程中使用LocalBroadcastManager在活动和服务之间进行通信

时间:2019-05-14 19:19:43

标签: java android android-activity android-broadcast localbroadcastmanager

我有一个服务,它与清单和MapboxMap活动中定义的过程不同,我只是想知道如何使用LocalBroadcastManager在服务和活动之间进行通信。

我尝试将服务上下文传递给LocalBroadcastManager.getInstance(),然后在我的Activity中注册LocalBroadcast。它已成功注册,但无法从我的服务中获取信息!

这是我的代码,在我的服务中...

Intent locationIntent = new Intent("LocationIntent");
        locationIntent.setAction("updatedLocations");
        locationIntent.putExtra("list",updatedList);
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(locationIntent);

...我将其注册到我的活动中:

LocalBroadcastManager.getInstance(getApplicationContext()).registerReceive``r(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                Timber.tag("localB").d("registered!");
                if (intent != null && intent.getAction() != null && 
intent.getAction().equals("updatedLocations")) {
                    sawLocationsList = (HashMap<Integer, 
MarkerItem>)intent.getSerializableExtra("list");
                    Timber.tag("sawL").d("updated");
                }
            }
        } , new IntentFilter("LocationIntent"));

当我运行该应用程序时,我的服务会发送广播,但我的活动未收到广播消息!

我认为问题是因为我的服务是在清单中的另一个过程中定义的,就像这样...

android:name=".services.ForegroundService"
            android:enabled="true"
            android:exported="false"
            android:process=":ForegroundService"

...但是我想以这种方式进行交流,因为处于不同的过程可以帮助我实现电池效率目标。

1 个答案:

答案 0 :(得分:3)

  

如何在不同的过程中使用LocalBroadcastManager在活动和服务之间进行通信

这是不可能的。 LocalBroadcastManager中的“本地”表示“此过程本地”。 LocalBroadcastManager特别不适用于进程之间。

要么:

  • 将活动和服务都置于同一过程中,或者

  • 使用某种形式的IPC在进程之间进行通信(系统广播,Messenger等)