Intentをつかった画面遷移から元のActivityへの戻り方

JUnitについての書籍が遂に発売します!
Java開発時のユニットテストを加速する「JUnit速効レシピ」


Androidアプリ開発で、ある画面から別の画面へ遷移する方法と、
逆に遷移先から元の画面へ戻る方法をソースコード付きで解説します。


  1. Activityをアプリに認識させよう
  2. 画面遷移の前に画面の作成から!簡単なActivity!
  3. 画面遷移の方法!Intentを使って指定のActivityへ制御を移す!
  4. 遷移先のActivityから元のActivityへ戻ろう


Activityをアプリに認識させよう



まず、Android開発の基本として、シーンという概念といいますか、
画面毎の振舞、活動を制御する為にはActivityクラスを継承したクラスにて
画面内の制御を構築していきます。

ですので、画面遷移==シーン遷移==Activity遷移といったイメージで、
実装内容としては、あるActivityから別のActivityへ制御を移し、
それぞれのActivityで画面の表示等の制御を行います。

Activityクラスの作り方やActivity自体のライフサイクルについては、別の機会に詳しく解説いたしますが、
今回は一つの画面に一つのActivityがあるという雰囲気を感じて下さい。


前段階として、
新しいActivityはAndroidManifest.xmlにて宣言する必要がありますが、
今回はあくまで画面遷移についての解説ですので、簡単に説明します。

下記の様な記述をAndroidManifest.xml内に追加してください。





前段階の準備は以上です。

android:name="Test1Activity"の部分に、新しく追加したActivityのクラス名を記述します。
この宣言は、Activity毎にするものですので、AndroidManifest.xml内に次々と追加されていく事でしょう。


それでは早速画面遷移を実装したActivityクラスの実装コードの紹介から。






画面遷移の前に画面の作成から!簡単なActivity!




まずは簡単にですが、Activityクラスの実装サンプルを下記に明記します。
内容としては、画面内に設置したレイアウトへボタンを追加し、
ボタンをタップされたら専用のメソッドが呼ばれ、
そのメソッド内にて新しいActivityへ制御を移す処理を記述しています。

実装サンプルはこちら↓↓


package com.example.androidhelloworld;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.view.Gravity;
import android.view.View.OnClickListener;
import android.view.ViewGroup;

public class MainActivity extends Activity implements OnClickListener
{
 // レイアウトの定数を省略してメンバに保持
 private final int MP = ViewGroup.LayoutParams.MATCH_PARENT;

 //--------------------------------------------------------------------------
 // ボタンが押された時の処理
 //--------------------------------------------------------------------------
 public void onClick( View v_ )
 {
  // 遷移先のActivityを指定して、Intentを作成する
  Intent intent = new Intent( this, Test1Activity.class );

  // 遷移先のアクティビティを起動させる
  startActivity( intent );
 }

 //--------------------------------------------------------------------------
 // ライフサイクル 1 : アクティビティ初期化(iOSの、viewDidLoad)
 //--------------------------------------------------------------------------
 public void onCreate( Bundle saved_instance_state_ )
 {
  super.onCreate( saved_instance_state_ );

  // ボタンのインスタンスを作成する
  Button button = new Button( this );

  // ボタンにクリックイベントの通知先を設定する
  button.setOnClickListener( this );

  // ボタンにテキストを表示する
  button.setText( "Test1Activityへ遷移" );
  
  // レイアウトを作成する
  LinearLayout linear_layout = new LinearLayout( this );

  // レイアウトを画面に描画する
  setContentView( linear_layout );
  
  // レイアウト内要素の設定を作成する
  LinearLayout.LayoutParams layout_params = new LinearLayout.LayoutParams( MP, 80 );
  layout_params.gravity = Gravity.CENTER_VERTICAL;

  // ボタンをレイアウトに配置する
  linear_layout.addView( button, layout_params );
 }

 //--------------------------------------------------------------------------
 // ライフサイクル 2 : アクティビティ開始(iOSの、viewWillAppear)
 //--------------------------------------------------------------------------
 public void onStart()
 {
  super.onStart();
 }

 //--------------------------------------------------------------------------
 // ライフサイクル 3 : 破棄
 //--------------------------------------------------------------------------
 public void onDestroy()
 {
  // ...code...

  super.onDestroy();
 }
}




簡単にですが、Activityクラスのライフサイクルについての言及もコメントとして残しました。
同じくスマホアプリの開発として、iPhone/iPad/iPod等に代表するiOSプログラミングで使用する
viewControllerとの比較としてコメントさせて頂きました。
iOSアプリ開発者の方で、Androidアプリを挑戦されている方には
ライフサイクルがイメージしやすいのではないでしょうか?

本当ですと、Androidではイベントの発生順序が複雑で、ライフサイクルに関しても
もっと詳しく解説する必要があるとは思いますが、今回はあくまで画面遷移についてですので、
簡単によく使うライフサイクルだけ実装しました。


まず、onCreate()から解説します。
onCreate()内では、画面構築に必要な要素を設置したりといった
画面構成に関係する処理を記述します。

