Androidの仕組み、パヌト3







この蚘事では、Androidアプリを構成するコンポヌネントず、このアヌキテクチャの背埌にあるアむデアに぀いお説明したす。







シリヌズ蚘事









Web vsデスクトップ



最新のWebアプリケヌションず「通垞の」デスクトップアプリケヌションの違いを考えるず、欠点の䞭でも、Webのいく぀かの利点を匷調できたす。









さらに、Webアプリケヌションは、同じサむト内およびサむト間の䞡方で、互いにリンクできるペヌゞの圢匏で存圚したす。 さらに、あるサむトのペヌゞは、別のサむトのメむンペヌゞぞのリンクのみに限定される必芁はなく、別のサむト内の特定のペヌゞにリンクできたすこれはディヌプリンクず呌ばれたす。 盞互に参照するず、個々のサむトが結合されお、共通のネットワヌクであるWebになりたす。







1぀のペヌゞの耇数のコピヌ゜ヌシャルネットワヌク䞊の耇数のプロファむルなどは、耇数のブラりザヌタブで同時に開くこずができたす。 ブラりザヌむンタヌフェむスは、個々のサむト間ではなく同時セッションタブを切り替えるように蚭蚈されおいたす。同じタブ内で、異なるサむトの異なるペヌゞ間でリンクをナビゲヌトおよび履歎を前埌にできたす。







これはすべお、各アプリケヌションが個別に、そしお倚くの堎合他のアプリケヌションずは独立しお動䜜する「デスクトップ」ずは反察です。この点で、Androidでのアプリケヌションの配眮方法は「埓来の」アプリケヌションよりもWebにより近くなりたす。







掻動ず目的



Androidのアプリケヌションコンポヌネントのメむンフォヌムはactivityです。 アクティビティは1぀のアプリケヌション画面です。 アクティビティは、Web䞊のペヌゞおよび埓来のりィンドりむンタヌフェむスのアプリケヌションりィンドりず比范できたす。







窓に぀いお

実際、Androidのりィンドりも䞋䜍レベルであるりィンドりマネヌゞャヌレベルです。 通垞、各アクティビティには独自のりィンドりがありたす。 ほずんどの堎合、アクティビティりィンドりは䜿甚可胜な画面党䜓に最倧化されたすが、次のようになりたす。







  • たず、Androidはマルチりィンドりモヌド分割画面、ピクチャヌむンピクチャヌ、さらにはフリヌフォヌムをサポヌトしおいたす。
  • 第二に、Androidは耇数のディスプレむの接続をサポヌトしおいたす。
  • 第䞉に、アクティビティが画面の小さな郚分を意図的に占有する可胜性がありたす Theme_Dialog



    。














たずえば、電子メヌルクラむアントアプリケヌションでは、受信トレむアクティビティ受信文字のリスト、電子メヌルアクティビティ1文字を読む、䜜成アクティビティ文字を曞く、蚭定アクティビティ蚭定などのアクティビティがありたす。







1぀のサむトのペヌゞのように、1぀のアプリケヌションのアクティビティは、盞互に起動するこずも、盞互に独立しお他のアプリケヌションによっお起動するこずもできたす。 Web䞊で別のペヌゞにURLリンクでアクセスするず、Androidアクティビティではそれらがむンテントを介しお起動されたす。







むンテントずは、システムに「䜕をする」かを指瀺するメッセヌゞですたずえば、特定のURLを開く、このアドレスに手玙を曞く、この電話番号に電話する、写真を撮るなど。







アプリケヌションはそのようなむンテントを䜜成しおシステムに枡すこずができ、システムはどのアクティビティたたは他のコンポヌネントがそれを実行するかハンドルを決定したす。 このアクティビティは、システムによっお既存のアプリケヌションプロセスたたはただ実行されおいない堎合は新しいプロセスで起動され、このむンテントが枡されお実行されたす。







むンテントを䜜成する暙準的な方法は、Androidフレヌムワヌクの察応するクラスを䜿甚するこずです。 Androidのコマンドラむンからアクティビティずむンテントを操䜜するには、 am



コマンドがありam



これは、暙準のアクティビティマネヌゞャヌクラスのラッパヌam



。







 #  -a ACTION -d DATA #   $ am start -a android.intent.action.VIEW -d http://example.com #    $ am start -a android.intent.action.CALL -d tel:+7-916-271-05-83
      
      





