Androidアプリケーションがサーバーとして機能するクライアントサーバーアプリケーションを1つ作成しています。クライアントコードはJavaで書かれています。私がやりたいのは、ユーザーがアプリケーションで他のことを続けられる間、Androidアプリケーションのバックグラウンドで接続を継続的にリッスンすることです。
Javaクライアントコードの一部は
Socket socket1 = null;
DataOutputStream dataOutputStream = null;
DataInputStream dataInputStream = null;
socket1 = new Socket(GlobalState.waiterip, 8888);
dataOutputStream = new DataOutputStream(socket1.getOutputStream());
dataInputStream = new DataInputStream(socket1.getInputStream());
dataOutputStream.writeUTF("1");
アンドロイドアクティビティコードは
Button tabstatus,menu,logout,inbox;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.waiterhome);
tabstatus=(Button)findViewById(R.id.tabstatus);
menu=(Button)findViewById(R.id.menu);
logout=(Button)findViewById(R.id.logout);
inbox=(Button)findViewById(R.id.inbox);
Intent myIntent = new Intent(getApplicationContext(),WaiterService.class);
startService(myIntent);
tabstatus.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
//some code }
});
menu.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
//some code
}
});
logout.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
//some code
});
inbox.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
//some code
}
});
}
}
私が開始しているAndroidサービスのコード、つまりWaiterServiceは
public class WaiterService extends Service
{
public IBinder onBind(Intent intent)
{
return null;
}
public void onCreate()
{
ServerSocket serverSocket = null;
Socket socket = null;
DataInputStream dataInputStream = null;
DataOutputStream dataOutputStream = null;
try
{
serverSocket = new ServerSocket(8888);
while(true)
{
socket = serverSocket.accept();
dataInputStream = new DataInputStream(socket.getInputStream());
dataOutputStream = new DataOutputStream(socket.getOutputStream());
int op=Integer.parseInt(dataInputStream.readUTF());
switch(op)
{
case 1://some code
break;
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
また、manifest.xmlファイルにサービスの説明を含めました
このコードを実行すると、logcatで次のようなエラーが発生します
04-07 12:23:53.393: W/ActivityManager(51): Launch timeout has expired, giving up wake lock!
04-07 12:23:53.399: W/ActivityManager(51): Activity idle timeout for HistoryRecord{44e00278 aac.imenu.MyDroidClient/.WaiterActivity}
04-07 12:24:03.510: W/ActivityManager(51): Timeout executing service: ServiceRecord{44dde9b0 aac.imenu.MyDroidClient/.WaiterService}
エミュレータ画面が黒くなり、アクティビティのGUIが表示されません。また、ソケット通信は行われません。
問題がどこにあるのか正確にはわかりません。Plsがこの問題の解決方法を教えてくれます。または、バックグラウンドで継続的にソケットをリッスンする他の方法はありますか。