#親の顔より見た
Androidの学習を始めて、最初に目にするコードがActivityに関するものではないかなと思います。
そんな、Activityですがそれとなく使っていても「なんなのかは正直わかってない」のが多くの人の現状だと思うので、今回はこちらを掘り下げていきたいと思います。
#Activityとは?
「画面」のことです。
使っていて、これは腑に落ちることだと思います。
ドキュメントを読んで、さらに深堀りしていきます。
Activity クラスは Android アプリの重要なコンポーネントであり、アクティビティの開始方法と組み立て方法はプラットフォームのアプリケーション モデルを構成する際の基本的な要素です。
かなり重要そうですね。
Androidアプリを構成する骨格となるようです。
どう大事なのでしょうか?
アプリの構成について、このような記述があります。
モバイルアプリのエクスペリエンスはパソコンと異なり、ユーザーの操作が必ずしも同じ場所で開始されるとは限りません。ユーザーの操作が定められた状態で開始されることはほとんどありません。たとえば、ホーム画面からメールアプリを開くと、メールの一覧が表示されます。一方、ソーシャルメディア アプリを使用していて、そのアプリからメールアプリを起動した場合は、メールアプリのメール作成画面に直接移動できます。
ふむふむ。確かに、確かに。
個人的な出来事だと、自分のクソなpaizaのレートをツイートしようと思い、Twitterに自動遷移すると、TL画面に行かずにツイート画面に移動するアレですな。
Activity クラスは、このような枠組みを利用しやすいように設計されています。
なるほどぉ。
それは、大事ですね。
どうやって、実現しているのでしょうか?
1 つのアプリが別のアプリを呼び出すとき、呼び出し元のアプリは、別のアプリ全体をひとまとめとして呼び出すのではなく、その中のアクティビティを呼び出します。そうすることで、アクティビティが、アプリがユーザーとやり取りする際のエントリ ポイントとして機能します。なお、アクティビティの実装は Activity クラスのサブクラスとして行います。
へぇー!そうなんだ!
知らんかったぁ。
カメラインテントで、カメラ「アプリ」を呼び出していると思っていたのですが、実際にはカメラを撮影する画面のActivityを呼んでいたのですね。
つまり、Activityがそのアプリのエントリーポイントを担うということ。
そして、Activityが複数あることで、複数のエントリーポイントを作ることができる。
こんな理解であってますかね?(ツッコミお待ちしております)
また、それによって先程の該当箇所への柔軟な遷移ができるわけですね。
アクティビティにより、アプリが UI を描画するウィンドウが用意されます。通常、このウィンドウは画面全体に表示されますが、画面よりも小さく、他のウィンドウの上に重なることもあります。一般に、1 つのアクティビティがアプリ内の 1 つの画面を実装します。たとえば、アプリのアクティビティの 1 つが「設定」画面を実装し、他のアクティビティが「写真を選択」画面を実装します。
うん。やはり、Activityは「画面」と表現して問題ないようですね。
初学者で頭がパンクしそうな方は、この二文字だけ覚えておけば大丈夫そうです。
アクティビティ同士が連携してアプリ内にまとまりのあるユーザー エクスペリエンスを形成しますが、各アクティビティは他のアクティビティと緩やかに結びついているだけです。アプリ内のアクティビティ間に依存関係はほとんどありません。アクティビティが他のアプリに属するアクティビティを開始することも実際によくあります。たとえば、ブラウザアプリがソーシャルメディア アプリの共有アクティビティを起動することもあります。
繰り返しになりますが、Activityは「画面」であり、そして、それは一つの独立したものであるみたいです。
###Manifestの設定
アクティビティをアプリで使用するには、アプリのマニフェストにその情報を登録する必要があります。また、アクティビティのライフサイクルを適切に管理する必要もあります。このドキュメントの後半では、これらのトピックについて説明します。
ふむふむ。
初学の時、なんでActivityを新規で作るたびにmanifestに記述しなくちゃいけないのだろう。。。
と、疑問に思っていましたがここまでの話を受けると納得ですな。
<application>ネスト内に、<activity>を追加と。
ついでに、manifestにて、地味に気になってたこいつ→<intent-filter>
(気になってたの自分だけ???)
こいつも深堀しちゃいましょう。
インテント フィルタは、Android プラットフォームの非常に強力な機能です。明示的なリクエストだけでなく、暗黙的なリクエストに基づいてアクティビティを起動する機能を提供します。
な、なんかすごそう!!
明示的インテントは、遷移先を明確に指示するもので、
暗黙的インテントは、指示が曖昧です。
なんかはっきりしない、草食系男子みたいなものです。
ここに関しては、珍しくドキュメントの例が分かりやすかった笑笑。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
たとえば、明示的なリクエストでは、「Gmail アプリでのメール送信アクティビティの開始」をシステムに指示します。一方、暗黙的なリクエストでは、「この作業を行えるアクティビティでのメール送信画面の開始」をシステムに指示します。
インテント フィルタは、システム UI がタスクの実行に使用するアプリの選択をユーザーに求める際に利用されます。
ふむふむ。
インテントに関する設定諸々をしている感じですかね。
###ライフサイクルについて
アクティビティのライフサイクルには、さまざまな状態があり、一連のコールバックを使用することで、状態間の遷移を処理します。
さてさて、「画面」ことActivityには、ライフサイクルというものがあります。
「画面」は生成されて、停止、再開、破棄と状態が変化します。
その各状態のことをまとめてライフサイクルと呼んでいます。
「画面」の「人生」ですね。
####onCreate
onCreate()
このコールバックは必ず実装してください。システムによってアクティビティが作成される際に呼び出されるコールバックです。実装の際は、アクティビティの基本的なコンポーネントを初期化する必要があります。たとえば、アプリでビューを作成し、そこに一覧表示するデータをバインドするなどです。なお、ここで setContentView() を呼び出して、アクティビティのユーザー インターフェースのレイアウトを定義することが非常に重要です。
onCreate() が終了すると、次のコールバックは常に onStart() になります。
onCreate()は、「画面」の「人生」における「誕生」のことです。
これが、ないとそもそも存在しないので必ず実装するわけですね。
ここで、画面のテキストやらボタンやらのパーツを初期化して、またsetContentViewでレイアウトを作るようです。
で、大事なのが、この時点では「表示」はしていません。
自分は、勘違いしてました・・・・
####onStart
onStart()
onCreate() が終了すると、アクティビティは開始状態になり、アクティビティがユーザーに表示されます。このコールバックには、アクティビティがフォアグラウンドになり、操作可能になるための最後の準備が含まれます
生まれたての「画面」も立派に育ち、晴れてユーザーという「社会」に飛び立つ準備ができたようです。
####onResume
onResume()
アクティビティがユーザーとやり取りを始める直前に、このコールバックが呼び出されます。この時点で、アクティビティはアクティビティ スタックの最上位にあり、すべてのユーザー入力を取得します。アプリの主な機能のほとんどは onResume() メソッドに実装されます。
「画面」はさらに成長し、一人でできることが増えました。
ユーザーとコミュニケーションを取れるようになります。
####onPause
onPause()
アクティビティがフォーカスを失って一時停止状態になると、onPause() が呼び出されます。この状態は、たとえばユーザーが [戻る] ボタンや [最近] ボタンをタップした場合に発生します。システムがアクティビティの onPause() を呼び出すときは、厳密にはアクティビティが部分的に表示された状態であることを意味しますが、ほとんどの場合、ユーザーがアクティビティから離れ、すぐに停止あるいは再開状態に入ることを示します。
でも、「画面」は、人見知りのようです。
ユーザーという社会と接点が作れません。
####onStop
onStop()
アクティビティがユーザーに表示されなくなった場合、onStop() が呼び出されます。発生要因としては、アクティビティが破棄されている、新しいアクティビティが開始されている、既存のアクティビティが再開状態に入って停止したアクティビティに重複する、などが挙げられます。このような場合、停止したアクティビティは一切表示されなくなります。
「画面」は、鬱になりました。
家に引きこもって、ユーザーという社会の目から逃れます。
####onRestart
onRestart()
停止状態のアクティビティが再起動しようとすると、このコールバックが呼び出されます。onRestart() により、アクティビティの状態が停止した時点の状態に復元されます。
このコールバックの後には必ず onStart() が呼び出されます。
復活!!!社会に出ていきます!
再び、社会に飛び立つ準備をします(onStartを呼び出す)
####onDestroy
onDestroy()
アクティビティが破棄される前に、このコールバックが呼び出されます。
「画面」は死亡しました。
と、ふざけた解説でしたが、割とわかりやすかったのでは!?と個人的に思います。
以上で、Activityの深掘り作業を終了します!
#終わり
「少し」掘り下げるとタイトル付けたのに、だいぶ掘り下げた感じ。
インテントで、Activityのみ呼び出すという発見が、個人的に面白かった。
次は、Fragment編か、またConetxt編やろうかなと。
何か、要望があればそれを書きます。
override fun onDestrory() {
super.onDestroy()
println("また、お会いしましょう")
}