Android アプリケーションは一つ以上の Activity、Service を含みます。インテントは Activity、Service 間でやり取りされるメッセージオブジェクトです。例えば、ある Activity から別の Activity や Service を起動するための情報をインテントに含めて Android システムに渡します。Android システムはインテントの内容から適切な Activity や Service を起動して、インテントを渡します。インテントには Explicit intents と Implicit intents の二種類があります。基本的なサンプルコードをまとめます。
Explicit intents
startActivity
startActivity()
にインテントを渡すことで、別の Activity を起動できます。インテントに Explicit にクラス名を格納することで、起動する Activity を指定できます。関連するチュートリアルはこちらです。
MainActivity.java
package com.example.mycompany.myapp;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button)findViewById(R.id.myButton);
button.setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, SubActivity.class);
startActivity(intent);
}
}
);
}
}
savedInstanceState
は Activity ライフサイクルにおいてリソース不足のため App process killed された後 onCreate()
された場合に、以前の状態を復旧するための情報が格納されています。通常は null が格納されており、今回のサンプルコードでは使用していません。
finish()
を実行することで、Activity を終了できます。
SubActivity.java
package com.example.mycompany.myapp;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class SubActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sub);
Button button = (Button)findViewById(R.id.myButton);
button.setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
}
);
}
}
Android Studio が自動で追記していなければ AndroidManifest.xml
も編集する必要があります。activity タグは Activity 毎に必要です。activity タグ内に記述された intent-filter は、Android システムがインテント内容から起動すべき Activity を選定する際に利用されます。Android アプリケーション内の Activity の一つは、エントリーポイントとしてのインテントフィルタが記述されている必要があります。
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.mycompany.myapp"> ←`.SubActivity` や `.MainActivity` を展開する情報
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter> ←エントリーポイントとしてインテントフィルタを記述
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SubActivity"></activity> ←Activity 毎に必要
</application>
</manifest>
インテントを介してデータを渡す
別の Activity を起動する際に、何らかのデータをインテントに含めて渡すことができます。以下は MainActivity から SubActivity に文字列 "Sample Message" を渡す例です。SubActivity は getStringExtra
でデータをインテントから取り出します。他にも Int 型として取り出す getIntExtra
やシリアライズされたオブジェクトとして取得する getSerializableExtra
があります。リファレンスはこちらです。
EXTRA_MESSAGE
のように、パッケージ名を含めたキーを定義することがよいプラクティスであるとされています。
It's a good practice to define keys for intent extras using your app's package name as a prefix. This ensures the keys are unique, in case your app interacts with other apps.
https://developer.android.com/training/basics/firstapp/starting-activity.html
MainActivity.java
package com.example.mycompany.myapp;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
public static final String EXTRA_MESSAGE = "com.example.mycompany.myapp.MESSAGE"; // キー名を定義しておくとよいです。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button)findViewById(R.id.myButton);
button.setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, SubActivity.class);
intent.putExtra(EXTRA_MESSAGE, "Sample Message"); // インテントにデータを格納
startActivity(intent);
}
}
);
}
}
SubActivity.java
package com.example.mycompany.myapp;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class SubActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sub);
Button button = (Button)findViewById(R.id.myButton);
button.setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = getIntent(); // 渡されたインテントから、キー名をもとに文字列を取得
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
Toast.makeText(SubActivity.this, message, Toast.LENGTH_LONG).show();
finish();
}
}
);
}
}
startActivityForResult
startActivity()
ではなく startActivityForResult()
を利用して Activity を起動することで、起動した Activity から起動もとの Activity に何らかの結果を返すことができます。公式チュートリアルはこちらです。
MainActivity.java
package com.example.mycompany.myapp;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private static final int MY_SAMPLE_REQUEST = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button)findViewById(R.id.myButton);
button.setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, SubActivity.class);
startActivityForResult(intent, MY_SAMPLE_REQUEST);
}
}
);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == MY_SAMPLE_REQUEST) {
if(resultCode == RESULT_OK) {
Toast.makeText(this, data.getStringExtra(SubActivity.EXTRA_MESSAGE), Toast.LENGTH_LONG).show();
}
}
}
}
こちらのページに記載のとおり、結果はインテントに putExtra()
で格納します。インテントは setResult()
で返します。
SubActivity.java
package com.example.mycompany.myapp;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class SubActivity extends AppCompatActivity {
public static final String EXTRA_MESSAGE = "com.example.mycompany.myapp.MESSAGE";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sub);
Button button = (Button)findViewById(R.id.myButton);
button.setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra(EXTRA_MESSAGE, "Sample Result from SubActivity");
setResult(Activity.RESULT_OK, intent);
finish();
}
}
);
}
}
Implicit intents
参考ドキュメント
startActivity / startActivityForResult
Explicit intents と同様に startActivity()
または startActivityForResult()
にインテントを渡すことで、別の Activity を起動できます。ただし、インテントにはクラス名を設定しません。以下のサンプルはすべて startActivity()
です。
電話をかける
package com.example.mycompany.myapp;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button)findViewById(R.id.myButton);
button.setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View v) {
Uri number = Uri.parse("tel:5551234");
Intent intent = new Intent(Intent.ACTION_DIAL, number); // クラス名は明記しません。
// 起動可能な Activity が少なくとも一つは存在することを確認してから起動します。
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
}
);
}
}
地図を開く
Uri location = Uri.parse("geo:35.7050392,139.7508728?z=17");
Intent intent = new Intent(Intent.ACTION_VIEW, location);
Web ページを開く
Uri webPage = Uri.parse("http://www.android.com");
Intent intent = new Intent(Intent.ACTION_VIEW, webPage);
他の Activity から Implicit に起動できる Activity を作る
「電話をかける」の MainActivity.java
サンプルコードから Implicit に実行可能な SubActivity は以下のように記述できます。トーストを表示して終了するだけの Activity です。AndroidManifest.xml
には、適切な条件を intent-filter
タグで設定します。
SubActivity.java
package com.example.mycompany.myapp;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;
public class SubActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sub);
Intent intent = getIntent();
Uri data = intent.getData();
Toast.makeText(this, data.toString(), Toast.LENGTH_LONG).show();
finish();
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.mycompany.myapp">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SubActivity">
<intent-filter> ←インテントフィルター
<action android:name="android.intent.action.DIAL"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="tel"/> ←Uri で 'tel:' を指定した場合に限定
</intent-filter>
</activity>
</application>
</manifest>
記事の執筆者にステッカーを贈る
有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。
さらに詳しく →Feedbacks
ログインするとコメントを投稿できます。
関連記事
- Spring Security フォームログインのサンプルコードSpring フレームワークによる Web アプリケーション開発で、ログイン処理を実装する際は Spring Security が便利です。ここでは特に Spring Boot で Web アプリケーションを開発する場合を対象とし、フォームによる ID/Password ログインを行うためのサンプルコードをまとめます。 公式ドキュメント [Spring Security チュートリアル](http...
- Java配列の宣言方法 (C/C++との違い)Javaの配列 Javaの配列宣言方法はC/C++と似ているようで若干異なる。 初期化しない場合 C/C++の int array[10]; はJavaでは int array[] = new int[10]; となる。同様にC/C++の int array[3][3]; はJavaでは int array[][] = new int[3][3]; となる。 初期化
- PlantUML による UML 図の描き方PlantUML はテキスト形式で表現されたシーケンス図やクラス図といった UML (Unified Modeling Language) 図の情報から画像を生成するためのツールです。簡単な使い方をまとめます。 インストール方法の選択 Atom や Eclipse のプラグインをインストールしてエディタから利用する方法、JAR をダウンロードして Java コマンドで実行する方法、Redmine ...
- Akka HTTP サンプルコード (Scala)Akka アクターを用いて実装された汎用 HTTP フレームワークです。Spray の後継です。コアモジュールである akka-http-core は 2016/2/17 に experimental が外れました。akka-http などのいくつかのサブモジュールは 2016/3/1 現在 experimental のままですが、基本的な
- Kestrel の使用例Kestrel は Message Queue (MQ) の実装のひとつです。一般に MQ はアプリケーション間やプロセス間、スレッド間で非同期に通信するために用いられます。メッセージの送信側は MQ に書き込めば受信側の応答を待たずに次の処理に非同期に進むことができます。Kestrel はわずか 2500 行程の Scala で実装されており JVM で動作します。MQ 自体はメモリ上に存在する...