新的Android程序员在这里。我有一个执行套接字管理和异步I/O的服务,我需要在它和应用程序中的活动之间建立一条通信路径。Android中的活动和服务之间的通信方法
当前的方法是为Service和Activity配备BroadcastReceivers并使用它们将活动的'命令'意图发送到服务,并将“提醒”意图从服务发送到活动。
我的服务有一个runnable,这是socket read()发生的地方;当接收到的数据的,可运行发送“输入数据的意图的服务,谁再提醒活动:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
if (m_IsRunning == false) {
m_IsRunning = true;
(new Thread(new Runnable() {
byte[] inputBuffer = new byte[512];
public void run() {
while (m_IsRunning) {
if (m_IsConnected) {
try {
m_Nis = m_Socket.getInputStream();
m_Nis.read(inputBuffer, 0, 512);
Intent broadcast = new Intent();
Bundle bun = new Bundle();
bun.putString("ServiceCmd", "ALERT_INCOMING_DATA");
bun.putByteArray("MsgBuffer", inputBuffer);
broadcast.putExtras(bun);
broadcast.setAction(BROADCAST_TO_SERVICE);
sendBroadcast(broadcast);
} catch (IOException e) {
// Send fault to activity
}
}
}
}
})).start();
}
return START_STICKY;
}
我与广播接收器的做法是这样的:
private BroadcastReceiver serviceReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bun = intent.getExtras();
String cmdString = bun.getString("ServiceCmd");
if (cmdString.equals("CMD_SETHOSTINFO")) {
// The activity has requested us to set the host info
String hostAddr = bun.getString("HostAddressString");
int hostPort = bun.getInt("HostPortNumber");
processSetHostInfoCommand(hostAddr, hostPort);
}
else if (cmdString.equals("CMD_CONNECT")) {
// The activity has requested us to connect
if ((m_IsRunning) && (m_IsConnected == false)) {
// Attempt to connect
processConnectCommand();
}
}
else if (cmdString.equals("CMD_DISCONNECT")) {
// The activity has requested us to disconnect
if ((m_IsRunning) && (m_IsConnected == true)) {
// Attempt to disconnect
processDisconnectCommand();
}
}
else if (cmdString.equals("CMD_SENDDATA")) {
// The activity has requested us to send data
if ((m_IsRunning) && (m_IsConnected == true)) {
// Attempt to send data
byte[] msgBuffer = bun.getByteArray("MsgBuffer");
processSendDataCommand(msgBuffer);
}
}
else if (cmdString.equals("ALERT_INCOMING_DATA")) {
// Our TCP receiver thread has received data
if (m_IsRunning) {
byte[] msgBuffer = bun.getByteArray("MsgBuffer");
processIncomingDataAlert(msgBuffer);
}
}
}
};
(那些processWhatever()
方法一般做套接字管理和数据传输。)
就像我说的,它似乎工作正常,但我想知道这是不是使用消息和处理程序不会更合适的情况。
因此,具体问题是:
什么是“Android的陶”在决定何时使用广播接收器/意图或处理器/信息?
当决定使用哪种方法时,是否存在跨线程考虑因素?
(而且,虽然这是题外话,最后一个问题):
- 适合做那种基于套接字的我的服务/ O我想要做什么?
Franci - 很多很多谢谢 - 你的文章不仅解决了我的问题,而且还回答了其他几个未经询问)的问题! – Literata