むンテントは、 明瀺的 明瀺的および暗黙的 暗黙的にするこずができたす。 明瀺的なむンテントは、起動する必芁がある特定のコンポヌネントの識別子を瀺したす-ほずんどの堎合、同じアプリケヌション内の1぀のアクティビティから別のアクティビティを起動するために䜿甚されたすむンテントには他の有甚な情報が含たれない堎合もありたす。







暗黙のむンテントは、実行するアクションを必ず瀺す必芁がありたす。 各アクティビティおよび他のコンポヌネントは、アプリケヌションマニフェストで、凊理の準備ができおいる意図を瀺したすたずえば、ドメむンhttps://example.com



リンクのACTION_VIEW



。 システムは、むンストヌルされたコンポヌネントから適切なコンポヌネントを遞択しお起動したす。







システムにむンテントを凊理する準備ができおいるいく぀かのアクティビティがある堎合、ナヌザヌに遞択肢が䞎えられたす。 これは通垞、耇数の類䌌したアプリケヌションたずえば、耇数のブラりザヌや写真゚ディタヌがむンストヌルされおいる堎合に発生したす。 さらに、アプリケヌションは遞択ダむアログを衚瀺するようにシステムに明瀺的に芁求する堎合がありたす実際、枡されたむンテントはACTION_CHOOSER



新しいむンテントにACTION_CHOOSER



されたす。これは通垞、矎しい共有ダむアログを䜜成するために䜿甚されたす。













さらに、アクティビティは結果をその原因ずなったアクティビティに返すこずができたす。 たずえば、「写真を撮る」ずいうむンテントを凊理できるカメラアプリケヌションのアクティビティ ACTION_IMAGE_CAPTURE



は、撮圱した写真をこのむンテントを䜜成したアクティビティに返したす。







この堎合、元のアクティビティを含むアプリケヌションには、カメラぞのアクセス蚱可が必芁ありたせん。







したがっお、Androidアプリケヌションが写真を撮る正しい方法は、カメラにアクセスしおCamera APIを䜿甚する蚱可を必芁ずせず、目的の意図を䜜成し、システムカメラアプリケヌションに写真を撮らせるこずです。 同様に、 READ_EXTERNAL_STORAGE



暩限を䜿甚しおナヌザヌのファむルに盎接アクセスする代わりに、システムファむルマネヌゞャヌでファむルを遞択する機䌚をナヌザヌに䞎える必芁がありたす元のアプリケヌションはこのファむルぞのアクセスを蚱可されたす。







Androidシステム蚭蚈のナニヌクな偎面は、どのアプリでも別のアプリのコンポヌネントを起動できるこずです。 たずえば、ナヌザヌにデバむスのカメラで写真をキャプチャさせる堎合、おそらくそれを行う別のアプリがあり、アプリは自分で写真をキャプチャするアクティビティを開発する代わりにそれを䜿甚できたす。 カメラアプリのコヌドを組み蟌む必芁も、リンクする必芁もありたせん。 代わりに、写真をキャプチャするカメラアプリでアクティビティを開始するだけです。 完了するず、写真はアプリに返されお䜿甚できるようになりたす。 ナヌザヌには、カメラが実際にアプリの䞀郚であるかのように芋えたす。

同時に、「システム」アプリケヌションは、メヌカヌたたはAndroidアセンブリの䜜成者によっお事前にむンストヌルされたものである必芁はありたせん。 この意味で、この意図を凊理できるすべおのむンストヌル枈みアプリケヌションは同等です。 ナヌザヌはそれらのいずれかをそのようなintent'ovのデフォルトアプリケヌションずしお遞択でき、毎回適切なものを遞択できたす。 ナヌザヌがシステムで発生するこのタむプのすべおのタスク぀たり、意図を実行するこずを遞択したずいう意味で、遞択されたアプリケヌションは「システム」になりたす。







カメラ自䜓ぞのアクセス蚱可は、カメラむンタヌフェむスを実装するアプリケヌションカメラアプリケヌション自䜓、ビデオ通話アプリケヌション、拡匵珟実などにのみ必芁です。 それどころか、普通のメッセンゞャヌは 「写真を送信できるように」カメラにアクセスする必芁はありたせん 。 倧銀行のアプリケヌションぞの呌び出しにアクセスする必芁がないのず同じです。







ランチャヌに぀いお

ホヌム画面ランチャヌ、ランチャヌなどの「システムの䞀郚」でさえ、このロゞックに埓いたす。 ランチャヌは、そのアクティビティ excludeFromRecents



やlaunchMode="singleTask"



などの特別なフラグを䜿甚するを備えた特別なアプリケヌションです。







ホヌムボタンを抌すず、 HOME



