2

Androidでサーバーを作成し、PCに接続するクライアントを作成するためのサンプルアプリを作成しています。サーバーソケットをサービスのスレッドに入れました。画面が消えてから数分後まで、すべてが完璧に進みます。これはAndroidがサーバーを強制終了する可能性があり、コードに完全なウェイクロックを設定しようとしましたが、それ以上強制終了しませんが、通常どおり画面をオフにします。これが私のコードです:

public class MessageListener extends Service {

    private ServerSocket serverSocket;

    @Override
    public void onCreate() {
        Log.v("Test", "Create service");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {


         PowerManager.WakeLock wl=null;
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
         wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag");
         wl.acquire();
        startServer();
        if(wl!=null) wl.release();

        return START_STICKY;
    }

    private Runnable thread = new Runnable() {

        @Override
        public synchronized void run() {
            try {



                serverSocket = new ServerSocket(Integer.parseInt(5000));
                ObjectInputStream in = null;

                while (true) {

                    Socket client = serverSocket.accept();

                    Log.v("TCP", "S: Receiving...");
                    try {
                        in = new ObjectInputStream(client.getInputStream());

                        DataInController data = new DataInController(
                                getApplicationContext());
                        data.processDataIn(in.readObject(), client);

                    } catch (ClassNotFoundException e) {
                        System.out.println("TCP S: Error in PC Server Listener");
                        e.printStackTrace();

                    } finally {
                         client.close();    
                    }
                }

            } catch (IOException e) {
            }

        }

    };
    private Thread serverThread;

    private synchronized void startServer() {
        if (serverThread == null) {
            serverThread = new Thread(thread);
            serverThread.start();
        }
    }

    private synchronized void stopServer() {
        if(serverThread!=null){
            Thread t=serverThread;
            serverThread=null;
            t.interrupt();
        }

    }


    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.v("TCP", "Killing Service!!!!!!!!!!!!!!!!!!!!!!!");
        if (serverSocket != null) {
            try {
                serverSocket.close();
                stopServer();
                Log.v("TCP", "Closed server socket");
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }
4

3 に答える 3

3

私たちのために働いた2つのこと:

  • Wi-Fiロック
  • Wi-Fiスリープポリシーを「しない」に設定します。一部のデバイスは、プログラムがWi-Fi無線をロックしている場合でも、この設定なしでWi-Fi無線の電源を切ります。
于 2011-04-16T10:21:50.117 に答える
0

問題を見つけました。つまり、ルーターはAndroidへの接続を失いました。pingを実行しようとしましたが、「到達不能」と表示されました。Wi-Fiに再接続すると機能しますが、しばらくすると再び表示されます。

于 2011-04-17T11:31:04.173 に答える
0

また、WakeLockを維持するようにしてください。両方を行うことは私のために働きます。

于 2011-08-18T18:52:25.990 に答える