Androidアプリ開発大好きなみなさまー!作業は順調ですか?
メモリアインクのすだです。
本日は、
KotlinにおけるActivityの基本的な考え方と使い方、さらにはActivity間の画面遷移について一緒に学んでいきましょう!
この記事を読んでわかること…
・Activityとは?
・Activityの使い方
・Activity同士の画面遷移の方法
環境
- Kotlin (ver 1.9.0)
- Android Studio (Giraffe | 2022.3.1 Patch 3)
Activityとは?
Activityは、簡単にいうと アプリの「画面の大元(おおもと)」です。
例えば、「マイページ」「ログイン画面」「商品一覧画面」「注文画面」… など、画面の大元がそれぞれが異なる”Activity”で作られています。
ユーザーがアプリを操作したとき、別の画面へ移動する時はこのActivityが切り替わっている ということになります。
本で例えると「章」、アニメで例えると「シーン」に当たるかと思います。
場面の大元を切り替えたい時、「章」や「シーン」で区切るように
Androidアプリの画面も 「Activity」で区切って構成します。
Activityを使用するメリット
先ほどお伝えした通り、画面の大元がActivityで区切られていることによって
それぞれが特定の機能や目的を持って独立することができます。
「ログイン画面」:ユーザー名やパスワードの入力フィールド、ログインボタン、新規登録へのリンク
「マイページ」:プロフィール情報の編集、注文履歴の表示、設定の変更などユーザー関連の機能
「商品一覧画面」:アプリ内で提供される商品やサービスの一覧(商品の写真、説明、価格など)
「注文画面」:商品の詳細、数量の選択、配送オプションの指定など、購入に関する様々なステップ
このようにシーンごとに適切に分割されていることによって、コード管理やリソース管理、開発の効率や保守に大きく貢献します。
構造が明確に分かれていることによって アプリを品質良く保つことができるでしょう。
Activity ごとに一貫したデザインや特徴を持つことで、ユーザー体験の向上、メンテナンスの容易さなどにも役立つため、Kotlinでのアプリ開発にActivityの使用は必須となります。
Activityを使用するデメリット
Activity、実は少々重いコンポーネント(部品)で 、多くのリソースを消費します。
1つのアプリにActivityが存在しすぎると メモリやパフォーマンスに影響を与えてしまいます。
Activity同士の遷移には時間がかかる場合もあるので、
遷移時のアニメーションやロードの長さによっては ユーザーが使いづらいと感じでしまうこともあるでしょう。
また、Activity設計・構成によっては 煩雑化して逆に管理しづらいものとなってしまう可能性もあります。
適切な使い方をする必要があるため、
アプリの場面や機能分けをきちんと計画しておく必要がありますね〜!
Activityについて学んだところで、
次はActivity同士(画面)の遷移を試してみましょう!
Activity同士の画面遷移
遷移時の書き方
では早速、実際にコードを書いてActivityから別のActivityへ遷移させてみましょう!
「画面①(MainActivity)」にあるボタンを押すと「画面②(SubActivity)」に遷移、
「画面②(SubActivity)」にあるボタンを押すと「画面①(MainActivity)」に遷移する(戻る) という実装を行ってみます。
ボタン押下時のイベントリスナーに関しては、別記事でも詳しくご紹介しているので ぜひぜひご覧ください!↓
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
android:padding="16dp"
android:background="@color/pink">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="メイン画面だよ"
android:textSize="18sp"/>
<Button
android:id="@+id/button_to_sub"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="サブ画面へ遷移する"
android:layout_marginTop="16dp"/>
</LinearLayout>
画面中央に、テキストとボタンを1つ用意します。
MainActivity.kt
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// ボタン要素(オブジェクト)を取得
val buttonToSubActivity = findViewById<Button>(R.id.button_to_sub)
// ボタンタップ時のイベントリスナー
buttonToSubActivity.setOnClickListener {
val intent = Intent(this, SubActivity::class.java)
startActivity(intent)
}
}
}
ボタンタップ時のイベントリスナーの中に、画面遷移の処理を書いています。
val intent = Intent(this, SubActivity::class.java)
Intent
とは、異なるコンポーネント(2 つのアクティビティなど)間でなにか処理を行いたい時に 「つなぎの役割をしてくれるもの」です。
Intentの使い方は様々で、
今回の画面遷移時やデータの受け渡し、コンポーネント(部品)同士の通信や外部アプリとの連携など
多くのシーンで「つなぎ」の役割を担うことで 移動や送受信をスムーズにする働きがあります!
startActivity(intent)
ここで、新しいアクティビティを開始するための基本的なメソッドstartActivity
を使用します。
引数に さきほどのintent
でつないだSubActivity(画面)を渡してあげることで、
画面が立ち上がります(=画面遷移)。
では反対に、MainActivityへ戻る記述も書いてみます。
activity_sub.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
android:padding="16dp"
android:background="@color/blue">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="サブ画面だよ"
android:textSize="18sp"/>
<Button
android:id="@+id/button_to_main"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="メイン画面へ遷移する"
android:layout_marginTop="16dp"/>
</LinearLayout>
SubActivity.kt
class SubActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_sub)
// ボタン要素(オブジェクト)を取得
val buttonToMainActivity = findViewById<Button>(R.id.button_to_main)
// ボタンタップ時のイベントリスナー
buttonToMainActivity.setOnClickListener {
val intent = Intent(this, MainActivity::class.java)
startActivity(intent)
finish()
}
}
}
finish()
は「アクティビティを終了させる」働きのある記述です。
これにより、立ち上がっていたSubActivity(画面②)は終了します。
先ほどのMainActivity(画面①)はfinish()を書いていないので 画面②が立ち上がっている裏で密かに画面として残り続けているという仕組み。
画面②が終了したことよって 密かに残り続けていた画面①が再度表示されるというイメージです。
最後に、
/app/src/main/AndroidManifest.xml
(= アプリの設定と構造に関する情報を書くファイル)の中身を確認します。
<application
~~~~ 省略 ~~~~
<activity android:name=".MainActivity"></activity>
<activity android:name=".SubActivity"></activity>
</application>
AndroidManifest.xml の <application />
タグ内に、すべてのActivityを登録する必要があります。
(Activity作成時は必ず記述を追加してください)
それでは、実際に画面を動かしてみましょう↓
ボタンタップで別Activityに遷移できました〜!
Activityのstartとfinishについて
Activityをstartしたときは、新しくインスタンスが作成されます。
先ほども少しお話ししたのですが、
基本的にActivityは finish(終了)せずにstartしていくと 立ち上がったままの状態でどんどん積み重なっていくイメージです。(バックスタックに残り続ける という言い方もします)
バックスタックに残り続けるメリットとしては、
- 以前立ち上げたActivityに戻りたい場合に挙動がスムーズになる
- 前のアクティビティの状態(ユーザー入力、スクロール位置など)が保持される
- 新しいインスタンスを作成せずに前のアクティビティに戻れるため、メモリを節約できる
といった点が挙げられますが、
かえって デメリットとしては
- 複数のアクティビティがメモリを消費し続ける
という点があります。
では どんなときにアクティビティをfinifh(終了)させるべきかというと、
- 一度きりのActivity(ログイン、サインアップなどの 一度完了すると戻る必要のない画面)
- 処理が再開するとき(注文完了しホーム画面へ戻るとき、これまで立ち上がっていたActivityをfinishする)
などなど、明確な意図がある状態でActivityを終了させる記述をするとよいでしょう。
一度生成されたActivity(インスタンス)は finishするまで残り続けるので、
画面構成が複雑な場合や画面数が多い場合は
メモリ消費とユーザーの使用感を考慮して適切な実装を行う必要がありますね〜!
まとめ
おつかれさまでした!
Activityを理解することは、Kotlinで実装をするうえで非常に重要なポイントであり、基礎となります。
ぜひコードを書いて動かしながら理解を深めてくださいね!
技術者としてのキャリアパスを次のレベルへと進めたい皆様、
未経験からIT・Webエンジニアを目指すなら【ユニゾンキャリア】
自分の市場価値をさらに向上させてみませんか?
また次の記事でお会いしましょう〜!
コメント
コメント一覧 (1件)
[…] 【Android】KotlinにおけるActivityの使い方と、画面遷移(startActivity、finish)の… […]