アプリケーション間の連携
参考1: 他のアプリからのアクティビティの開始を許可する
参考2: 研修3日目
参考3: 研修6日目
参考4: 研修11日目
アプリケーション内部でのアクティビティやフラグメント、サービス間の連携(=画面遷移)はインテントを利用するが、アプリケーション間の連携においてもインテントを利用する。
インテント
アクティビティ・フラグメント・サービス間の橋渡し役を担うクラス。
遷移元と遷移先の情報をもつ。
Intentオブジェクトは、アクティビティ・フラグメント・サービスの起動を行う。
ただし、アプリケーション内部の場合とアプリケーション間の場合ではインテントの宣言方法が変わる。
| 条件 | インテント |
|---|---|
アプリケーション内部 |
明示的インテント |
アプリケーション間 |
暗黙的インテント |
明示的インテント
アプリケーション内部で、起動するアクティビティ等のクラス名を明示的に宣言するインテント。
暗黙的インテント
アプリケーション内部から見て、起動するアクティビティ等のクラス名が不明である場合に、URIを指定することでOSに起動先を委ねるインテント。
なお、アクティビティの起動に関しては、指定されたURIで一つのアプリケーションに絞れない場合は、OSがアプリチューザを表示することで起動するアプリケーションをユーザに指定させる。
URI
参考: URI
Web上での住所を表すURLとWeb上での固有IDを表すURNの総称。
Uriクラスで定義される。
アプリチューザ
OSが指定されたURIで起動するアプリケーションを1つに限定できない場合に、ユーザに対して起動先アプリケーションの選択を迫るために表示されるチューザダイアログ。
定義
// 明示的インテント
Intent(packageContext: Context!, cls: Class<*>!)
// パラメータ
// packageContext: 起動元コンテキスト
// cls: Javaクラス化した起動先コンテキスト
// -> KotlinのクラスをJavaに変換する場合は、"<Kotlinクラス名>::class.java"と記述
// 暗黙的インテント
Intent(action: String!, uri: Uri!)
// パラメータ
// action: インテントが実行するアクションを表すIntentクラス定数
// uri: 起動先コンテキストのURI
アクションを表すIntentクラス定数
| 定数名 | 内容 |
|---|---|
ACTION_VIEW |
画面の表示 |
ACTION_CALL |
電話の発信 |
ACTION_SEND |
メールの送信 |
Uriオブジェクトの生成
半角英数字や一部の半角記号(=ハイフン-・ピリオド.・アンダースコア_・チルド~など)以外のString型の文字列をUri型に変換する場合は、事前にURLエンコーディングを行う必要がある。
URLエンコーディング
URLとして使用できない文字を16進数のコードに変換(=エンコード)して使えるようにすること。
URLエンコーディングを行う場合、URLEncoderクラスのencode()メソッドを利用する。
定義
// 文字エンコードを指定したURLエンコーディング
URLEncoder.encode(s: String, enc: String): String
// s: String型文字列
// enc: 文字エンコード
String型 → Uri型への変換
参考: 研修10日目
String型をUri型に変換(=パース; 解析)する場合、Uriクラスのparse()メソッドを利用する。
// エンコード済みのString型URIをUri型に変換
Uri.parse(uriString: String!): Uri!
// パラメータ
// uriString: Uri型に変換するString型URI
サンプルコード
// EditTextに入力されたString型文字列
var searchWord = etSearchWord.text.toString()
// 文字エンコードを指定したURLエンコーディング
searchWord = URLEncoder.encode(searchWord, "UTF-8")
// 指定した文字列で検索した地図アプリのString型URI
// -> "geo:<緯度>,<経度>?q=<検索文字列>" で表現
val uriStr = "geo:0,0?q=${searchWord}"
// String型 → Uri型 への変換
val uri = Uri.parse(uriStr)
// 暗黙的インテント(=Intentオブジェクト)の生成
val intent = Intent(Intent.ACTION_VIEW, uri)
// アクティビティの起動
startActivity(intent)
// <- Context.startActivity(intent: Intent!): Unit