今回のサンプルでは、画面内にレイアウトを配置して、ボタンを設置。
ボタンにはボタンタップ時のイベントを通知する対象として(this)自クラスを指定しています。
この指定によって、ボタンがタップされた時は自クラスのonClick()メソッドが呼ばれる様になります。
このボタンタップイベントの通知を扱うには、Activityクラスに対してOnClickListenerをimplementsする必要があります。





画面遷移の方法!Intentを使って指定のActivityへ制御を移す!




そして、いよいよ具体的な画面遷移の方法です。
ボタンタップ時の処理としてonClick()メソッド内に書かれている処理が基本的な画面遷移の方法です。


//--------------------------------------------------------------------------
// ボタンが押された時の処理
//--------------------------------------------------------------------------
public void onClick( View v_ )
{
 // 遷移先のActivityを指定して、Intentを作成する
 Intent intent = new Intent( this, Test1Activity.class );

 // 遷移先のアクティビティを起動させる
 startActivity( intent );
}



画面遷移はIntentクラスを介して行います。
まず、Intentを作成する時のコンストラクタとして、
第一引数に遷移元のActivityを指定し、第二引数には遷移先のActivityを指定します。
第二引数のActivityは、特に新たなインスタンスを作成する必要はありません。内部的に勝手に処理してくれます。


// 遷移先のActivityを指定して、Intentを作成する
Intent intent = new Intent( this, Test1Activity.class );


このIntentは、あくまで遷移させたいリクエストをAndroidOSへ伝える為の箱だと思ってください。
主にOSに対する動作要求を設定していきます。

また、Intentには様々なオプションを設定する事も出来ます。
オプションの付け方はとても簡単で、専用のsetFlags()メソッドへ定数を引数として渡してあげます


intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);



指定出来る定数と、機能は下記を参照下さい。


FLAG_ACTIVITY_NEW_TASK新しいタスクでActivityを起動
FLAG_ACTIVITY_SINGLE_TOP現在のActivityと同じアクティビティは起動しない
FLAG_ACTIVITY_CLEAR_TOP該当のActivity上にスタックされたタスクをクリアしてから起動
FLAG_ACTIVITY_NO_ANIMATIONトランジションアニメーション無し
FLAG_ACTIVITY_NO_HISTORY起動時にスタックに追加しない
FLAG_ACTIVITY_LAUNCHED_FROM_HISTORYスタック内のActivityを使いまわす
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS履歴内のActivityを使いまわす
FLAG_ACTIVITY_PREVIOUS_IS_TOP元のActivityをタスクのトップとして起動する
FLAG_ACTIVITY_REORDER_TO_FRONTスタック内の同一Activityを最前面へ移動させる



そして、画面遷移に対する設定をintentへ詰め込んだら、
startActivity()メソッドへintentを渡してあげる事でOSへ通知され、
制御するActivityが切り替わり、画面の表示が指定のActivityで構築されたものへと移動します。


// 遷移先のアクティビティを起動させる
startActivity( intent );





遷移先のActivityから元のActivityへ戻ろう




Android開発での画面遷移では、Activityがタスクとしてスタックに積まれていきます。
元のActivityへ戻る際は、現在実行中のActivityを終了(タスクから削除)する事で、
一つ前のActivityへ戻る事が出来ます。

Activityを終了させるのはとても簡単で、下記の様に一行書くだけで済んでしまいます。


// Activityを終了させる事により、一つ前のActivityへ戻る事が出来る。
finish();


これを、戻るボタン等のタップを契機に発動させれば
戻るボタンで元のActivityへ戻る処理の出来あがりです。


//--------------------------------------------------------------------------
// ボタンが押された時の処理
//--------------------------------------------------------------------------
public void onClick( View v_ )
{
 // アクティビティを終了させる事により、一つ前のアクティビティへ戻る事が出来る。
 finish();
}





とても簡単ですね。

画面遷移はアプリを作る上で必ず使うといっても過言でない処理です。
是非、何も考えなくても感覚的に扱えるようになっておきたいですね。

以上で簡単にですがAndroid開発におけるintentを使った画面遷移の方法についての解説を終わりにします。
ありがとうございました。




JUnitについての書籍が遂に発売します!
Java開発時のユニットテストを加速する「JUnit速効レシピ」

コメントをお待ちしています

人気の投稿

Category

Algorithm (2) Android (8) ASP/aspx (1) Blogger (2) C/C++ (1) Chrome (5) CSS (9) Firefox (4) Fortran (1) Google (9) GoogleMap (2) HTML (12) IE (3) Information (4) iOS (2) iPhone/iPad/iPod (2) Java (6) JavaScript (16) jQuery (9) JSP (1) LifeRecipe (5) Linux (2) Macintosh (2) MapKit (4) Marketing (7) MySQL (3) NAMAZU (2) Objective-C (7) Other (7) Perl (1) PHP (9) Python (1) RSS/Atom (2) Ruby (1) Safari (2) SEO (11) Smarty (2) SQL (2) Tex (1) Three.js (1) Twitter (1) TwitterLog (313) UIKit (5) Unix (1) VBA/VBS (1) Windows (5) WordPress (3) Writing (5) XAMPP (1) XML (1) Yahoo (2) ZendFramework2 (14)

Archives