明示的Intentの仕組み | Intent Android

スポンサーリンク

明示的Intent

行先が明示的に示されているIntentを明示的Intentと呼びます。以下のようなものです。

Intent intent = new Intent(getApplicationContext(),ToActivity.class);
startActivity(intent);

行先がToActivity.classと決められています。

対して暗黙的Intentというものがあり、これは行先を指定せずに、「マップを表示する」機能のあるのあるアプリを使いたい。といったような場合に指定します。詳しい説明は別途。

明示的Intentを使う

IntentによってActivity間の移動ができるようになるわけですが、仕組みを理解していないとどんどんactivityが山積みになってしまいます。

MainActivityからToActivityに移動する場合はIntentを使います。

ではToActivityからMainActivityに戻るにはどうすればよいでしょうか

Intent。。ではありません。finishです。

Intentを使った場合は上図の右のように新たにMainActivityが上乗せされます。

この方法を使うと、端末の戻るボタンを押しても、ユーザーが企図した動きにはなりません。

具体的にコードを見てみましょう

public class MainActivity extends AppCompatActivity{
    private ImageButton toActivityButton;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("Log0","MainActivity onCreate");

        toActivityButton =(ImageButton) findViewById(R.id.toActivityButton);
    }
    @Override
    protected void onResume(){
        super.onResume();
        Log.d("Log0","MainActivity onResume");
        toActivityButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getApplicationContext(),ToActivity.class);
                startActivity(intent);
            }
        });

    }
    @Override
    protected void onPause(){
        super.onPause();
        Log.d("Log0","MainActivity onPause");
    }
}

Intent先

public class ToActivity extends AppCompatActivity {
    private ImageButton toMainButton;
    private ImageButton finishButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_to);
        Log.d("Log0","ToActivity onCreate");

        toMainButton =(ImageButton) findViewById(R.id.toMainButton);
        finishButton =(ImageButton) findViewById(R.id.finishButton);
    }
    @Override
    protected void onResume(){
        super.onResume();
        Log.d("Log0","ToActivity onResume");

        toMainButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getApplicationContext(),MainActivity.class);
                startActivity(intent);
            }
        });
        finishButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });

    }
    @Override
    protected void onPause(){
        super.onPause();
        Log.d("Log0","ToActivity onPause");
    }
}

Intent先であるToActivityにおいてtoMainButtonをタップすると、MainActivityに移動します。戻っているわけではありません。MainActivityに移動した状態で端末のBackキーを押してみてください。本来予定した動きであればアプリが終了しますが、終了せずにToActivityが表示されます。

toMainButonとtoActivityButtonを交互に押している状態は上の図でいう緑とオレンジがどんどん積み重なっていくイメージです。これが、Intentが山積みになっている状態です。

戻る(Backキーと同じ処理をさせたい)にはfinishButtonをタップして、finish処理をさせる必要があります。これが戻る処理です。

実際に実行して、Log0を追ってみましょう。ライフサイクルも理解できるはずです。

Logcatの見方

AndroidStudioでLog0タグのついたLog.dのみを見るにはAndroidStudio下部のLogcatをONにして、

とします。
他に面白い?方法として

Log.d("FATAL","ToActivity onPause");

といったように、タグをFATALとしておくとエラーログと、このLog.dのみが表示されるので色々と楽になります。さらに人様に見せられるコードではなくなりますが・・