2

私のクラスにはこのようなメソッドがあります。Activity

@Override
public void onDestroy() {
    Log.i("onDestory: ", "Inside OnDestory!");
    bluetoothCommunicator.destroyedApp();
    super.onDestroy(); 
}

メソッドは次のdestroyedApp()ようになります。

public void destroyedApp() {
        if(server != null)
            server.destroy();   
}

server拡張するクラスのインスタンスはどこにありますかThread

シナリオは次のとおりです。

初めてアプリケーションを開いています。onCreateメソッド内で、を設定するbluetoothクラスの新しいインスタンスを作成しますBluetoothServerSocket。これは正常に機能し、ファイルを携帯電話に転送できます。

これは、スレッドがまだ生きているため、アプリケーションをバックグラウンドで使用している場合にも機能します。

だが

私がアプリケーションを殺しているとき、Activity Life Cycle

ここでの活動のライフサイクル

このonDestroy()メソッドは、Androidフレームワークによって呼び出される必要があります。そして、もう一度アプリケーションを起動すると、onCreateメソッドが呼び出されるはずですが、のインスタンスBluetoothServerSocketが作成されているようには見えません。LogCatBluetoothファイルを送信するデバイスは次のようにしか表示しないため、情報はありません。

Error Log:
Write Error: 
Transport endpoint is not connected
__obex_connect:
error=-2
Unable to connect to the server
Error

BluetoothServerSocketこれは、が「生きている」わけではないことを教えてくれます

これをどのように達成できるかについての提案はありますか?

4

3 に答える 3

3

通常、onDestroy()メソッドが呼び出される保証はありません。ドキュメントによると:

注:このメソッドがデータを保存する場所として呼び出されることを期待しないでください!たとえば、アクティビティがコンテンツプロバイダーでデータを編集している場合、それらの編集は、ここではなく、onPause()またはonSaveInstanceState(Bundle)のいずれかでコミットする必要があります。このメソッドは通常、アクティビティに関連付けられているスレッドなどのリソースを解放するために実装されます。これにより、破棄されたアクティビティが、アプリケーションの残りの部分がまだ実行されている間、そのようなものを残さないようにします。システムがこのメソッド(または他のメソッド)を呼び出さずにアクティビティのホスティングプロセスを単に強制終了する場合があるため、プロセスが終了した後も存続することを目的としたことを行うために使用しないでください。

派生クラスは、このメソッドのスーパークラスの実装を呼び出す必要があります。そうでない場合は、例外がスローされます。


それで、私はそれが確実に呼び出されているかどうかを最初にテストします。

また、あなたはあなたので呼び出しsuper.onStop()ていますonDestroy()。そのはずsuper.onDestroy()

于 2012-11-08T12:50:49.817 に答える
2

コメントできないので、ここに投稿します。Egorのコメントによると、onDestroy()内からonStop()を呼び出すことはできないと思いますが、Android自体はメモリに応じてonPause()に続いてonStop()を呼び出します。ここで、スレッドのstop()、suspend()、およびdestroy()メソッドは非推奨になっていることに注意してください。スレッドを終了する唯一の安全な方法は、スレッドをrun()から終了させることです。これで、server.destroy()を呼び出すときに、まだメモリ内にリンクが保持されている可能性があるため、ガベージコレクターはアクティビティをガベージコレクションできません。したがって、これがonDestroyが呼び出されない理由の可能性があると思います。私が身に着けている場合は私を指してください。

于 2012-11-08T13:03:52.740 に答える
1

どのようにアプリケーションを強制終了しますか?私はクラスであなたの問題の解決策を探していました、Applicationそして私はメソッドについてのこの情報に出くわしましたonTerminate()

このメソッドは、エミュレートされたプロセス環境で使用するためのものです。プロセスを強制終了するだけでプロセスが削除される本番Androidデバイスでは呼び出されません。その際、ユーザーコード(このコールバックを含む)は実行されません。

私のアプリの1つで同様の問題が発生したことを覚えていますonDestroy()。タスクマネージャー(Samsung Galaxy 2)の[メモリのクリア]ボタンを使用したために、一部のコンポーネントのメソッドが呼び出されませんでした。

于 2012-11-08T12:54:36.610 に答える