アプリケーション間の連携
参考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