Androidの学習まとめ
前提
iOS開発者目線でのAndroidを学習したときの備忘録
参考図書
※今は第三版が出てる(↓)
基礎知識
iOS | Android | |
---|---|---|
開発主体 | Apple | |
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 | ? |
iOSとAndroidの違い
AndroidのView構造
AndroidのViewは基本以下の三つのファイルで構成される
- アクティビティクラス(Kotlinソース、Viewの制御を定義)
- レイアウトファイル(xmlファイル、Viewの見た目を定義)
- AndroidManifest(xmlファイル、View(Activity)の存在を定義)
※疑問:UIKitのようにxmlを使用せずにViewを定義することは可能なのだろうか?
画面遷移
基本概念はiOSと同じく、遷移前の画面に遷移先の画面を重ねていく
※重要なのは「移る」のではなく、「重ねる」ということ
画面遷移が発生したとき、遷移前の画面は遷移前の状態が保存され、ライフサイクルに則って処理が走らない限り、遷移先の画面から戻ってきた際にも遷移前の状態のまま表示される
遷移先の画面が閉じるとき、遷移先の画面は破棄する
-> そのため、画面を「戻る」ときは画面の処理を終了する
finish()
※なので、「画面遷移」といいつつ、実際の処理は遷移先の画面が表示されたり、消えたりしているだけ
※疑問:これだけだとiOSと違いは感じないが、具体的にどう何が違うのだろうか?
Intentとは?
※割と重要であることに注意
インテントとは、「何かを行う意図」という意味で、幅広い役割として利用可能ですが、特定のアクションをリクエストする時に使用できる、メッセージングオブジェクトのことを意味しています。例えば別の画面を開きたい時に、AndroidではActivity単位で画面が作られますが、「開いている画面に対して別の画面を開いてください」とアプリにメッセージとして伝えることで、別の画面を開くことが可能になります。
-> まとめると"何かしらの動作命令をOSに出すことができるオブジェクトクラス"
ということになる?
なお、Intent自体は「Activityを開く」以外にも広く使われることに注意
参考: 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)
データを受け取るときもIntentを経由する
Activityを宣言した段階で、受け取ったIntentをプロパティintentとして保持している
そのため、intentを参照して、get***Extra()を宣言することで受け取ることができる
val menuName = intent.getStringExtra("menuName")
val menuPrice = intent.getStringExtra("menuPrice")
タップ処理の定義
-> タップの定義は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と同名のメソッドが、タップイベント感知時に自動的に実行される。
Androidのログ処理
AndroidのログはLogクラスによって処理される
Androidのライフサイクル
AndroidでのライフサイクルはActivity自体が持つライフサイクルとFragmentが持つライフサイクルの二つがある
Activityのライフサイクル
Fragmentのライフサイクル
レイアウトXML
絶対必要なモノ
ステータスバーと被らないようにするには以下の属性を一番上位のレイアウトに付与する必要がある
android:fitsSystemWindows="true"