액티비티(Activity)
- 화면을 구성하는 가장 기본적인 컴포넌트
- 디폴트 화면이 액티비티임
- 안드로이드폰에 나타나는 화면 하나하나를 말함
- 안드로이드의 4대 컴포넌트(액티비티, 서비스, 브로드캐스트 리시버, 콘텐트 프로바이더) 중 가장 핵심적인 요소
서비스(Service)
- 눈에 보이는 화면(액티비티)과 상관없이 백그라운드에서 동작하는 컴포넌트
- 백신프로그램 / 백그라운드 음악 재생
- 로컬에서 동작하는 서비스는 아래 세 단계를 거침
- 서비스 생성 -> 서비스 시작 -> 서비스 종료
메인 액티비티에서 세컨드 액티비티를 호출하는 코드 - 단방향
//SecondActivity.kt
buttonNewActicity.setOnClickListener {
var intent = Intent(this, SecondActivity::class.java)
//var intent = Intent(applicationContext, SecondActivity::class.java)와 같은 코드
startActivity(intent);
}
* 액티비티를 추가하는 경우 Manifest파일에도 새 액티비티를 등록시켜야 함
<activity android:name=".SecondActivity" />
* Launcher Activity 체크는 처음으로 실행되는 Activity로 지정할 것인지 여부
* 액티비티를 생성할 때 지정해주지 않더라도 Manifest파일에서 아래의 코드를 등록해주면 됨 (디폴트는 mainActivity)
<activity android:name=".ThirdActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
(참고) 라디오 버튼을 이용한 액티비티 호출 방법
lateinit var intent:Intent
buttonNewActicity.setOnClickListener {
when(radioGroup.checkedRadioButtonId){
R.id.radioButton -> intent = Intent(this, SecondActivity::class.java)
R.id.radioButton2 -> intent = Intent(this, ThirdActivity::class.java)
}
startActivity(intent);
}
인텐트(intent)
- 안드로이드의 4대 컴포넌트가 서로 데이터를 주고받기 위한 메시지 객체
- 명시적 인텐트와 암시적 인텐트로 구분됨
명시적 인텐트
- 명시적 인텐트는 다른 액티비티의 이름을 명확히 지정할 때 사용
var intent = Intent(this, 불러올 액티비티명::class.java)
startActivity(intent);
- intent( ) 생성자의 두 번째 파라미터 : 액티비티 클래스를 넘겨줌
- startActivity(intent) : 생성한 인텐트를 넘겨서 해당 액티비티를 실행함
- 일반적으로 명시적 인텐트는 사용자가 새로운 액티비티를 직접 생성하고 호출할 때 사용됨
- putExtra() : 필요한 만큼 데이터를 인텐트에 넣은 다음 startActivity()로 인텐트를 다른 액티비티에 넘김
- 인텐트를 받은 액티비티에서는 getStringExtra(), getInExtra(), getBooleanExtra() 등의 메소드로 넘어온 데이터에 접근할 수 있음 - 타입에 맞게 메소드를 호출
//MainActivity.kt
buttonFinish.setOnClickListener {
var intent = Intent(this, SecondActivity::class.java)
intent.putExtra("VoteCount",voteCount)
intent.putExtra("ImgName",imgName)
startActivity(intent)
}
//SecondActivity.kt
//앞 화면에서 보낸 투표 결과 값을 받는다
var voteResult = intent.getIntArrayExtra("VoteCount")
var imageName = intent.getStringArrayExtra("ImgName")
양방향 액티비티
- 메인 액티비티에서 세컨드 액티비티로 데이터를 넘긴 후에 세컨드 액티비티에서 다시 메인 액티비티로 데이터를 돌려주는 경우 사용
- 메인 액티비티에서 putExtra()로 인텐트에 데이터를 넣는 것은 동일함
- 세컨드 액티비티에서 데이터를 돌려받으려면 액티비티를 호출할 때 startActivityForResult() 메소드 사용
- 세컨드 액티비티에서 finish()로 끝내기 전에 메인 액티비티에 돌려줄 인텐트를 생성하여 putExtra()로 데이터를 넣은 다음 setResult()로 돌려줌
- 메인 액티비티에서는 onActicityResult() 메소드를 오버라이딩하고 오버라이딩된 메소드 안에서 getExtra()로 돌려받은 데이터를 사용
1. MainActivity에 intent생성 및 startActivityForResult()로 데이터를 넘겨줌
//MainActivity.kt
btnNewActivity.setOnClickListener {
var intent = Intent(this, MainActivity2::class.java)
intent.putExtra("Num1",(editText.text.toString()).toInt())
intent.putExtra("Num2",(editText2.text.toString()).toInt())
startActivityForResult(intent, 0)
//requestCode : 다수의 액티비티가 있을 때 효율적으로 처리하기 위한 코드
}
2. MainActivity2에서 데이터를 받아서 계산, 새로운 intent를 생성 후 setResult()로 ok사인을 넘겨줌
//MainActivity2.kt
var inIntent = intent
var hapValue = inIntent.getIntExtra("Num1",0)+inIntent.getIntExtra("Num2",0)
btnReturn.setOnClickListener {
var outIntent = Intent(this, MainActivity::class.java)
outIntent.putExtra("Hap",hapValue)
setResult(Activity.RESULT_OK, outIntent)
finish()
}
3. MainActivity에서 ok사인을 받아서 onActicityResult()에 작성한 결과를 출력함
//MainActivity.kt
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if(resultCode == Activity.RESULT_OK){
var hap = data!!.getIntExtra("Hap",0)
Toast.makeText(applicationContext, "합계 : $hap", Toast.LENGTH_SHORT).show()
}
}
암시적 인텐트(묵시적 인텐트)
- 약속된 액션을 지정하여 안드로이드에서 제공하는 기존 응용 프로그램을 실행
- 예시) 전화번호를 인텐트로 넘긴 후에 전화 걸기 응용 프로그램이 실행되는 것
- 메인 액티비티에서 인텐스 생성시, 실행하고자 하는 액션을 지정하고 액션의 데이터 값을 설정하면 기존 안드로이드 응용 프로그램이 실행됨
- 전화걸기와 구글 맵을 사용하려면 AndroidManifest.xml의 application 위에 다음과 같이 권한을 추가해야 함
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
//전화 걸기
btnDial.setOnClickListener {
var uri = Uri.parse("010-1234-5678")
var intent = Intent(Intent.ACTION_DIAL,uri)
startActivity(intent)
}
//홈페이지 열기
btnWeb.setOnClickListener {
var uri = Uri.parse("http://naver.com")
var intent = Intent(Intent.ACTION_VIEW,uri)
startActivity(intent)
}
//구글 맵 열기
btnGoogle.setOnClickListener {
var uri = Uri.parse("https://google.com/maps?q="+37.559133+","+126.927824)
var intent = Intent(Intent.ACTION_VIEW,uri)
startActivity(intent)
}
//구글 검색하기
btnSearch.setOnClickListener {
var intent = Intent(Intent.ACTION_WEB_SEARCH)
intent.putExtra(SearchManager.QUERY, "안드로이드")
startActivity(intent)
}
//문자 보내기
btnSms.setOnClickListener {
var intent = Intent(Intent.ACTION_SENDTO)
intent.putExtra("sms_body","안녕하세요?")
intent.data = Uri.parse("smsto:"+Uri.encode("010-1234-5678"))
startActivity(intent)
}
//사진 찍기
btnPhoto.setOnClickListener {
var intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
startActivity(intent)
}
액티비티 생명주기
액티비티 실행
- 응용 프로그램이 시작되면 onCreat(), onStart(), onResume() 메소드가 수행되고 메인 액티비티 화면이 나옴
액티비티 종료
- 메인 액티비티를 끝내면 onPause(), onStop(), onDestroy() 메소드가 차례로 수행되고 응용 프로그램이 종료됨
- 만약 다른 액티비티를 요청하면 onPause(), onStop() 메소드가 수행되고 메인 액티비티가 중지되고 다른 액티비티 화면이 나옴
- 또 다른 액티비티의 사용을 종료하면 onRestart(), onStart(), onResume() 메소드가 수행되고 다시 메인 액티비티 화면이 나옴
로그조사를 위한 코드 (print기능)
//onDestroy()의 생명주기를 확인하는 코드 (해당 메소드 내부에 적어줌)
android.util.Log.i("이름","메세지")
'Android > Kotlin App' 카테고리의 다른 글
[Kotlin App] TabHost (0) | 2021.05.03 |
---|---|
[Kotlin App] 목록 대화상자 (0) | 2021.04.19 |
[Kotlin] ?(물음표)와 !!(느낌표 두개)의 사용 (0) | 2021.04.17 |
[Kotlin App] 메뉴 - 옵션메뉴, 컨텍스트 메뉴 (0) | 2021.04.16 |
[Kotlin] 안드로이드를 위한 Kotlin 문법 (0) | 2021.03.22 |
댓글