カテゎリのむンテントが䜜成され、むンテントを凊理するための通垞のメカニズムが実行されたす。システムに耇数のランチャヌがむンストヌルされ、デフォルトのランチャヌずしお䜕も遞択されおいない堎合、システムは遞択ダむアログを衚瀺したす。







ランチャヌからのアプリケヌションの「起動」も意図によっお行われたす。 ランチャヌは、アプリケヌションのメむンアクティビティを起動するこずで「凊理」されるLAUNCHER



カテゎリの明瀺的なむンテントを䜜成したす。







アプリケヌションには、そのような意図をサポヌトするいく぀かのアクティビティがあり、ランチャヌに耇数回衚瀺される堎合がありたすこの堎合、 taskAffinity



異なるtaskAffinity



を指定する必芁がありたす。 たたは、1぀はなく、ランチャヌにはたったく衚瀺されたせんただし、蚭定のむンストヌル枈みアプリケヌションの完党なリストには衚瀺されたす。 「通垞の」アプリケヌションがこれを行うこずはほずんどありたせん。 この動䜜の最も有名な䟋は、Google Play Servicesです。







倚くのオペレヌティングシステムは、オペレヌティングシステム自䜓ず、その䞊にむンストヌルされおいるアプリケヌションに分かれおいたす。これらのアプリケヌションは、お互いに぀いお䜕も知らず、察話する方法も知りたせん。 Androidコンポヌネントずintent'ovのシステムにより、アプリケヌションは、 ただお互いに぀いお䜕も知らずに、ナヌザヌのために1぀の統合システムナヌザヌ゚クスペリ゚ンスを構成できたす。むンストヌルされたアプリケヌションは、 1぀の倧きなシステムの䞀郚を実装し、システムを構成したす。 そしお、これは䞀方ではナヌザヌにずっお透過的であり、他方ではカスタマむズの無限の可胜性を提瀺したす。







私の意芋では、それは非垞に矎しいです。







タスクずバックスタック



既に述べたように、ブラりザでは、ナヌザヌはサむト間ではなくタブ間を切り替えるこずができたす。各タブの履歎には、異なるサむトの倚くのペヌゞを含めるこずができたす。 同様に、Androidでは、ナヌザヌはタスク タスクを切り替えるこずができたす 。 タスクは、 最近の画面にカヌドの圢で衚瀺されたす 。 各タスクはバックスタックです-いく぀かのアクティビティが互いに「重ね合わされ」たす。







あるアクティビティが別のアクティビティを起動するず、新しいアクティビティが叀いアクティビティの䞊にあるスタックにプッシュされたす。 スタックの䞀番䞊のアクティビティが完了するずたずえば、ナヌザヌがシステムの戻るボタンを抌すず、スタックの前のアクティビティが再び画面に衚瀺されたす。







バックスタック







各スタックには異なるアプリケヌションのアクティビティを含めるこずができ、1぀のアクティビティの耇数のコピヌを異なるタスクの䞀郚ずしお、たたは同じスタック内で同時に開くこずができたす。







新しいアクティビティを開始するずき、このメカニズムを倉曎するsingleTop



、 singleTask



、 singleInstance



、 CLEAR_TOP



などの特別なフラグを指定できたす。 たずえば、ブラりザアプリケヌションは通垞、メむンアクティビティのコピヌを1぀だけ起動でき、開いおいるペヌゞを切り替えるために、独自のタブシステムを実装したす。 䞀方、 カスタムタブはブラりザヌほずんどの堎合Chromeでのアクティビティの䟋であり、ほが「通垞どおり」に動䜜したす。぀たり、1ペヌゞのみを衚瀺したすが、そのコピヌのいく぀かを同時に開くこずができたす。







アプリのラむフサむクル



組み蟌みおよびモバむルデバむスの䞻な制限の1぀は、少量のランダムアクセスメモリRAMです。 最新のフラッグシップデバむスにすでに数ギガバむトのRAMが搭茉されおいる堎合、2008幎9月にリリヌスされた最初のAndroidスマヌトフォンであるHTC Dream別名T-Mobile G1では、わずか192メガバむトでした。







HTC Dream







「通垞の」コンピュヌタヌずは異なり、モバむルデバむスではスワップパヌティションおよびスワップファむルが䜿甚されないずいう事実により、メモリ制限の問題はさらに耇雑になりたす-SSDおよびHDDず比范しおアクセス速床が遅いためなどSDカヌドず内蔵フラッシュメモリに保存したす。 KitKatのバヌゞョン4.4以降、Android は zRAMスワップを䜿甚したす。぀たり、メモリの䜿甚頻床の䜎い郚分を効果的に圧瞮したす。 ただし、メモリの制限の問題は残りたす。







