인텐트란?
인텐트는 '컴포넌트를 실행하려고 시스템에 전달하는 메시지'이다.
즉, 기능을 수행하는 함수를 제공하는 클래스가 아니라 데이터를 담는 클래스이다.
한 앱에 두 개의 클래스가 있다고 가정했을 때, 한 개의 클래스에서 다른 클래스를 실행하려면 시스템에 인텐트를 전달해 줘야 한다. 그러면 시스템에서 인텐트의 정보를 분석해서 그에 맞는 컴포넌트를 실행해 준다.
액티비티 화면 되돌리기
액티비티는 화면을 구성하는 컴포넌트이다. 따라서 한 액티비티에서 인텐트로 다른 액티비티를 실행하면 화면이 전환된다.
그런데 화면을 전환했다가 다시 돌아왔을 때 사후 처리를 해야 할 수도, 하지 않을 수도 있다.
사후 처리 여부에 따라 인텐트로 액티비티를 시작하는 방법은 3가지이다.
여기서는 최근 권장하는 방법인 ActivityResultLauncher 방법으로 살펴보겠다.
이를 이용하려면 먼저 Contract 객체가 필요하다. 즉, ActivityResultLauncher로 인텐트를 발생시켜 액티비티를 실행할 때 실제 인텐트를 발생시키는 역할을 한다.
launch 함수를 호출하는 순간 ActivityResultLauncher에 등록된 Contract 객체가 실행되는 것이다.
val requestLauncher: ActivityResultLauncher<Intent> = registerForActivityResult(
ActivityResultContracts.StartActivityForResult())
{
val resultData = it.data?.getStringExtra("result")
binding.mainResultView.text = "result : $resultData"
}
이렇게 만든 ActivityResultLauncher 객체를 launch() 함수로 실행해주면 된다.
val intent: Intent = Intent(this, DetailActivity::class.java)
requestLauncher.launch(intent)
액티비티 생명주기
액티비티의 상태는 크게 3가지로 구분할 수 있다.
To Do List 앱 만들기
액티비티를 활용해 간단한 할 일 목록 앱을 만들어보도록 하겠다.
모든 할 일 데이터는 메모리에 저장하고 화면이 전환될 때 데이터가 사라지지 않도록 번들에도 저장할 것이다.
AddActivity.kt 파일 내용입니다.
package com.example.ch13_activity
import android.app.Activity
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import androidx.appcompat.app.AppCompatActivity
import com.example.ch13_activity.databinding.ActivityAddBinding
class AddActivity : AppCompatActivity() {
lateinit var binding: ActivityAddBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding= ActivityAddBinding.inflate(layoutInflater)
setContentView(binding.root)
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.menu_add, menu)
return super.onCreateOptionsMenu(menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean = when(item.itemId){
R.id.menu_add_save -> {
val intent = intent
intent.putExtra("result", binding.addEditView.text.toString())
setResult(Activity.RESULT_OK, intent)
finish()
true
}
else -> true
}
}
MainActivity.kt 파일 내용입니다.
package com.example.ch13_activity
import android.content.Intent
import android.os.Bundle
import android.os.PersistableBundle
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.ch13_activity.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
lateinit var binding: ActivityMainBinding
var datas: MutableList<String>? = null
lateinit var adapter: MyAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding= ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
//add................................
val requestLauncher: ActivityResultLauncher<Intent> = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()){
it.data!!.getStringExtra("result")?.let {
datas?.add(it)
adapter.notifyDataSetChanged()
}
}
binding.mainFab.setOnClickListener {
val intent = Intent(this, AddActivity::class.java)
requestLauncher.launch(intent)
}
datas = savedInstanceState?.let {
it.getStringArrayList("datas")?.toMutableList()
} ?: let {
mutableListOf<String>()
}
val layoutManager = LinearLayoutManager(this)
binding.mainRecyclerView.layoutManager=layoutManager
adapter=MyAdapter(datas)
binding.mainRecyclerView.adapter=adapter
binding.mainRecyclerView.addItemDecoration(
DividerItemDecoration(this, LinearLayoutManager.VERTICAL)
)
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putStringArrayList("datas", ArrayList(datas))
}
}
개발자로서 성장하는 데 큰 도움이 된 글이었습니다. 감사합니다.