Android
Introduction
Hello Threads
@2010 Mihail L. Sichitiu
Goal
Create an application
that uses a
background thread
as a UDP server to
receive messages
from the UDP client
@2010 Mihail L. Sichitiu
[Link]
Text sent from UDPClient
Layout
TextView that changes
from Starting Server to
Server Started (optional)
[Link]
TextView that shows the
IP address of the server
(needed for UDPClient)
Text sent from UDPClient
Clear Button clears the
Last Message (and shows
that interface is still
responsive)
TextView that shows the
text sent from UDPClient
@2010 Mihail L. Sichitiu
Application Structure
ServerThread
Main Activity
OnCreate( )
Constructor
Create the thread
Start the thread
UDPClient
Read line from input
Open the Socket
If successful Server Started
Find and display the IP Address
run( )
Message
Handler
while (socketStillOpen){
receive packet
display Message
send reply
}
OnDestroy( )
Send line to Server
Receive line from Server
close the socket
OnClickListener( )
Display line
Clear the Last Message
HelloThreads
@2010 Mihail L. Sichitiu
UDPClient
Main Activity
(HelloThreads)
ClassMembers
TextView
isRunning,myIPAddressField,lastMessage;
Button
clear;
ServerThread myThread;
Handler
OnCreate( )
Get handles (findViewById) to all GUI elements
Create ServerThread: myThread=new
ServerThread(getApplicationContext(),mHandler)
Start the Thread: [Link]();
Register the OnClickListener for the Clear Button
OnDestroy( )
Handler
Definition on
Next page
[Link]();
OnClickListener( )
Clear the Last Message
@2010 Mihail L. Sichitiu
The Handler Definition
private final Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch ([Link]) {
case PACKET_CAME:
String incomingMessage = (String) [Link];
[Link](incomingMessage);
break;
case IS_RUNNING:
String socketStatus = (String) [Link];
[Link](socketStatus);
break;
case IP_ADDRESS:
InetAddress myIPAddress = (InetAddress) [Link];
[Link]("Server IP Address:"+[Link]());
break;
}
}
};
@2010 Mihail L. Sichitiu
ServerThread
public class ServerThread extends Thread
Class Members
public ServerThread(Context currentContext,Handler handler){
mContext = currentContext;
mHandler = handler;
Open the socket; if successful
[Link](HelloThreads2.IS_RUNNING, "Server
On Next
Started").sendToTarget();
Page
InetAddress myIP = getMyWiFiIPAddress();
[Link](HelloThreads2.IP_ADDRESS, myIP).sendToTarget();
public void closeSocket()
Handler mHandler; // link to the Message Handler
Context mContext; // link to application context
DatagramSocket serverSocket; // the UDP socket well receive at
[Link]();
public void run()
On Next
Next Page
@2010 Mihail L. Sichitiu
Allows the socket to
be closed (call from
OnDestroy())
7
Getting the IP Address:
getMyWiFiIPAddress( );
WifiManager mWifi = (WifiManager)
([Link](Context.WIFI_SERVICE));
WifiInfo info = [Link]();
DhcpInfo dhcp = [Link]();
int myIntegerIPAddress = [Link];
byte[] quads = new byte[4];
for (int k = 0; k < 4; k++)
quads[k] = (byte) ((myIntegerIPAddress>> k * 8) & 0xFF);
try{
InetAddress myIPAddress = [Link](quads);
return myIPAddress;
}catch(Exception e){
if(D) Log.e(TAG,"Cannot Get My Own IP Address");
return null
}
@2010 Mihail L. Sichitiu
[Link]( )
boolean socketOK=true; // True as long as we don't get
socket errors
Handles multiple requests
as long as the socket is OK
while(socketOK) {
DatagramPacket receivePacket = new DatagramPacket(receiveData,
[Link]);
try{
Blocks
[Link](receivePacket);
/*** ..... Same as the UDP server ........ ****/
[Link](HelloThreads2.PACKET_CAME,sentence).s
endToTarget();
To the
} catch (Exception e){
socketOK = false;
Message
Handler in the
}// try
main Thread
}// while(socketOK)
@2010 Mihail L. Sichitiu
Android Manifest
To be able to use the Internet (open sockets) and to read our
own IP address (from the WiFi Manager):
<uses-permission android:name="[Link]" />
<uses-permission
android:name="[Link].ACCESS_WIFI_STATE" />
@2010 Mihail L. Sichitiu
10