如何使用广播接收器在Android和其他进程之间进行通信

时间:2019-05-15 15:34:25

标签: java android broadcastreceiver android-broadcast

我在自己的“活动”和“服务”之间注册了broadcastReceiver时遇到了问题,这是在清单中的另一个进程中定义的。

我尝试了其他一些技巧,例如使用handlersContentProvider 进行通信,但没有按我预期的那样工作,实际上我想连续获取数据。

这是我在服务中的代码:

Intent locationIntent = new Intent("LocationIntent");
        locationIntent.setAction("updatedLocations");
        locationIntent.setClass(getApplicationContext(), MapBoxActivity.class);
        locationIntent.putExtra("list",updatedList);
        sendBroadcast(locationIntent);

我将其注册到我的活动的OnCreate

updatedLocationBroadcast = 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" + sawLocationsList.toString());
                }
            }
        };
registerReceiver(updatedLocationBroadcast , new IntentFilter("updatedLocations"));

如我所料,我想查看我的broadcastReceiver寄存器和Timber日志localB registered!,该日志在接收器中定义,但不起作用。

那么,在另一个process中定义的Activity和Service之间进行通信并连续获取数据的最佳方法是什么?

注意:我的服务从服务器获取数据,但是服务器不是实时的,因此我通过使用handlers定期向服务器请求数据来检查数据。

1 个答案:

答案 0 :(得分:1)

  

但这不起作用

这是因为您过度指定了Intent。替换:

    Intent locationIntent = new Intent("LocationIntent");
    locationIntent.setAction("updatedLocations");
    locationIntent.setClass(getApplicationContext(), MapBoxActivity.class);
    locationIntent.putExtra("list",updatedList);
    sendBroadcast(locationIntent);

具有:

    Intent locationIntent = new Intent("updatedLocations");
    locationIntent.putExtra("list",updatedList);
    sendBroadcast(locationIntent);

但是请注意,任何应用程序都可以收听此广播。考虑在setPackage()上使用Intent来限制向您自己的应用程序的交付。

  

在另一个流程中定义的Activity和Service之间进行通信并连续获取数据的最佳方法是什么?

如果我被迫进行流程分离,我会考虑使用Messenger

  

我的服务从服务器获取数据,但服务器不是实时的,因此我通过使用处理程序定期向服务器请求来检查数据。

多年来,这不是推荐的模式。请使用WorkManager。或者,如果您不适合采用JobScheduler(因为它是AndroidX的一部分),请使用WorkManager。无论采用哪种方法,您都可以摆脱第二个过程,从而大大简化了沟通。