web-dev-qa-db-ja.com

Process.killProcess(Process.myPid())を呼び出すのはなぜ悪い考えですか?

この方法を使用することは「良くない」、使用すべきではない、アプリケーションを「閉じる」正しい方法ではなく、Android)がどのように機能するかではないという投稿をいくつか読みました。 ..

Android OSは、プロセスを終了する適切なタイミングであるとき、私よりもよく知っているという事実を理解し、受け入れますが、なぜそれを使用するのが間違っているのかについての良い説明をまだ聞いていません。 killProcess()メソッド。結局のところ、これはAndroid APIの一部です。

私が知っていることは、他のスレッドが潜在的に重要な作業(ファイルの操作、DBへの書き込み、HTTP要求、サービスの実行など)を実行しているときにこのメソッドを呼び出すと、スレッドが終了し、明らかに良くないということです。また、アプリが最後に使用されたときからシステムがメモリ状態を「保持」しているため、アプリケーションの「再オープン」が高速になるという事実から利益を得ることができます。killProcess()はそれを防ぎます。

この理由以外に、そのような操作がなく、アプリケーションを開くたびに最初から起動するかどうかを気にしないと仮定すると、killProcess()を使用しない理由は他にもあります。方法?

Activityを閉じるfinish()メソッドについて知っているので、それを回答に含めないでください。

finish()Activity専用であり、すべてのアプリケーション用ではありません。私はそれを使用する理由と時期を正確に知っていると思います。

そしてもう1つ、Unity3Dフレームワークを使用してゲームを開発し、プロジェクトをAndroidにエクスポートしています。生成されたapkを逆コンパイルしたとき、JavaソースコードがUnityから作成されました-Unityの-Application.quit()メソッドをProcess.killProcess(Process.myPid())で実装していることを知って非常に驚きました。

Unity3Dのドキュメントによると、Application.quit()はゲームを閉じる正しい方法であると考えられています(本当ですか?間違っていて何かを見逃したのかもしれません)。なぜUnityのフレームワーク開発者はこれをネイティブAndroidに実装したのですか?

25
Tal Kanel

Process.killProcess(Process.myPid())を呼び出すのは悪い考えだと誰が言いましたか?

はい、OSに独自のメモリを管理させることは、アプリケーションを使用するユーザーとユーザーの両方にとってベストプラクティスです(再度開く速度が速く、強制終了の可能性が少ないなど)。

ただし、スレッドやその他のバックグラウンド操作を中断していないことが確実であり、この呼び出しをonDestroy()で使用すると仮定すると、使用しない理由はわかりません。特に、これがAPI呼び出しであり、回避策ではなく、GoogleがAPIドキュメントで使用しない方がよいと述べていない場合は特にそうです。

8
Lior Iluz

_<rant>_

完璧なコードとライブラリを備えた完璧な世界では、Process.killProcess(Process.myPid())を呼び出す必要はありません。そうすれば、OSは必要に応じてアプリケーションを正しく強制終了します。また、中東は平和になり、豚は飛んで、 停止性問題 は解決されます。

これらすべてのことがまだ起こっていないので、そのような「禁止された」コードを実行する必要がある場合があります。

最近、私が作成したAndroidゲームの場合、無料バージョンでは、アプリケーションを存続させ、メモリをリークする広告ライブラリを使用していました。有料バージョンでは、広告がなかったため、この問題は発生しませんでした。ライブラリがリンクされました。私の解決策は、そのようなコードを実行するメインメニューに[終了]ボタンを追加することでした。完了したら大多数の人がこのボタンを押すことを望み、メモリを使い果たすことを心配する必要はありません。 finish()を実行して完了したバージョン(これは、Googleのアプリ内購入が利用可能になる前だったため、有料バージョンと無料バージョンを作成する必要がありました。また、今では問題が修正されている可能性があります。上記のゲームを更新することはできますが、実際にはあまりうまくいきませんでした。それに費やした時間はそれだけの価値があるとは思えません)

小中学校のように、負の数の平方根を取ることはできないと言われています。その後、より高いレベルの代数クラスで、彼らは言います...負の数の平方根を取ることはできますが、奇妙な結果が得られますが、それは一貫していて問題を解決します。

言い換えれば、何をしているのかわからない限り、「禁止」コードを実行しないでください。

_</rant>_

13
Russ

ええと、Unit3dはおそらくネイティブコードを使用していて、保険としてプロセスを殺しています-彼らはメモリを漏らしたくないのです。これが良い考えかどうかは議論の余地がありますが、彼らがそれを使用したという事実は、あなたもそうすべきだという意味ではありません。

killProcess()を使用したいという極端なケースもあるかもしれませんが、現在の負荷と使用状況に応じて、通常はOSがこれを実行します。探している答えの種類がわからない-killProcess()を使用すると問題が発生する可能性があることを認識しています。ただし、その使用法を正当化できない限り、使用しないでください。

9
Nikolay Elenkov

killProcessがあなたを噛み、期待どおりに機能しない2つの状況を次に示します。

1)スティッキーサービス-プロセスを強制終了した場合でも、自動的に再起動します

2)タイマー-スレッドをタイマーで実行するようにスケジュールした場合、プロセスを強制終了した後もスレッドは実行を継続します

したがって、ご覧のとおり、** killProcess *が実行中のアプリをクリーンアップするための賢明なソリューションではない場合があります。

1
IgorGanapolsky

それは悪い考えです。 1つは、これらのフレームワークがすべてのライフサイクルメソッドに登録され、クリーンな実行後にのみテストの成功ステータスが報告されるため、アクティビティはインストルメンテーションに値しません。テストアプリケーションの下からプロセスを強制終了すると、失敗が報告され、これが発生していることが明確になりません。

0
yrizk