すべおのプロセスがシステムのブラックボックスである堎合、空きメモリが䞍足した堎合の最善の戊略は、䞀郚のプロセスを匷制的に終了「匷制終了」するこずです。これがLinux Out Of MemoryOOMKillerの機胜です。 しかし、Androidはシステムで䜕が起こっおいるかを知っおおり、どのアプリケヌションずそのコンポヌネントが実行されおいるかを知っおいるため、より「スマヌトな」メモリ解攟スキヌムが可胜になりたす。







たず、空きメモリがなくなるず、AndroidはonTrimMemory



/ onLowMemory



呌び出しお、䞍芁なメモリを解攟するたずえば、キャッシュをonTrimMemory



ようにアプリケヌションに明瀺的に芁求したす。 第二に、Androidはバックグラりンドアプリケヌションでガベヌゞを効率的に収集し、珟圚䜿甚しおいるアプリケヌションの速床を萜ずすこずなく、Javaレベルで䜿甚しなくなったメモリを解攟したす。







しかし、Androidでメモリを解攟する䞻なメカニズムは、 䜿甚頻床の䜎いアプリケヌションの終了です 。 システムは、ナヌザヌにずっお最も重芁でないアプリケヌションたずえば、ナヌザヌが長く残っおいるアプリケヌションを自動的に遞択し、 onDestroy



などのメ゜ッドを呌び出すこずでコンポヌネントにリ゜ヌスをさらに解攟する機䌚を䞎え、それらを終了し、䜿甚するメモリずリ゜ヌスを完党に解攟したす。







ナヌザヌがメモリ䞍足のためにシステムによっお終了したアプリケヌションのアクティビティに戻るず、このアクティビティが再び開始されたす。 この堎合、アクティビティは完了時にその状態を保持し onSaveInstanceState



、次回の起動時に埩元するため、ナヌザヌに察しお透過的に再起動が発生したす。 Androidフレヌムワヌクに実装されたりィゞェットは、このメカニズムを䜿甚しお、再起動時にむンタヌフェむスUIの状態を自動的に保存したすEditTextに入力されたテキスト、カヌ゜ル䜍眮、スクロヌル䜍眮など。 アプリケヌション開発者は、このアプリケヌション固有の他のデヌタの保存ず埩元をさらに実装できたす。







Androidはアプリケヌションを完党に再起動するこずはできたせんが、 コンポヌネントごずに未䜿甚郚分を完党に再起動できるこずを匷調したす。たずえば、1぀のアクティビティの2぀のコピヌから、1぀を再起動し、もう1぀を完了したたたにするこずができたす。







ナヌザヌの芳点から芋るず、このメカニズムはスワップの䜿甚に䌌おいたすどちらの堎合も、アプリケヌションのアンロヌドされた郚分に戻るず、再びロヌドされるたで少し埅぀必芁がありたす-ある堎合にはディスクから、別の堎合には-保存された状態によっお再䜜成されたす







自動的に再起動しお状態を埩元するこのメカニズムにより、ナヌザヌはアプリケヌションが「垞に実行されおいる」ず感じ、アプリケヌションを明瀺的に起動および終了し、入力されたデヌタを保存する必芁がなくなりたす。







サヌビス



アプリケヌションは、アクティビティに盎接関係しないアクションを実行する必芁がある堎合がありたす。これには、このアプリケヌションのすべおのアクティビティが完了したずきにバックグラりンドで実行し続けるこずも含たれたす。 たずえば、アプリケヌションは、ネットワヌクから倧きなファむルをダりンロヌドしたり、写真を凊理したり、音楜を再生したり、デヌタを同期したり、サヌバヌぞのTCP接続を維持しお通知を受信したりできたす。







このような機胜は、個別のスレッドを起動するだけでは実装できたせん。これはシステムのブラックボックスになりたす。 特に、このようなバックグラりンド操䜜の状態に関係なく、プロセスはすべおのアクティビティの完了時に完了したす。 代わりに、Androidは別の皮類のコンポヌネント- サヌビスを䜿甚するこずをお勧めしたす 。







アプリケヌションは、アプリケヌション䞭にこのアプリケヌションのアクティビティの䞀郚ではないアクションが実行されおいるこずをシステムに通知するために必芁です。 サヌビス自䜓は、別個のスレッドたたはプロセスを䜜成するこずを意味するものではありたせん。その゚ントリポむントは、アプリケヌションのメむンスレッドで起動されたす。 通垞、サヌビス実装は远加のスレッドを起動し、それらを独立しお管理したす。







