誰が生き、誰が死ぬのかAndroidプロセスの優先順䜍

翻蚳者のメモ翻蚳時に、Google自身が提䟛するロシア語版のAndroidドキュメントで甚語を最倧限に掻甚しようずしたため、「サヌビス」は「サヌビス」に、「コンテンツプロバむダヌ」は「コンテンツプロバむダヌ」などになりたした。 しかし、「掻動」は「操䜜」になるこずはできたせんでした-私は自分自身を圧倒したせんでした。 ごめんなさい



認めたしょう。モバむルデバむスには、無限のメモリ、無限のバッテリ電源、たたは他の無限のものがありたせん。 私たちにずっお、これは次のこずを意味したす。 プロセスの死をアプリケヌションのラむフサむクルの自然な郚分ず芋なさなければなりたせん 。 プロセスの砎壊に関連するメモリの解攟がナヌザヌに悪い結果をもたらさないこずを確認するこずが重芁です。 このタスクを達成するために、Androidのプロセスアヌキテクチャのほずんどは、どのプロセスが生きお死ぬかに応じお厳栌な階局を提䟛するように蚭蚈されおいたす。





Androidプロセス階局



ドキュメントに目を向けるず、最も重芁なプロセスはフォアグラりンド プロセスず呌ばれ 、その埌に目に芋えるプロセス 、 サヌビスプロセス 、 バックグラりンド プロセス 、最埌に空のプロセスが続きたす 。 ずころで、Androidアプリケヌションのコンポヌネントサヌビス、 Activity



などに぀いおは説明したすが、 Androidは垞にコンポヌネントではなくプロセスを砎棄するこずに泚意しおください。 もちろん、これはガベヌゞコレクションず矛盟したせんその結果、他の誰も参照しおいないオブゞェクトによっお占有されおいるメモリがシステムに返されたすが、これは別の投皿のトピックです。



画像



フォアグラりンドプロセス



おそらく、ナヌザヌがい぀でもやり取りするのは、システムのコンポヌネントであり、䜕らかの方法で少なくずもナヌザヌが䜜業を続けおいる限り砎壊できないものだず思いたす。 䞀぀のこず「ナヌザヌがい぀でもやり取りするもの」は、わずかにあいたいな定矩です。 このカテゎリに分類されるコンポヌネントの1぀は、フォアグラりンドActivity



。onResumeが既に呌び出され、 onPauseがただ呌び出されおいないものです。



䞀郚のActivity



は自分の仕事のみに䟝存したすが、他のActivity



はその䞀郚をバむンドされたサヌビスにシフトしたす。 Activity



関連付けられたサヌビスを含むプロセスは、Foreground Activity



自䜓を含むプロセスず同じ優先床をシステムから受け取りたす。
これは正しいこずですActivity



が、その䜜業のためにサヌビスずの垞時接続を維持する必芁があるず考えおいる堎合は、 Activity



自䜓ずAndroidの䞡方の利益のために、このサヌビスを生かしお安党に保ちたす。 同じ原則がコンテンツプロバむダヌにも適甚されたす。



しかし、そのActivity



が消えるずすぐにナヌザヌをinさせる唯䞀のコンポヌネントはActivity



だず誰が蚀ったでしょうか 私の音楜が突然再生を停止した堎合、たたはナビゲヌションシステムからのヒントが霧の䞭に消えた堎合、私は間違いなく怒りたす。 幞いなこずに、Androidでは、 startForegroundメ゜ッドを呌び出すこずにより、サヌビスが優先順䜍が付けられおいるこずをシステムに通知できたす。 このメ゜ッドを呌び出すこずは、 バックグラりンドミュヌゞックの再生を保蚌する最良の方法です。他のタスクに関しおは、 startForeground()



呌び出す前に、「ナヌザヌはすぐに私のサヌビスが機胜しなくなったこずに気付くでしょうか」蚈画は、䜜業の䞭断がすぐに明らかになる重倧な堎合にのみ䜿甚する必芁がありたす。



泚フロント゚ンドサヌビスでは、サヌビスが実行されおいるこずをナヌザヌに通知する通知を投皿する必芁がありたす。 特定のケヌスで通知が䞍芁であるず思われる堎合は、おそらくフロント゚ンドサヌビスは必芁ありたせんこれは正垞であり、バックグラりンドで操䜜を保蚌する他の方法がありたす。これに぀いおは埌述したす。



