如何将消息/数据从广播接收器(process1)发送到android中的Service thread(process2)?

时间:2013-05-07 16:01:55

标签: android ipc android-broadcast

我正在开发一个Android应用程序。该应用程序体系结构分为5个模块,其中2个模块具有多个功能。为了开发这个应用程序,我创建了2个进程,根据需要包含多个线程和3个其他线程。关于这个实现,我有一些问题:

这是一个好模特吗?如果没有,为什么不呢?现在我只考虑模块化。

我需要从进程1中的广播接收器向进程2中的服务线程发送消息,这是最好的方法吗?

android中最好的IPC机制是什么?我尝试使用此链接,http://androidapps.org.ua/androidintro_ipc_intent.html建议使用startActivity和startActivityForResult,但这些选项在广播接收器中不可用,并且服务没有startActivityForResult选项。

谢谢。

3 个答案:

答案 0 :(得分:2)

使用自定义BroadcastReceiver

将此内容写入 ActivityA.java

 Intent intent = new Intent();
 intent.putExtra("message","hi");
 intent.setAction("com.android.activity.SEND_DATA");
 sendBroadcast(intent); 

将此内容写入 ServiceA.java

private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
   // Extract data included in the Intent
   String message = intent.getStringExtra("message");
   Log.d("receiver", "Got message: " + message);
  }
};

现在注册Receiver

LocalBroadcastManager.getInstance(mContext).registerReceiver(mMessageReceiver,
  new IntentFilter("com.android.activity.SEND_DATA"));   

答案 1 :(得分:1)

只需在Intent中创建BroadcastReceiver,将您的数据添加为额外内容,即可使用startService()致电Intent

Intent intent = new Intent(context, MyService.class);
intent.putExtra("message", "whatever data you need to pass to the service");
context.startService(intent);

方法onStartCommand()将在您的服务中使用传递的Intent

进行调用

要回答你的另一个问题“什么是最好的IPC方法”,答案(一如既往)是“取决于”。使用Intent是最简单的方法,因为它支持开箱即用的所有组件。如果组件之间需要更复杂的交互,可以使用AIDL查看,这将允许您在Service中进行远程方法调用。如果仍然不够,那么只需在两个组件之间实现自己的套接字协议。

答案 2 :(得分:-1)

首先,尝试理解您的术语。通过过程,我认为你的意思是活动和“服务线程”,我认为你的意思是服务。

如果要从onReceive()广播接收器(在活动1的上下文中运行)向已经激活的服务发送消息,可以尝试以下操作之一:

1)创建一个新的intent(服务类名作为类)并使用intent调用startService()。添加您需要的其他参数作为意图额外。如果您的服务已经处于活动状态并且仍然调用了onStartCommand(),则可以将特殊参数作为intent ads来区分onStartCommand()和onReceive。

2)如果您的方案允许这样做,请考虑在您的活动和服务中注册相同的广播事件并采取适当的行动(然后无需传递消息)

3)在你的服务中写下另一个广播接收器并从Activity的广播接收器中调用sendBroadcast()