サヌビスは倚くの点でアクティビティず非垞によく䌌おいたす。サヌビスはむンテントを䜿甚しお起動され、メモリ䞍足でシステムによっお終了される可胜性がありたす。







実行䞭のサヌビスには、次の3぀の状態がありたす。

















バックグラりンドアクションを実行する掚奚方法は、システムベヌスのバックグラりンドスケゞュヌリングメカニズムであるJobSchedulerを䜿甚するこずです。 JobSchedulerを䜿甚するず、アプリケヌションは次のようなサヌビスを開始するための基準を指定できたす。









JobSchedulerは、指定された基準に埓っお登録されたサヌビスを実行するバむンダヌを介した呌び出しずしお実装予定です。 JobSchedulerはシステム党䜓のメカニズムであるため、むンストヌルされおいるすべおのアプリケヌションの登録サヌビスの基準を蚈画する際に考慮されたす。 たずえば、䜿甚䞭にデバむスに急激な負荷がかかるのを防ぐために、同時にではなく順番にサヌビスを開始し、定期的に小さなグルヌプバッチで耇数のサヌビスを実行しお、無線機噚の継続的な゚ネルギヌ消費のオン/オフを防ぐこずができたす。







TCP接続に぀いお

ご芧のずおり、JobSchedulerを䜿甚しおも、バックグラりンドサヌビスを䜿甚するオプションの1぀を眮き換えるこずはできたせん。プッシュ通知を受信するためにサヌバヌぞのTCP接続を維持したす。 Androidがアプリケヌションにそのような機䌚を提䟛した堎合、デバむスは垞に実行䞭のサヌバヌに接続するすべおのアプリケヌションを維持する必芁があり、これはもちろん䞍可胜です。







この問題の解決策は、特別なプッシュサヌビスです。最も有名なものは、GoogleのFirebase Cloud Messaging 以前のGoogle Cloud Messagingです。







FCMのクラむアント偎は、Google Play Servicesアプリケヌションに実装されおいたす。 バックグラりンドサヌビスの通垞の制限から明確に陀倖されおいるこのアプリケヌションは、Googleサヌバヌずの単䞀の接続をサポヌトしおいたす。 アプリケヌションにプッシュ通知を送信する開発者は、FCMサヌバヌパヌツを介しおそれを送信したす。その埌、Play Servicesアプリケヌションはメッセヌゞを受信し、目的のアプリケヌションに送信したす。







このようなスキヌムにより、䞀方では、次の同期期間を埅たずに、すべおのアプリケヌションにプッシュ通知を即座に配信できたす。䞀方で、倚くのアプリケヌションを同時に実行し続けるこずはできたせん。







攟送受信機ずコンテンツプロバむダヌ



アクティビティずサヌビスに加えお、Androidアプリケヌションには、議論にはあたり興味のない2぀のタむプのコンポヌネントがありたす。これらはブロヌドキャストレシヌバヌずコンテンツプロバむダヌです。







ブロヌドキャストレシヌバヌ -アプリケヌションがブロヌドキャストを受信できるようにするコンポヌネント。システムたたは他のアプリケヌションからの特別なタむプのメッセヌゞ。 最初は、名前が瀺すように、ブロヌドキャストは䞻にすべおのサブスクラむブ枈みアプリケヌションにブロヌドキャストメッセヌゞを送信するために䜿甚されたした。たずえば、飛行機モヌドをオンたたはオフにするず、システムはAIRPLANE_MODE_CHANGED



メッセヌゞを送信したす。







これで、アプリケヌションはNEW_PICTURE



やNEW_VIDEO



などのブロヌドキャストをサブスクラむブする代わりに、JobSchedulerを䜿甚する必芁がありたす。 ブロヌドキャストは、よりたれなむベント BOOT_COMPLETED



などに䜿甚されるか、明瀺的なむンテントを䜿甚しお、぀たり、あるアプリケヌションから別のアプリケヌションぞのメッセヌゞずしお正確に䜿甚されたす。







コンテンツプロバむダヌは、アプリケヌションが管理するデヌタぞのアクセスを他のアプリケヌションに提䟛できるようにするコンポヌネントです。 この方法でアクセスできるデヌタの䟋は、ナヌザヌの連絡先リストです。







, , (SQLite) . content provider — , .







content provider' REST API. - URI (, content://com.example.Dictionary.provider/words/42



) ContentResolver. - , , UriMatcher



, (query, insert, update, delete).







content provider' Storage Access Framework , , (, Dropbox Google Photos) , .










Android, , , , root-.








All Articles