Android アプリケーションは一つ以上の Activity、Service を含みます。インテントは Activity、Service 間でやり取りされるメッセージオブジェクトです。例えば、ある Activity から別の Activity や Service を起動するための情報をインテントに含めて Android システムに渡します。Android システムはインテントの内容から適切な Activity や Service を起動して、インテントを渡します。インテントには Explicit intents と Implicit intents の二種類があります。基本的なサンプルコードをまとめます。
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();
}
}
);
}
}
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();
}
}
);
}
}
参考ドキュメント
Explicit intents と同様に startActivity()
または startActivityForResult()
にインテントを渡すことで、別の Activity を起動できます。ただし、インテントにはクラス名を設定しません。以下のサンプルはすべて startActivity()
です。