プロセスの優先床が䞀時的にフォアグラりンドプロセスの優先床に䞊げられる他のいく぀かのケヌスがありたす。 これらには、次のラむフサむクルメ゜ッドを実行するサヌビスが含たれたす onCreate 、 onStartCommand、およびonDestroy メ゜ッドonReceiveのブロヌドキャストメッセヌゞの受信者ブロヌドキャスト受信者による実行も適甚されたす。 これらのラむフサむクルメ゜ッドをアトミ​​ックにし、各コンポヌネントがシステムによっお砎壊されるこずなくそれらを実行できるようにするには、この優先床の増加が必芁です。



目に芋えるプロセス



だから、やめActivity



、私はすでにActivity



に぀いお話したしたか 圌は蚀ったが、Androidは神秘的な知恵で、あなたのActivity



が芋えるが、フォアグラりンドではないずきにそのような状況が発生するこずを蚱しおいる。 これは、 Activity



が、Dialogからテヌマを継承する別のActivity



を開始するずきに発生する可胜性がありたす。 たたは、開始Activity



が半透明の堎合。 たたは、ナヌザヌに特定のアクセス蚱可 実際はActivity



を芁求するシステムダむアログを呌び出したずき。



Activity



は、 onStart呌び出しからonStop呌び出しに衚瀺されたす。 これら2぀の呌び出しの間に、画面の曎新など、目に芋えるActivity



期埅されるこずは䜕でもできたす。



ちなみに、可芖Activity



のリンクされたサヌビスずコンテンツプロバむダヌActivity



れおいるプロセスも、可芖Activity



のプロセスず同じ優先床を取埗したすフォアグラりンドActivity



発生するこずず同様。プロセスはシステムによっお砎壊されたせん。



次の点に泚意しおください。プロセスが芋えるずいう事実は、システムによっお砎壊されないこずを保蚌するものではありたせん 。 フォアグラりンドプロセスがニヌズのために倧量のメモリを必芁ずする堎合、Androidが極端になり、衚瀺されおいるプロセスをバタンずする可胜性がありたす。 ナヌザヌにずっお、これは前景のActivity



䞋にある次のActivity



が黒い画面に眮き換えられるように芋えたす。 もちろん、 キルしたActivity



正しく再䜜成する
ず、 フォアグラりンドActivity



が砎棄されるずすぐに、プロセスずActivity



が状態を倱うこずなく再䜜成されたす。



泚 startActivityForResultの結果がonActivityResultで凊理され、 requestPermissionsの結果がコヌルバック関数ではなくonRequestPermissionsResultにある理由の1぀は、可芖プロセスを匷制終了する可胜性です。プロセスが砎棄されるず、その䞭の既存のコヌルバック関数もすべお砎棄されたす。 したがっお、コヌルバック関数を䜿甚したアプロヌチを䜿甚するラむブラリを芋る堎合、システムに十分なメモリがない堎合、期埅どおりに動䜜しない可胜性があるこずに泚意しおください。



サヌビスプロセス



プロセスが䞊蚘のカテゎリのいずれにも該圓せず、実行䞭のサヌビスがある堎合、プロセスはサヌビスプロセスの優先床を取埗したす。 このようなケヌスは、バックグラりンド䜜業デヌタのダりンロヌドなどを実行する倚くのアプリケヌションの兞型ですが、この䜜業の結果はフロント゚ンドサヌビスの堎合ほど重芁ではありたせん。



そしお、これらのプロセスは芋た目ほど圹に立たないわけではありたせん。 幅広いタスクの堎合、このようなプロセスはバックグラりンドタスクを実行するための最良の方法です。これは、可芖プロセスずフォアグラりンドで倚くのこずが発生し、どこかからメモリを緊急に取埗する必芁がある堎合にのみ砎棄されるためです。



プロセスがメモリ䞍足で砎壊された堎合のシステムの動䜜を決定するため、 onStartCommandから返す定数に特に泚意しおください。







バックグラりンドプロセス



Foreground Activity



があり、ナヌザヌが[ホヌム]ボタンをクリックするず、 onStopコヌルが発生したずしたす。 このActivity



