暗黙的インテントを使用したときに選択されたアプリを知る
暗黙的インテントを使用したときにユーザがどのアプリを選択するか知るにはどうすればいいのか調査しました。 結論からいうと、Android 5.1以上から追加された次のAPIを利用することで、どのアプリを選択したかBroadcastReceiverで受け取ることができます。
public static Intent createChooser (Intent target,
CharSequence title,
IntentSender sender)
第三引数のIntentSender
はどうやって作るのかですが、PendingIntent
にgetIntentSender()
というメソッドが用意されており、PendingIntent
から取得するようです。
全体の流れは次になります。
- 選択された結果を受け取るためのBroadcastReceiverを用意する
- 受信先に1を指定した
PendingIntent
を用意する - 発行したい暗黙的Intentを用意する
- 3の
createChooser
から取得したIntentをstartActivity
に渡す
選択された結果を受け取るためのBroadcastReceiverを用意する
選択された結果を受け取るためのBroadcastReceiverを用意します。
class ChooseReceiver : BroadcastReceiver() { override fun onReceive( context: Context, intent: Intent ) { val componentName = intent.extras.get(EXTRA_CHOSEN_COMPONENT) as ComponentName } }
manifestに追加することを忘れないようにします。
<receiver android:name="ChooseReceiver" android:exported="false"/>
受信先にさきほど作成したReceiverを指定したPendingIntent
を用意する
val receiver = Intent(context, ChooseReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(context, 0, receiver, PendingIntent.FLAG_UPDATE_CURRENT)
発行したい暗黙的Intentを用意する
お好きな暗黙的Intentをご用意ください。
val share = Intent() share.action = Intent.ACTION_SEND share.type = "text/plain" share.putExtra( Intent.EXTRA_TEXT, "テキスト" )
createChooser
から取得したIntentをstartActivity
に渡す
startActivity(Intent.createChooser(share
, "タイトル"
, pendingIntent.intentSender
))
以上です。