ソースコードがみられればいいんだよという人向け。
暗黙的インテント、明示的インテントで他のアクティビティに遷移する方法と、明示的インテント、暗黙的インテントでブロードキャストを送信し受信する方法。そしてそれぞれ呼び出し元のアクティビティに返値を戻す方法について簡単に。
インテントにはclassそのものを指定する明示的インテントと、アクションやカテゴリなどを指定して類推的に指摘する暗黙的インタンとがある。さらに新しいアクティビティを開く、サービスを実行する、ブロードキャストを送信するには、それぞれ明示的インテントと暗黙的インテントがある。
しかしそれぞれには暗黙的インテントが事実上禁止されていることがあるため注意が必要。
■新しいアクティビティを開く
・明示的インテント ok
・暗黙的インテント ok
■サービスを実行する
・明示的インテント ok
・暗黙的インテント NG
■ブロードキャストの送信(受信)
・明示的インテント ok
・暗黙的インテント NG(oreo以降)
ただしブロードキャストの送信については例外があり、後述するregistReceiverメソッドを利用してレシーバーを登録するやり方を利用すれば暗黙的インテントの利用も可能となっている。
actionはVIEW、categoryはDEFAULTが基本。あとはscemeなどによって区別されるが、このあたりは後ほど。
画面遷移したアクティビティでは以下のようにして元のアクティビティに戻る。返値が必要な場合は返値を設定して戻る。
ブロードキャストを受信するクラス。Android Studioからレシーバークラスを生成すればマニフェストなど触らなくてもクラスを作ってくれるので楽。
暗黙的インテント、明示的インテントで他のアクティビティに遷移する方法と、明示的インテント、暗黙的インテントでブロードキャストを送信し受信する方法。そしてそれぞれ呼び出し元のアクティビティに返値を戻す方法について簡単に。
インテントにはclassそのものを指定する明示的インテントと、アクションやカテゴリなどを指定して類推的に指摘する暗黙的インタンとがある。さらに新しいアクティビティを開く、サービスを実行する、ブロードキャストを送信するには、それぞれ明示的インテントと暗黙的インテントがある。
しかしそれぞれには暗黙的インテントが事実上禁止されていることがあるため注意が必要。
■新しいアクティビティを開く
・明示的インテント ok
・暗黙的インテント ok
■サービスを実行する
・明示的インテント ok
・暗黙的インテント NG
■ブロードキャストの送信(受信)
・明示的インテント ok
・暗黙的インテント NG(oreo以降)
ただしブロードキャストの送信については例外があり、後述するregistReceiverメソッドを利用してレシーバーを登録するやり方を利用すれば暗黙的インテントの利用も可能となっている。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//暗黙的インテントを受信するためにBroadcastReceiverクラスを継承したクラスを指定する
//第二引数は受信するブロードキャストを区別する任意の文字列
registerReceiver(MyReceiver2(), IntentFilter("NULLPO"))
val btnIntentNoResult: Button = findViewById(R.id.btnIntentNoResult)
val btnIntent: Button = findViewById(R.id.btnIntent)
val bthImplicityIntent: Button = findViewById(R.id.bthImplicityIntent)
val btnSendBroadcast: Button = findViewById(R.id.btnSendBroadcast)
btnIntentNoResult.setOnClickListener {
//明示的インテントを利用して他のアクティビティに遷移する 戻り値なし
val intent: Intent = Intent(this, SubActivity::class.java)
startActivity(intent)
}
btnIntent.setOnClickListener {
//明示的インテントを利用して他のアクティビティの遷移する 戻り値あり
val intent: Intent = Intent(this, SubActivity::class.java)
//第二引数のintは、どのアクティビティから呼び出したのか区別する任意の数値
startActivityForResult(intent, 0)
}
bthImplicityIntent.setOnClickListener {
//暗黙的インテントを利用して他のアクティビティに遷移する
//アクションとUriは後でマニフェストで設定した内容を指定しておく
val intent: Intent = Intent("android.intent.action.VIEW", Uri.parse("nullpo://"))
startActivity(intent)
}
btnSendBroadcast.setOnClickListener {
//明示的インテントを利用してブロードキャストを送信する
val intent: Intent = Intent(this, MyReceiver::class.java)
sendBroadcast(intent)
}
}
//明示的インテントを利用したアクティビティへの遷移で戻り値が必要な場合は、このメソッドを用意する
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
//requestCodeはどこから戻ってきたか任意の数値が入る startActivityForResultの第二引数の数値が戻る
//resultCodeはok、calcel、noのいずれかが戻る
//dataには他のアクティビティからのデータがは居る
when (requestCode) {
0 -> {
var str: String = data?.extras?.getString("nullpo") ?: ""
Toast.makeText(this, str, Toast.LENGTH_LONG).show()
}
}
}
//暗黙的ブロードキャストを受信するクラス
//innerにすることで親のクラスのメンバへもアクセスできる
inner class MyReceiver2 : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
Toast.makeText(context, "がっ", Toast.LENGTH_LONG).show()
}
}
}
呼び出す先のブロードキャストが暗黙的インテントのブロードキャストを受信できるように、新しいアクティビティを作成したらインテントフィルタを設定しておく。actionはVIEW、categoryはDEFAULTが基本。あとはscemeなどによって区別されるが、このあたりは後ほど。
<activity android:name=".SubActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW">
<category android:name="android.intent.category.DEFAULT">
<data android:scheme="nullpo">
</data></category></action></intent-filter>
</activity>
画面遷移したアクティビティでは以下のようにして元のアクティビティに戻る。返値が必要な場合は返値を設定して戻る。
class SubActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_sub)
val btnNoResult: Button = findViewById(R.id.btnFinish)
val btnResult: Button = findViewById(R.id.btnFinishWithResult)
val btnReceiver: Button = findViewById(R.id.btnFinishBroadcast)
btnNoResult.setOnClickListener {
//ただ終了して戻る場合 戻り値なし
finish()
}
btnResult.setOnClickListener {
//戻り値を設定して戻る putExtraで戻したいデータを埋め込んでおく
var intent: Intent = Intent().let { it.putExtra("nullpo", "ぬるぬる") }
setResult(Activity.RESULT_OK, intent)
finish()
}
btnReceiver.setOnClickListener {
//暗黙的
val intent: Intent = Intent("NULLPO")
sendBroadcast(intent)
finish()
}
}
}
ブロードキャストを受信するクラス。Android Studioからレシーバークラスを生成すればマニフェストなど触らなくてもクラスを作ってくれるので楽。
class MyReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
Toast.makeText(context, "ぬるぽ", Toast.LENGTH_LONG).show()
}
}