1

こんにちは、サーバーとの tcp/ip 接続を作成するサービスにバインドする小さなチャット アプリケーションがあります。私はaidlを使用しています。

私の問題は、特に destroy メソッドで画面の向きを処理する方法がわからないことです。

サービスを常にオンラインにしたいのですが、アプリケーションが破壊されたときにサービスを停止したくありません。

今のところ、「リークされた接続の問題」を解決するために、「onDestroy」メソッド unbindService(conn) を使用しています。

アクティビティが再作成されたときに破棄された後、フリーズします。ありがとうございます。ここにいくつかのコード スニペットを示します。

serviceIntent = new Intent(getApplicationContext(),ChatService.class);
    boolean result = bindService(serviceIntent, conn,Context.BIND_AUTO_CREATE);
    startService(new Intent(getApplicationContext(),ChatService.class));
    Log.d(TAG, "Service binded");

@Override
protected void onDestroy() {
    Log.d(TAG, "ON DESTROY");
    unbindService(conn);
    super.onDestroy();
}
4

3 に答える 3

2

サービスには UI がないため、これはサービスに依存するのではなく、アクティビティに依存すると言うことができます。戻り値START_STICKYonStartCommand()、バインドを解除しても実行している必要があることを示しています。基本的に、永続的な (Android OS が強制終了するまで永続的ではない) 実行中のサービスにいつでもバインド/バインド解除できます。

アクティビティ オーバーライドonConfigurationChange()メソッドで何もしないで、次にマニフェストで を使用しますandroid:configChanges="orientation"

于 2012-08-13T14:04:44.343 に答える
0

ServicestartForeground()(リンク)を調べます。Service死んでもやり直せるなら、onStartCommand()とを調べてくださいSTART_STICKY

于 2012-08-13T13:57:15.287 に答える
0

あなたが経験しているように、これは毎回起こります。bindedService を持つことは、実際にはそのアクティビティを他のアクティビティよりも長くメモリに保持しようとします。onDestory でサービスからバインドを解除しないことをお勧めします。ライフサイクルイベントではなく、ログアウトボタンのようなコマンドでサービスのバインドを解除します。

そのため、画面が回転してもバインドを解除せず、既に実行中のサービスに再バインドするだけです。ユーザーがアクティビティを強制終了した場合、サービスはある時点でクリーンアップされる必要があります。システムは、バインドされたサービスが何も接続されていない状態で実行されていることを確認し、システムによってクリーンアップされるためです。

于 2012-08-13T14:01:11.580 に答える