モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

目次目次を開く/閉じる

Android インテントの基本

モーダルを閉じる

ステッカーを選択してください

お支払い手続きへ
モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

作成日作成日
2017/05/03
最終更新最終更新
2021/10/07
記事区分記事区分
一般公開

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>
Likeボタン(off)0
詳細設定を開く/閉じる
アカウント プロフィール画像

Android Developer

記事の執筆者にステッカーを贈る

有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

>>さらに詳しくステッカーを贈る
ステッカーを贈る コンセプト画像

Feedbacks

Feedbacks コンセプト画像

    ログインするとコメントを投稿できます。

    ログインする

    関連記事

    • Spring Security フォームログインのサンプルコード
      Spring フレームワークによる Web アプリケーション開発で、ログイン処理を実装する際は Spring Security が便利です。ここでは特に Spring Boot で Web アプリケーションを開発する場合を対象とし、フォームによる ID/Password ログインを行うためのサンプルコードをまとめます。 公式ドキュメント [Spring Security チュートリアル](http...
      えびちゃんえびちゃん12/4/2019に更新
      いいねアイコン画像0
    • 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]; となる。 初期化
      てんとうむしてんとうむし5/13/2018に更新
      いいねアイコン画像0
    • PlantUML による UML 図の描き方
      サムネイル画像-c788fffde5
      PlantUML はテキスト形式で表現されたシーケンス図やクラス図といった UML (Unified Modeling Language) 図の情報から画像を生成するためのツールです。簡単な使い方をまとめます。 インストール方法の選択 Atom や Eclipse のプラグインをインストールしてエディタから利用する方法、JAR をダウンロードして Java コマンドで実行する方法、Redmine ...
      kentakenta1/21/2020に更新
      いいねアイコン画像0
    • Akka HTTP サンプルコード (Scala)
      サムネイル画像-a98142497c
      Akka アクターを用いて実装された汎用 HTTP フレームワークです。Spray の後継です。コアモジュールである akka-http-core は 2016/2/17 に experimental が外れました。akka-http などのいくつかのサブモジュールは 2016/3/1 現在 experimental のままですが、基本的な
      雄太雄太10/7/2021に更新
      いいねアイコン画像0
    • Kestrel の使用例
      Kestrel は Message Queue (MQ) の実装のひとつです。一般に MQ はアプリケーション間やプロセス間、スレッド間で非同期に通信するために用いられます。メッセージの送信側は MQ に書き込めば受信側の応答を待たずに次の処理に非同期に進むことができます。Kestrel はわずか 2500 行程の Scala で実装されており JVM で動作します。MQ 自体はメモリ上に存在する...
      したくんしたくん10/12/2017に更新
      いいねアイコン画像0