私が開発しているアプリケーションでは、TCPソケット接続を使用するバインドされたサービスがあります。このサービスの要件は、最後にサービスにバインドされたアクティビティがシャットダウンされた後、しばらくの間、ソケット接続を維持することです(例えば、1分間)。これは、別のアクティビティがサービスに接続した直後に別のアクティビティがサービスに接続したときに、不要なソケット再接続を回避するためです。バインドされたサービスとタイムアウト
開始済みサービスの使用を提案する同様の問題(Service, Rebind or not bound at all?)を検索して見つけましたが、現在のアプリケーションアーキテクチャではバインドされた接続が使用されており、必要がない場合は再設計したくありません。したがって、私は他のオプションを探しています。
私の質問は、私が何とかバインドされたサービスの破壊を延期することができているか、唯一の良いアプローチは、このように、それがサービスを開始するために変換し、インテントを使用してサービスへの通信を書き換えることでしょうか?
public class SocketService extends Service {
private static final String LOG_TAG = SocketService.class.getSimpleName();
@Override
public final IBinder onBind(final Intent intent) {
Log.d(LOG_TAG, "onBind()");
return new LocalBinder<SocketService>(this);
}
@Override
public boolean onUnbind(Intent intent) {
Log.d(LOG_TAG, "onUnbind");
return super.onUnbind(intent);
}
@Override
public void onCreate() {
Log.d(LOG_TAG, "onCreate");
// create socket connection here
// ...
//
super.onCreate();
}
@Override
public void onDestroy() {
Log.d(LOG_TAG, "onDestroy");
// close socket connection
// ...
//
super.onDestroy();
}
// Other socket sending and receiving logic
// ...
//
}
お時間をありがとうございます。
少なくとも私の場合は、AFAIK Androidのコントロールがアクティビティが破棄されたときに動作しないと思います。だから、ユーザーが自分のアクティビティで「戻る」を押すと、onDestroyが呼び出される可能性が高くなります。一方、私は接続リークを避けるためにサービスからActivity.onDestroyをアンバインドする必要があります。 – pkk
Androidは、finish()を呼び出してアクティビティが破壊されたとき(極端な場合のみ)を制御しません。あなたが新しいアクティビティを起動したときに古いものを終了しなかった場合、サービスで2番目のonCreateを起動せず、あなたのアクティビティやアンドロイドを破壊することに決めたとき(彼はメモリが必要なため...)、onDestroy関数アクティビティが呼び出され、最後のものが破棄されると、TCP接続とサービスが終了して終了します。 – Rick
私は、例えば、ユーザが「戻る」キーを押すなどして、アクティビティを閉じたいので、終了します。それでもサービスは、バインド解除後に指定された時間だけ生存する必要があります... – pkk