つまり、Androidは、実行を継続するためにリソースを占有するすべてのアプリケーションを強制終了できます。アプリが強制終了される恐れのあるシナリオを処理する方法については、責任があります。
開発者のサイトにあるサービスのライフサイクルを確認することをお勧めします。
まず、サービスやアクティビティを問わず、このように大量に動作するアプリケーションは、Androidの観点からは「失礼」と見なされるため、この方法で強制終了する準備ができています。
たとえば、onLowMemory
オーバーライドメソッドをリッスンし、それに応じてデータの保存や注意事項などを実行します。
実際に発生するはずのことは、このサービスがスレッドを生成して、この方法で着信接続を定期的にリッスンすることです。
while (!terminating){
Socket incomingClientSocket = ourServerSocket.accept();
// How you handle this part is up to you?
Thread.sleep(500); // Sleep for 500 ms
}
terminating
変数はaであり、boolean
ループをいつ終了するかを制御する決定変数です。メソッドがどのように使用されているかに注意してくださいThread.sleep
。実行を「落ち着かせる」ために、省略された場合、Androidはアプリに十字線を付けて終了します。つまり、システムリソースに対して礼儀正しくなります。
ヒント:クラスを拡張しメソッドThread
を介して着信接続を処理する機能を保持しますaccept()
がnull以外にincomingClientSocket
なると、別のスレッドが作成され、の入力/出力ストリームが開かれ、バイナリincomingClientSocket
方式を使用して読み取り/書き込みが行われます。
この方法は設計が不十分であることを示しており、データがテキスト形式であると想定して使用しないでくださいreadline
。たとえば、クライアントへの1つの着信パケットは720バイトであり、その後に着信する次のパケットは564バイトである可能性があります。それがTCP/IPの性質です。
開始マーカーと終了マーカーなど、データ送信の境界を確立するためのより信頼性の高い方法を考え出す必要があります。サーバーに着信データを読み取らせ、開始マーカーと終了マーカーで構成されるバイトストリームを一度に区別させます。両方が存在し、マーカー間の実際のデータを抽出し、それに応じて動作します。
たとえば、incomingClientSocket
それが実際にnullでなくなったときに、アクティビティにブロードキャストを送信してそれに基づいて動作させ、アクティビティを許可し、そのソケットを取得して、接続を開き、入出力との間で読み取り/書き込みを行うことができます。ソケットに関連付けられたストリーム。