Android インテントの基本
[最終更新] (2019/06/03 00:34:55)

概要

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);
                    }
                }
        );
    }
}

savedInstanceStateActivity ライフサイクルにおいてリソース不足のため 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() です。

電話をかける

この続きが気になる方は

Android インテントの基本

残り文字数は全体の約 25 %
tybot
100 円
関連ページ
    概要 電子工作や製品のプロトタイピング (例『地球規模で遠隔操作できるブルドーザー』) で利用される Raspberry Pi 3 について、こちらのページで構築した環境で Android Things アプリケーションを開発できます。 本ページでは、簡単な例として LED を点灯させるアプリケーションを扱います。より実用的なアプリケーションを開発する際には
    概要 こちらのページに記載のとおり、Android アプリケーションは一つ以上の Activity、Service を含みます。Service は UI をもたず、長時間かかる処理をバックグラウンドで行うためのコンポーネントです。こちらのページの情報をもとに構築した開発環境を想定し、基本的な使い方をまとめます。 関連する公式ドキュメント