Open10

Androidの学習まとめ

frank@iOSdevfrank@iOSdev

基礎知識

iOS Android
開発主体 Apple Google
OSS? No Yes
搭載端末数 Apple製のスマートフォン。タブレットのみ かなり多数
最新バージョン(2024.8現在) iOS17 Android14

開発系

iOS Android
言語 Swift, Objective-C Java, Kotlin
IDE Xcode Android Studio(かつてはEclipseを使用していたことがあったらしい)
UI Storyboard(UIKit), SwiftUI XML(Android View), Jetpack Compose
パッケージマネージャー Swift Package Manager, Cocoapods, Carthage ?
frank@iOSdevfrank@iOSdev

AndroidのView構造

AndroidのViewは基本以下の三つのファイルで構成される

  • アクティビティクラス(Kotlinソース、Viewの制御を定義)
  • レイアウトファイル(xmlファイル、Viewの見た目を定義)
  • AndroidManifest(xmlファイル、View(Activity)の存在を定義)

※疑問:UIKitのようにxmlを使用せずにViewを定義することは可能なのだろうか?

画面遷移

基本概念はiOSと同じく、遷移前の画面に遷移先の画面を重ねていく
※重要なのは「移る」のではなく、「重ねる」ということ
画面遷移の模式図

画面遷移が発生したとき、遷移前の画面は遷移前の状態が保存され、ライフサイクルに則って処理が走らない限り、遷移先の画面から戻ってきた際にも遷移前の状態のまま表示される
遷移先の画面が閉じるとき、遷移先の画面は破棄する
-> そのため、画面を「戻る」ときは画面の処理を終了する

finish()

※なので、「画面遷移」といいつつ、実際の処理は遷移先の画面が表示されたり、消えたりしているだけ

※疑問:これだけだとiOSと違いは感じないが、具体的にどう何が違うのだろうか?

frank@iOSdevfrank@iOSdev

Intentとは?

※割と重要であることに注意

インテントとは、「何かを行う意図」という意味で、幅広い役割として利用可能ですが、特定のアクションをリクエストする時に使用できる、メッセージングオブジェクトのことを意味しています。例えば別の画面を開きたい時に、AndroidではActivity単位で画面が作られますが、「開いている画面に対して別の画面を開いてください」とアプリにメッセージとして伝えることで、別の画面を開くことが可能になります。

-> まとめると"何かしらの動作命令をOSに出すことができるオブジェクトクラス"

ということになる?

なお、Intent自体は「Activityを開く」以外にも広く使われることに注意

参考: https://techgrowup.net/2021/05/18/android-intent/
https://techgrowup.net/2021/05/18/android-intent/

Intentを通じてデータを渡すことができる

画面遷移など、遷移先の画面にデータを渡す場合、Intentに渡すことで遷移先の画面にデータを反映させることが可能
例:

// Intentクラスのインスタンス化/引数(context, 起動するクラス)
//   "class.java": KotlinがJVM上で動作する言語であり、起動するクラスはJavaとして渡す必要あり
//   --> class.javaを使うことでKotlinクラスをJavaクラスとして渡すことが可能
val intent2MenuThanks = Intent(this@MainActivity, MenuThanksActivity::class.java)


intent2MenuThanks.putExtra("menuName", menuName)
intent2MenuThanks.putExtra("menuPrice", menuPrice)

startActivity(intent2MenuThanks)
frank@iOSdevfrank@iOSdev

データを受け取るときもIntentを経由する

Activityを宣言した段階で、受け取ったIntentをプロパティintentとして保持している
そのため、intentを参照して、get***Extra()を宣言することで受け取ることができる

val menuName = intent.getStringExtra("menuName")
val menuPrice = intent.getStringExtra("menuPrice")
frank@iOSdevfrank@iOSdev

タップ処理の定義

-> タップの定義はxmlにonClick属性を付与する

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:onClick="onBackButtonClick"
    android:text="@string/bt_thx_back"/>

-> タップ時の処理はActivityクラスに定義した同名のメソッドを定義する

"android:onClick"属性に定義したStringと同名のメソッドが、タップイベント感知時に自動的に実行される。

frank@iOSdevfrank@iOSdev

レイアウトXML

絶対必要なモノ

ステータスバーと被らないようにするには以下の属性を一番上位のレイアウトに付与する必要がある

android:fitsSystemWindows="true"