Android勉強会 vol.1 画面遷移と通知を用いたアプリ制作

この記事では Android Studio 2.1.2 を使用しています。
大学の研究室で開催している勉強会の資料共有とアーカイブのためにQiitaに投稿しています。
まずはプロジェクトを作成する

今回はminSDKをAndroid4.1以上に設定して開発を進めます。
初期に生成されるActivityはEmptyActivityを使用します。

# 画面遷移
まずは遷移する先の画面を新しく作ります。
appを右クリックしNew→Activity→Empty Activityをクリックします。
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/113969/06c8590e-78d1-3ba6-97c1-bcfc7187cbbd.png)
名前はSubActivityとしFinishをクリックします。
![図2.png](https://qiita-image-store.s3.amazonaws.com/0/113969/c60cb25b-8223-c8f1-a2ba-95e9131c61bd.png)
新しい画面とわかるようにactivity_sub.xmlを開いて”SubActivity”というPlain TextViewを配置します。
![図3.png](https://qiita-image-store.s3.amazonaws.com/0/113969/12d7968f-468e-6ac3-62f4-2dd2519dcff8.png)
MainActivity.javaにSubActivityへ遷移するためのコードを追記します。

```java:MainActivity.java
public void startSubActivity(View view){
    Intent intent = new Intent(getApplication(), SubActivity.class);
    startActivity(intent);
}
```

このように

```java
public void hoge(View view){
    ...
}
```

という形で書くとlayoutファイルのエディター上でボタンのonClickのドロップダウンから選択するだけで簡単にクリック時に実行する関数として登録できる。
実際にactivity_main.xmlを開きボタンを選択しonClickにstartSubActivityを登録しましょう
![図4.png](https://qiita-image-store.s3.amazonaws.com/0/113969/cbff2baf-a745-957d-8052-6e755148ab3d.png)
実際に実行して動きを確認してみましょう。
# 入力してみる
activity_sub.xmlを開きText FieldsのPlain Textを配置しましょう。TextViewではありません。
![図5.png](https://qiita-image-store.s3.amazonaws.com/0/113969/7951af30-6935-c2e4-551d-cdb1598fb9c0.png)
さきほどのテキスト入力欄をダブルクリックしidをeditTextにします。textは初期値となるテキストですが今回は空にして置きます。

次に入力内容を取得するプログラムを実行するためにボタンを配置します。idは使用しないためそのままで問題ありません。

取得するためにSubActivity.javaにコードを追記します。

```java:SubActivity.java
public void getInput(View view){
    EditText editText = (EditText)findViewById(R.id.editText);
    String input = null;
    if (editText != null) {
        input = editText.getText().toString();
    }
    Toast.makeText(this, input, Toast.LENGTH_SHORT).show();
}
```

ここでeditTextは入力欄そのものを示します。getText()で入力内容を保持しているバッファを取得しtoString()でその時のバッファ内の文字列を取得します。
Toastは画面上にオーバーレイされる単純な通知です。
activity_sub.xmlを開きボタンのonClickに先ほどのgetInputを登録します。実行して動作を確認してみてください。

# データを伴う画面遷移
画面遷移を行うときにデータを渡すことも可能です。
SubActivityからMainActivityへ入力されたデータを渡してみます。

activiy_main.xmlに表示するためのTextViewを追加します。
textはどのみち書き変えるのでご自由に設定してください。
idはこのTextViewを書き変えるために区別するために必要となります。今回はtext_displayとしました。
MainActivity.javaを書き変えます。

```java:MainActivity.java
public class MainActivity extends AppCompatActivity {

    private static final int REQUEST_CODE = 1234;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
    }

    public void startSubActivity(View view) {
        Intent intent = new Intent(getApplication(), SubActivity.class);
        startActivityForResult(intent, REQUEST_CODE); // startActivityからstartActivityForResultへ変更
    }
}
```

REQUEST_CODEはデータを渡す際に区別するためのIDです。

次にSubActivity.javaからデータを渡すようにします。

```java:SubActivity.java
public void getInput(View view) {
    EditText editText = (EditText) findViewById(R.id.editText);
    String input = null;
    if (editText != null) {
        input = editText.getText().toString();
    }
    Intent intent = new Intent();
    intent.putExtra("Text", input);
    setResult(RESULT_OK, intent);
    finish();
}
```

戻る際にもIntentを用います。
putExtraを用いて渡すデータをIntentに登録しsetResultでそのIntentを利用することを登録します。実際に遷移を実行しているのはfinish()です。

MainActivity.javaにデータを受け取り、表示するコードを追記します。

```java:MainActivity.java
...

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE && resultCode == RESULT_OK && data != null) {
        TextView textView = (TextView) findViewById(R.id.text_display);
        String input = data.getStringExtra("Text");
        if (textView != null) {
            textView.append("\n");
            textView.append(input);
        }
    }
}
```

取得する方法はIntent型の第3引数に対してgetStringExtra("Hoge")と呼び出すだけで取得できます。String型以外の場合は初期値を第2引数に渡す必要があります。(例)`data.getIntExtra("Hoge", 0)`

# 通知機能を使う
通知にはいくつか種類がありますが今回は最もシンプルな通知を使用してみます。
MainActivity.javaのデータを受け取り表示する部分に通知を生成するコードを追記します。

```java:MainActivity.java
public class MainActivity extends AppCompatActivity {
    private static final int REQUEST_CODE = 1234;
    private static final int NOTIFICATION_ID = 5678; // 通知の認識用ID

    ...

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        ...
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
        builder.setSmallIcon(R.mipmap.ic_launcher);
        builder.setContentTitle(input);
        builder.setContentText("Content text");
        NotificationManager manager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        manager.notify(NOTIFICATION_ID, builder.build());
    }
}
```

実行して確認してみましょう。