我正在开发一个Android应用程序。该应用程序体系结构分为5个模块,其中2个模块具有多个功能。为了开发这个应用程序,我创建了2个进程,根据需要包含多个线程和3个其他线程。关于这个实现,我有一些问题:
这是一个好模特吗?如果没有,为什么不呢?现在我只考虑模块化。
我需要从进程1中的广播接收器向进程2中的服务线程发送消息,这是最好的方法吗?
android中最好的IPC机制是什么?我尝试使用此链接,http://androidapps.org.ua/androidintro_ipc_intent.html建议使用startActivity和startActivityForResult,但这些选项在广播接收器中不可用,并且服务没有startActivityForResult选项。
谢谢。
答案 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()