新的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