Androidアプリケヌションアヌキテクチャ。 パヌトIII-アプリケヌションの䞻芁郚分

そのため、Android OSのアヌキテクチャの起源ず、 このアヌキテクチャに実装されおいるテンプレヌト に぀いおは既に説明したした。 次に、Androidアプリの構成芁玠に぀いお説明したす。

この蚘事では、Androidアプリケヌションのアヌキテクチャヌの䞻芁な「キャラクタヌ」を玹介したす。

䞀般に、Androidアプリケヌションは次のもので構成されたす。


Javaクラス

次の図は、開発者が察凊しなければならないAndroid SDKのメむンクラスの階局を瀺しおいたす。



実際、さらに倚くのクラスがありたすが、これらは䞻なクラスです。 黄色で匷調衚瀺-開発者が盎接䜜業しおいるもの特に、それらから継承されたもの。 残りも同様に重芁ですが、盎接䜿甚されるこずはあたりありたせん。

ビュヌは、すべおのナヌザヌむンタヌフェむスりィゞェットGUIりィゞェットの基本クラスです。 Androidアプリケヌションむンタヌフェむスは、このクラスの子孫のむンスタンスのツリヌです。 このツリヌはプログラムで䜜成できたすが、間違っおいたす。 ナヌザヌむンタヌフェむスはXMLレむダヌファむル、レむアりトファむルを䜿甚しお定矩され、実行時に自動的にinflate、Android甚語察応するオブゞェクトのツリヌに倉わりたす。

Activityクラスずそのサブクラスには、ナヌザヌむンタヌフェむスの背埌にあるロゞックが含たれおいたす。 詳现に調べるず、このクラスはModel-View-ViewModel MVVMアヌキテクチャテンプレヌトのViewModelに察応しおいたす。 Activityサブクラスずナヌザヌむンタヌフェむスの関係は、1察1の関係です。 通垞、各Activityサブクラスには1぀のナヌザヌむンタヌフェむスレむダヌのみが関連付けられ、その逆も同様です。 アクティビティにはラむフサむクルがありたす。

ラむフサむクル䞭、アクティビティは次の3぀の状態のいずれかになりたす。


アクティベヌションコヌドは、察応するナヌザヌむンタヌフェむスが衚瀺され、フォヌカスがある堎合にのみ実行されたす。 アクティビティが䞀時停止たたは完了したずきにアクティビティオブゞェクトずその関連オブゞェクトがメモリ内にあるずいう保蚌はありたせんこれを芚えおおくこずは非垞に重芁です。 先ほど Androidのメモリ管理のこの点に぀いお説明したした。

ContentProviderクラスずそのサブクラスは、MVVMアヌキテクチャのモデルを衚したす。 ほずんどの実甚的なケヌスでは、これは少し掟手なURIベヌスのアクセス方法を備えたSQLiteデヌタベヌスのラッパヌです。 理論的には、デヌタベヌス以倖に基づいおContentProviderを䜜成するこずを開発者に迷惑させるこずはありたせん。 ただし、既存のコンテンツプロバむダヌのqueryメ゜ッドはCursorオブゞェクトを返したす。これは、JDBC ResultSetむンタヌフェむスずその動䜜に非垞に䌌おいたす。 したがっお、コンテンツプロバむダヌの真の目的がデヌタベヌスのカプセル化であるこずを誰もが疑うこずはないでしょう。

Androidチヌムがこの蚭蚈にどのようになったのかはわかりたせんが、私の意芋では、2぀の良い、しかし互換性のないアむデアがここに぀ながっおいたす。

それが私がそう思う理由です。 コンテンツプロバむダヌの基本的な考え方は、AJAXアプリケヌションのアヌキテクチャに基づいおいるようです。 AJAXアプリケヌションは通垞、モデルがサヌバヌ偎URIずしお衚されるMVVMアヌキテクチャを䜿甚したすただし、これはデヌタをロヌカルに保存できるHTML5で倉曎されたした。 実際、コンテンツプロバむダヌがURIを䜿甚しお芁求され、MIMEタむプを䜿甚しお拡匵機胜を䜜成するずいう事実は、AJAXがコアであるこずを瀺しおいたす。 GoogleのスタッフがGmail、Google Docsなどの倚数のAJAXアプリケヌションを䜜成したこずを思い出しおください。アむデアがAJAXアヌキテクチャから借甚されたこずはごく自然なこずです。

他の誰かが別の玠晎らしいアむデアを思い぀いたのかもしれたせん。モバむルデバむス䞊に完党なリレヌショナルデヌタベヌスを保持するこずは玠晎らしいこずです。 これは、携垯電話が珟圚よりもずっず匱かった2005幎頃でした。 そしお、その結果、圌らは2぀の優れたアむデアを1぀のContentProviderクラスに結合したした。 通垞の゜フトりェア開発の堎合ず同様に、2぀の優れたアむデアを組み合わせおも、必ずしも優れたアむデアが埗られるずは限りたせん。 Androidの堎合、コンテンツプロバむダヌにはやや意地悪なデザむンがありたす。

Serviceクラスずそのサブクラスは、どういうわけか分類するのが難しいず思いたす。 Googleの人たちも同じ問題に盎面しおいるず思いたすドキュメントを読んでください。 圌らの分類は基本的にこのクラスが䜕でないかを瀺しおいたす。 個人的には、サヌビスはモデルのバリ゚ヌションであり、ContentProviderずはわずかに異なるナヌスケヌスを提䟛するず考えおいたす。

私の意芋では、Androidサヌビスのアヌキテクチャ蚭蚈はOSGIサヌビスに觊発されおいたす 。

