0

There has been instances where we need some code must be executed at the end no matter what happens to the application. Is there any way we can achieve the finally() functionality in Android?

Note: OnDestroy will not be called during the crash.

For the matter of fact even finally() is not a full proof method when the JVM exits. But in Java we do not see too many JVM exits. But in android since we have a DVM for every app process, we need a way to execute the final code else, we end up leaking the memory and battery consumption shoots up.

4

4 に答える 4

1

最善の策はonPause()、すべてのアクティビティで個別にクリーンアップ操作を実行することです。

finally()アプリがクラッシュすると、プロセス全体が単純に終了するため、Android のようなものはありません。のような通常のメソッドでさえonPause()呼び出されません。プロセスに含まれるすべてのもの (アクティビティ、サービス、レシーバー、スレッドなど) は完全に強制終了されます。

于 2013-06-27T09:04:36.127 に答える
1

application/vm がクラッシュまたは強制終了されたときに、メモリ リークを起こすことはできません。その場合、プロセスはなくなり、それに関連付けられているメモリも失われます。

別のプロセスにあるメモリの割り当てと解放について話している場合は、コンシューマ プロセスから Binder を取得し、Binder.linkToDeath機能を使用して、そのプロセスが終了したときに通知を受け取ることができます。

于 2013-06-27T17:17:05.753 に答える
1

元のプロセスがとにかく実行されていないときに、ここでリークが何を意味するのかわかりません。

このようなシナリオを処理するために私たちが行ったことの 1 つは、「ウォッチドッグ」プロセスを用意することですが、これは Android で実行されるネイティブ コードで行う必要がありました。

あなたの場合、潜在的にサービスを作成し、それを指定することで別のプロセスとして実行することができます

アンドロイド:プロセス=":リモート"

マニフェスト ファイルのフラグ。これで、サービスはメインのアプリケーション プロセスを潜在的に監視し、可能であればクリーンアップを実行できるようになります。もちろん、サービス プロセスがどの要素をクリーンアップするかを知る方法が必要です。

お役に立てれば。

于 2013-06-27T17:45:44.333 に答える
0

死ぬにはさまざまな方法があります。

  1. システムによって殺されました。あなたがフォアグラウンドにいる間は起こらないはずなので、Android ライフサイクルの一部として何かを閉じるようにしてください。
  2. 致命的な例外。これは、キャッチされていないグローバル例外ハンドラーを使用して対処できます。Android でキャッチされていないグローバルな例外ハンドラを設定する理想的な方法を参照してください。
  3. ネイティブクラッシュ。これについてできることはあまりありません。場合によっては、シグナル ハンドラーを使用して回復を試みることができますが、アプリは非常に不安定な状態になるため、一般的にはお勧めできず、機能する可能性は低いです。

他のコメントを見ると、お使いのデバイスのカメラ ドライバーにバグがあり、カメラを開いたプロセスが終了した後でも開いたままになっているようです。これはシステムのバグです。アプリがクラッシュしたときにシステム リソースを管理する必要はありません。(ただし、修正されるまでは、自分の持っているもので作業する必要があります。)

于 2013-06-27T19:44:05.517 に答える