Activity間のObject引き渡し


 方法

いくつか方法はあると思うが、
そんなに大したことないものにコードを沢山書きたくないので、
シンプルにobjectにSerializableをimplementsして引き渡す

Gsonを利用した例はコチラ
Activity間のObject引き渡し(Gson)

実装

object

Activity間で引き渡すobject

DataState.kt
data class DataState(
    val id: Int,
    val name: String
): Serializable

Activity

引き渡し元

MainActivity.kt
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val intent = Intent(this, SecondActivity::class.java)
        val state = DataState(0, "name0")
        intent.putExtra(SecondActivity.KEY_STATE, state)
        startActivity(intent)
    }
}

引き渡し先

SecondActivity.kt
class SecondActivity : AppCompatActivity() {

    companion object {
        val KEY_STATE = "key_state"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)

        val state = intent.getSerializableExtra(KEY_STATE)
        if(state is DataState){
            println(state.id)
            println(state.name)
        }
    }
}

出力結果

0
name0

list objectの引き渡し

Activity

引き渡し元

MainActivity.kt
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val states = arrayListOf<DataState>()
        for(i in 0..2){
            val state = DataState(i, "name$i")
            states.add(state)
        }

        val intent = Intent(this, SecondActivity::class.java)
        intent.putExtra(SecondActivity.KEY_STATE, states)
        startActivity(intent)
    }

引き渡し先

SecondActivity.kt
class SecondActivity : AppCompatActivity() {

    companion object {
        val KEY_STATE = "key_state"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)

        val states = intent.getSerializableExtra(KEY_STATE) as ArrayList<*>

        states.forEach {
            if(it is DataState){
                println(it.id)
                println(it.name)
            }
        }
    }
}

list object 出力結果

0
name0
1
name1
2
name2

まとめ

とりあえずobjectがSerializableをimplementsしておけば
そのままだろうが、listにしようが引き渡せます。

GitHubに公開しました。
https://github.com/yoshihitoijichi/ActivityIntentObjectSample