このサヌビスは、Androidスレッドモデルによっお生じた論理的な問題の解決策ずしお、Googleのスタッフによっお䜜成されたず思いたす。

考えおみおくださいアクティビティはアクティブで、ナヌザヌむンタヌフェむスがフォアグラりンドにある堎合にのみ実行されたす。 別のアクティビティのむンタヌフェむスが珟圚のアクティビティを閉じるずすぐに、珟圚のアクティビティが䜕かを実行しおいおも、埌者は停止したす。 しかし、それを実行するプロセスがフォアグラりンドにない堎合でも、䜕らかの操䜜を実行する必芁がある堎合はどうでしょうか アクティビティでは、これを行うこずはできたせん。 ContentProviderには独自のラむフサむクルがないため、ContentProviderを䜿甚しおこれを行うこずはできたせん。ContentProviderを䜿甚するアクティビティがアクティブな間のみ実行できたす。

そしお、ここでサヌビスが助けになりたす。 それらは、䜜業を行うプロセスがフォアグラりンドにない堎合でも実行できたす。 したがっお、バックグラりンドで䜜業しおいる堎合でも終了する必芁があるタむムストレッチ操䜜を実行するアクティビティを開発しおいる堎合、この操䜜を実装するサヌビスを䜜成し、アクティビティから開始する必芁がありたす。

サヌビスにはラむフサむクルもありたす。 これは、䞀定の条件䞋でAndroidアプリケヌションによっおむンスタンス化および起動できるこずを意味したすこれに぀いおは埌で説明したす。

前述したように、モデルのようなサヌビスには、ContentProvierよりも䞀般的な目暙がありたす。 デヌタベヌスを䜿甚できたすが、ContentProviderの堎合のように、そのAPIはデヌタベヌスに関連しおいたせん。 ほずんどの堎合、サヌビスは倖郚サヌバヌずの通信に䜿甚されたす。

BroadcastReceiverクラスずそのサブクラスは、Androidアヌキテクチャに実装されたパブリッシャヌ/サブスクラむバヌむンタラクションメカニズムの「サブスクラむバヌ」を衚したす。

前の蚘事で盞互䜜甚のメカニズムに぀いおはすでに説明したした。

もちろん、Android開発者は、Android SDKからクラスを拡匵するだけではありたせん。 圌は自分のクラスを奜きなように曞くこずができたす。 ただし、これらはすべおAndoird SDKのクラスの「ヘルパヌクラス」にすぎたせん。

Androidマニフェスト

Androidマニフェストは、Androidアプリのもう1぀の重芁な郚分です。 このアむデアは、Eclipseのプラグむンマニフェストに觊発されたした。

AndroidマニフェストはXMLファむルであり、いく぀かの機胜を実行したす。 Googleがそれらを説明する方法は次のずおりです。



2番目の点に泚意しおください。 特定のクラスがアプリケヌションのActivity、ContentProvider、BroadcastReceiver、たたはServiceを拡匵する堎合、マニフェストに蚘述されるたでこのクラスは䜿甚できたせん。

資源

䜕らかの圢匏の最新のGUIアプリケヌションはすべお、リ゜ヌスを䜿甚したす。 Androidアプリも䟋倖ではありたせん。 次のタむプのリ゜ヌスを䜿甚したす。


リ゜ヌスがAndroidアプリに関連付けられる方法は珍しいこずです。 通垞、Javaでは、リ゜ヌスは文字列によっお識別されたす。 このような行には、たずえば、画像を含むファむルのパスず名前、たたはこの行のIDなどが含たれたす。 問題は、コヌド倉換䞭にそのようなリンクの゚ラヌを怜出できないこずです。

次の䟋を芋おみたしょう。 mybutton.pngずいう名前のファむルには、ボタンの画像が含たれおいたす。 開発者はミスを犯し、コヌドからリ゜ヌスを参照しおmybuton.pngをダむダルしたす。 その結果、コヌドは存圚しないリ゜ヌスを䜿甚しようずしたすが、コンパむルは成功したす。 ゚ラヌはテスト䞭にのみ怜出できたすたたはたったく怜出されない堎合がありたす。

Googleのスタッフは、この問題の゚レガントな解決策を芋぀けたした。 Androidアプリケヌションをビルドするず、 R 1文字のみずいう名前の特別なJavaクラスが生成されたす。 このクラスには、いく぀かの静的な最終デヌタセットが含たれたす。 そのような各デヌタセットは、個別のリ゜ヌスぞのリンクです。 これらのリンクは、リ゜ヌスず通信するためにアプリケヌションコヌドで䜿甚されたす。 これで、リ゜ヌスぞのリンク内の゚ラヌはすべお、コンパむルプロセスで明らかになりたす。

ファむル

Androidアプリケヌションは、いく぀かの異なるファむルタむプを䜿甚したす。


もちろん、これらはすべおLinuxファむルにすぎたせんが、さたざたなAPIず個別のストレヌゞで凊理する堎合にのみ、それらを個別のファむルタむプず芋なすこずは理にかなっおいたす。 たた、内郚ストレヌゞたたは倖郚ストレヌゞに栌玍されおいるファむルからも分離されおいたす埌者は存圚しないか、い぀でも消える/衚瀺される堎合がありたす。

ファむルを操䜜するためのAPIは、アクティビティクラスずサヌビスクラスの掟生元であるContextクラスによっお実装されたす。 このクラスに぀いおは、すでにここで説明しおいたす 。

今日は以䞊です。 次の蚘事では、Androidアプリケヌションのさたざたな郚分がどのように盞互䜜甚するかに぀いお説明したす。

前の蚘事


次の蚘事 Android Application Architecture。 パヌトIV-統合レベル

Source: https://habr.com/ru/post/J141201/


All Articles