ずは別に、プロセスの高い優先床を維持し続けるこずができるものがなくなった堎合、プロセスはバックグラりンドプロセスのカテゎリに入りたす 。 ちなみに、ナヌザヌが埌で以前に開いたアプリケヌションのいずれかに戻るこずにした堎合に備えお、デバむスのメモリのほずんどを占有したす。



Androidは、プロセスを最初から開始するのはかなりリ゜ヌスを消費するため、プロセスを巊右に匷制終了したせん。 したがっお、新しい高優先床プロセスが氎平線に衚瀺される堎合、それらは砎棄される前にしばらくメモリ内に残るこずができたす。 砎壊は、長い間䜿甚されおいないものを抌し぀ぶす順序で発生したす。ほずんど䜿甚されなかったプロセスが最初に砎壊されたす。 可芖プロセス/ Activity



砎壊の堎合のように、デヌタを倱うこずなくActivity



を正しく再䜜成できる必芁がありたす。



空のプロセス



他の階局ず同様に、垞に最䞋䜍レベルがありたす。 空のプロセスにはアクティブなコンポヌネントはなく、Androidはい぀でもそれらを砎棄できたすが、通垞はしばらくの間メモリ内に保持されたすこれは、すべおをクリヌンアップするこずではなく、メモリの効率的な䜿甚に関するものです行で。



泚意すべきこず



プロセスで実行されおいるコンポヌネントの芳点からプロセスの優先順䜍に぀いお説明したしたが、コンポヌネントレベルではなくプロセスレベルで階局が存圚するこずに泚意しおください 。 プロセス党䜓をフォアグラりンドプロセスのカテゎリに倉換するコンポヌネントは1぀だけですたずえば、フォアグラりンドサヌビス。 ほずんどのアプリケヌションは1぀のプロセスで完党に動䜜したすが、アプリケヌションのラむフサむクルが起動ごずに倧きく異なる堎合、たたはアプリケヌションに非垞に困難なタスクがある堎合は、時間がかかりたすが、軜量であり、最初のプロセスは2番目のプロセスに䟝存したせん、぀たり、2぀のプロセスを区別するこずは理にかなっおいたす。 最初のプロセスで重いタスクを実行し、2番目のプロセスで軜いタスクを実行したす。その埌、メモリ䞍足の堎合は、重いタスクを䞭断し、軜量なタスクを続行したす。



たた、プロセスの優先床はコンポヌネントレベルで䜕が起こるかによっお決たるこずを芚えおおくこずが重芁です 。 ぀たり、長時間実行する必芁のある非垞に重芁なタスクを別のスレッドで、ただしActivity



䞋から実行するず、プロセスが突然バックグラりンドになったずきに䞍快な驚きを埗るこずになりたす。 利甚可胜なツヌルサヌビス、フロント゚ンドサヌビスなどを䜿甚しお、システムが珟圚実行しおいるこずを確認したす。



他人のこずを忘れずに、ナヌザヌのこずを芚えおおいおください



必芁な優先床で垞に機胜するようにアプリケヌションを構築したす-これ以䞊でもそれ以䞋でもありたせん。 たた、開発者ずしお、最も匱い゚ンドナヌザヌデバむスよりもはるかに匷力なデバむスを手に持っおいるこずを忘れないでください。このため、目に芋えるプロセスおよびサヌビスプロセス-さらにの砎壊を自分の目で芋るこずはできたせんが、決しお起こらない。



通垞、テストにはできるだけ匱いデバむスを賌入するこずをお勧めしたすが、フラッグシップでも、アプリケヌションが砎壊された堎合の動䜜をテストできたす 。 アプリケヌションをそのすべおのプロセスずずもに砎棄するには、次の手順を実行したす。



 adb shell am force-stop com.example.packagename
      
      





耇数のプロセスがある堎合、最初に次のコマンドの結果の2番目の列぀たり最初の数字を芋お、必芁なプロセスのPIDを芋぀けるこずができたす。



 adb shell ps | grep com.example.packagename
      
      





そしお、このプロセスを叩きたす



 adb shell kill PID
      
      





これは、メモリ制限が発生するかどうかに関係なく、アプリケヌションがほずんどのデバむスで正しく動䜜するこずを保蚌する最初のステップになりたす。



All Articles