Android入門(3)~アクティビティの開始とインテントの基本~

今回は、新しくアクティビティを開始する方法、そしてインテントの基本について勉強します。

Android Developers アクティビティ
Android Developers インテントとインテントフィルタ
Android Developers Intentクラスのリファレンス

新しくアクティビティを開始する

新しくアクティビティを開始するというのはつまり、例えば現在操作中の画面から別の画面を表示するようなことです。そのためには、ActivityクラスのstartActivity()メソッドを呼ぶ必要があります。

startActivity()メソッドは引数にandroid.content.Intent.Intentクラス(インテント)を渡す必要があります。インテントは開始するアクティビティを正確に指定するか、実行する操作のタイプを記述します。

アクティビティを指定したインテント

例えばボタンを押すと今のアクティビティから別のアクティビティを開始する場合、このようにコードを書きます。

「android:onClick」の属性値はイベントに対応するメソッド名を書きます。レイアウトを適用するActivityクラスにそのメソッドを実装する必要があります。

これを明示的インテントといいます。

他のアプリケーションのアクティビティを開く

インテントを使うと、自分のアプリケーションが持っていない他のアプリケーションのアクティビティを開始することもできます。例えばAndroidでメーラーを起動させる場合はこうします。

Android Studioで「Blank Activity」からプロジェクトを作成し、ボタンを1個追加した状態です。ボタンのonClick時のメソッド内に記述しています。

setAction()メソッドはインテントに一般的なアクションの設定をします。一般的なアクションとは、データを表示する、電話を掛ける、メールを送信する、Web検索する、といった具合です。setAction()メソッドを使用すると、その一般的な動作(アクション)を行うアプリケーションのアクティビティを端末から探します(厳密にはサービスとブロードキャストのコンポーネントにもインテントが使えます)。

マニュアルによると、Intent.ACTION_SENDTOは、データで指定された誰かにメッセージ送信を行うアクションを表すということです。マニュアルには「Input:」として、ターゲットを記述したURIとあります。上記サンプルコードの2行目に「Uri.parse(“mailto:宛先メールアドレス”)」とありますが、これが「ターゲット(宛先のメールアドレス)を記述したURI」です。つまり、アクションによってはアクションに必要なデータをセットしておく必要があるということです。

また、インテントには必要なデータだけでなく、アプリに渡したいデータを追加設定することができます。それが上記3行目以降のputExtra()メソッドです。

putExtra()メソッドの第1引数は追加データの種類を識別するためのキーです。「Intent.EXTRA_SUBJECT」はメールの件名、「Intent.EXTRA_TEXT」は送信するメッセージ本文となります。これで上記のコードはだいたい説明しました。

では上記のサンプルを実行してみます。今回はエミュレーターだと説明しづらいので実機でテスト実行しています。Xperia Z1です。

Screenshot_2016-02-19-18-23-21

送信ボタンを押すと、メールを送信するアプリケーションの候補が出てきます。

Screenshot_2016-02-19-18-43-34

ここでGmailを開くと、下のように端末にインストールされているGmailアプリのメール作成画面が表示されます。このとき、タイトルと本文に(モザイクかけていて分かりづらいですが「To:」にも)データが挿入されています。この画面からメールを送信すると、元のアクティビティ(送信ボタンだけの画面)に戻ります。

Screenshot_2016-02-19-18-23-28

このように明示的に使用するアクティビティを指定しないインテントを暗黙的インテントといいます。

暗黙的インテントは適切なメールアプリを選択するように動作しましたが、以下のようにするとアプリの選択はできずGmailアプリがすぐに起動します。

「intent.setPackage(“com.google.android.gm”);」の部分がポイントです。setPackage()メソッドは指定したパッケージ内から適切なコンポーネント(ここではアクティビティ)を選びます。暗黙的インテントの限定的な使い方、といったところでしょうか。当然、Gmailアプリがなければ動きません。こういった使い方はほぼやりません(というよりよほどの理由がない限りやっちゃいけない気がします)が、一応ご紹介。

一般的なアクション

マニュアルに書いてあったアクティビティに関する一般的なアクションは以下のとおり。

ACTION_MAIN
ACTION_VIEW
ACTION_ATTACH_DATA
ACTION_EDIT
ACTION_PICK
ACTION_CHOOSER
ACTION_GET_CONTENT
ACTION_DIAL
ACTION_CALL
ACTION_SEND
ACTION_SENDTO
ACTION_ANSWER
ACTION_INSERT
ACTION_DELETE
ACTION_RUN
ACTION_SYNC
ACTION_PICK_ACTIVITY
ACTION_SEARCH
ACTION_WEB_SEARCH
ACTION_FACTORY_TEST

アクションはいろいろ試していきたいですね。インテントの基本的なところは以上です。

以下、追記です。

開始したアクティビティから結果を受け取る

他のアプリケーションの結果を受け取りたい場合は、startActivityメソッドの代わりに、startActivityForResult(Intent intent, int requestCode)メソッドを使用します。

「Intent.ACTION_PICK」のアクションを使ってフォトアルバムなどから画像を選択させて、そのBitmapを表示するサンプルです。まず、ストレージにある画像にアクセスする必要があるため、マニフェストファイルでパーミッションを与えます。

次に、画像を表示するためのVIEWを用意します。画像を表示するためにはImageViewを用います。これをレイアウトファイルに追加します。

Activityクラスの、ボタンのクリックイベントの中に次のコードを書きます。

startActivityForResultの第2引数は任意の整数です。アクティビティから結果を受け取るときの照合に使います。「Intent.ACTION_PICK」はデータのフォルダの中から選ばせる、というアクションです。setType()メソッドは、MIMEコンテントタイプを指定します。今回は画像を選ばせるので、「image/*」としています。

次は、結果を受け取るコードです。そのために、ActivityクラスのonActivityResult()メソッドをオーバーライドする必要があります。

onActivityResult()の引数ですが、アクティビティの結果が成功した場合は 第2引数のresultCodeが「RESULT_OK」になります。第1引数のrequestCodeは、startActivityForResult()メソッドの第2引数に渡した整数値です。これを照合しています。第3引数のIntentが、結果のオブジェクトです。

data.getData()メソッドは、インテントのデータURIを取得します。画像が正常に選択されていれば、「content://~」というようなパスが帰ってきます。

getContentResolver.query()メソッドはコンテンツプロバイダにクエリを実行して、照会することのできたデータを戻り値であるCursorクラスで参照することができます。

ちなみに、このコードを動かすにはAndroid NDKが必要です。SDK Managerからインストールしておく必要があります。

それでは実行結果です。ボタンを押すと、画像アプリを選択できるようになりますので、選んだアプリから画像を選択すると、元のアクティビティにフォーカスが戻ります。

Screenshot_2016-02-20-11-44-01

そして、選んだ画像が表示されています。

Screenshot_2016-02-20-11-49-09

これでアクティビティの開始についても基本的な部分は勉強しました。

広告
  • LINEで送る