Android Studioでアプリ開発!

Androidアプリ開発初心者の備忘録です。

Android Studioで最初のアクティビティに遷移する方法

最初の画面に戻りたい

Androidアプリで複数の画面を作る場合、1回の操作で最初の画面に戻りたいことがあります(「TOPへ戻る」「タイトル画面に戻る」ボタンなど)。
今回はその方法について説明したいと思います。
アクティビティ間でデータの受け渡しを行う方法 - Android Studioでアプリ開発!で使ったプロジェクトを元に実装していきます。

完成イメージ

ActivityFirst → ActivitySecond → ActivityThird → ActivityFirst と遷移していきます。各アクティビティ間で「遷移した回数」を受け渡し、onCreate() で回数を +1 し、Toast で表示します。今回の方法では ActivityThird → ActivityFirst に遷移しても Toast は表示されません。また、「遷移した回数」は 1 に戻ります。
f:id:jolene:20140726092708p:plain
f:id:jolene:20140726092715p:plain
f:id:jolene:20140726092721p:plain
f:id:jolene:20140726092727p:plain

ActivityThird のレイアウトを設定する

ActivityFirst に遷移するボタンとクリックイベント時に呼ばれるメソッドを記述しています。

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ActivityThird">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/lbl_btnToFirst"
        android:id="@+id/btnToFirst"
        android:onClick="onClick" />
</RelativeLayout>

プログラムを記述する

ActivityFirst に変更はありません。

ActivitySecond は ActivityThird に遷移するように変更します。

package com.example.transitiontest;

import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.content.Intent;
import android.widget.Toast;

public class ActivitySecond extends Activity {
    private int mTransitionCount;   // 遷移した回数

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        // Intent を取得する
        Intent intent = getIntent();

        // キーを元にデータを取得する(データがない場合、第2引数の 0 が返る)
        mTransitionCount = intent.getIntExtra("TransitionCount", 0);

        // 遷移した回数を +1 する
        mTransitionCount++;

        // 遷移した回数を Toast で表示する
        Toast toast = Toast.makeText(this, String.format("遷移した回数:%d", mTransitionCount), Toast.LENGTH_LONG);
        toast.setGravity(Gravity.TOP, 0, 200);
        toast.show();
    }

    // 省略

    public void onClick(View view){
        switch (view.getId()){
            case R.id.btnToThird:
                // Intent のインスタンスを取得する
                Intent intent = new Intent(this, ActivityThird.class);

                // 渡したいデータとキーを指定する
                intent.putExtra("TransitionCount", mTransitionCount);

                // 遷移先の画面を呼び出す
                startActivity(intent);
                break;
        }
    }
}

ActivityThird は ActivityFirst に遷移するように記述します。重要なのは Intent にフラグを付加していることです。FLAG_ACTIVITY_CLEAR_TOP で ActivityFirst より上に存在するアクティビティをクリアします。FLAG_ACTIVITY_SINGLE_TOP で既に存在する ActivityFirst を再利用します。ActivityFirst の onCreate() は呼ばれません。
このようにフラグを付加することにより、最初の画面に戻ることができます。また、端末の「戻る」ボタンを押しても ActivityFirst から ActivityThird に遷移することはできなくなります。

package com.example.transitiontest;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;

import com.example.transitiontest.R;

public class ActivityThird extends Activity {
    private int mTransitionCount;   // 遷移した回数

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_third);

        // Intent を取得する
        Intent intent = getIntent();

        // キーを元にデータを取得する(データがない場合、第2引数の 0 が返る)
        mTransitionCount = intent.getIntExtra("TransitionCount", 0);

        // 遷移した回数を +1 する
        mTransitionCount++;

        // 遷移した回数を Toast で表示する
        Toast toast = Toast.makeText(this, String.format("遷移した回数:%d", mTransitionCount), Toast.LENGTH_LONG);
        toast.setGravity(Gravity.TOP, 0, 200);
        toast.show();
    }

    // 省略

    public void onClick(View view){
        switch (view.getId()){
            case R.id.btnToFirst:
                // Intent のインスタンスを取得する(最初の画面)
                Intent intent = new Intent(this, ActivityFirst.class);

                // 渡したいデータとキーを指定する
                intent.putExtra("TransitionCount", mTransitionCount);

                // ActivitySecond と ActivityThird を消す
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

                // ActivityFirst を再利用する(onCreate() は呼ばれない)
                intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

                // 遷移先の画面を呼び出す
                startActivity(intent);
                break;
        }
    }
}

以上の実装を行うことにより、冒頭の完成イメージのように動作します。

まとめ

複数の画面がある場合に最初の画面に戻る方法を説明しました。肝になるのは Intent にフラグを付加することです。
Androidアプリを作る場合に最初の画面に戻る操作は比較的よく使うと思います。実装は難しくないのでぜひ活用してみてください。

Android StudioではじめるAndroidプログラミング入門

Android StudioではじめるAndroidプログラミング入門

初歩からわかるAndroid最新プログラミング 増補改訂版

初歩からわかるAndroid最新プログラミング 増補改訂版