29

この方法を使用することは「良くない」、使用すべきではない、アプリケーションを「閉じる」ための正しい方法ではなく、Androidの動作方法でもないという投稿をいくつか読んだことがあります...

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

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

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

finish()を閉じる方法を知っているActivityので、それを答えに含めないでください。

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

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

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

4

6 に答える 6

15

<rant>

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

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

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

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

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

</rant>

于 2012-06-23T19:11:39.307 に答える
9

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

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

于 2012-06-15T06:05:22.080 に答える
9

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

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

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

于 2012-06-18T11:38:59.550 に答える
3

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

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

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

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

于 2017-11-07T19:02:25.543 に答える
0

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

于 2018-07-03T15:20:51.327 に答える
0

私の意見では、一部のAndroid開発者が強制終了プロセスを推奨しない理由は、単にプロセスを強制終了しただけでは、すべてのサービス、アクティビティが安全かつ適切に終了することを確認するのが難しいためです。APP開発者の場合、APPは他のAPPとデータを共有し、一部のアクティビティは他のアクティビティにエクスポートする場合があります。プロセスを強制終了すると、他のアプリが失敗する可能性があります。さらに、ほとんどの場合、実際にはアプリを「殺す」必要はありません。実行していることとユーザーに見せたくないことを終了し、他の作業はAndroidシステムに任せてください。彼らは私たちよりもよく知っています。OK、やりたいことを明確に知っている場合は、速く開くことなどを気にしないでください。たとえば、ユーザーがボタンをクリックしたときにゲームを終了したい場合、ゲームはもちろん他のアプリにエクスポートされず、外部でデータを共有しません。あなたのゲーム、これをしても大丈夫です、他のサービスやスレッドを実行する必要がないことを注意深く確認してください。この場合、プロセスを強制終了する前にすべてのアクティビティを終了することをお勧めします。アクティビティが状態を適切に保存することを確認するために、次のように呼び出します。

    activity.finishAffinity();
    Process.killProcess(Process.myPid());

現在の活動で。これは私の意見であり、訂正することを歓迎します。

于 2020-05-06T04:42:19.743 に答える