본문 바로가기
안드로이드 스튜디오

안드로이드: Activity, 익명함수,Intent

by 질서정연_ 2020. 8. 16.

<Activity>

01. Activity
- 앱의 한 화면이다.
- Life Cycle (수명 주기)
- OnCreate
-> activity가 만들어질 때 단 한번만 호출 된다.
-> activity를 만들 때 단 한번만 하면 되는 작업들은 여기에서 해준다.
- OnStart
- OnResume
-> 앱이 다시 돌아올때 무조건 호출 된다.
-> activity가 다시 호출 될 때 하면 되는 작업들을 여기에서 해준다.
- OnPause
-> 화면의 일부가 가려졌을 때
- OnStop
-> 화면 전부가 보이지 않을 때
- OnDestroy

 

마우스 우클릭->제너레이트->오버라이드 메소드

 

라이프사이클이 배운대로 작동하는지 확인하기.

println을 사용했었는데 로그라는 기능이 있음. 행동 발생할 때 그걸 기록하는거임

개발에서 로그찍는다 -> 원하는 행동 기록하겠다. 

 

Log.d("life_cycle","onCreate") 태그, 메세지

태그는 이름. 꼬리표. 특정한 기능만 보고싶을때 태그 사용하면 됨 

 

<Click Lister>

xml에 적어놓은 뷰를 클릭했을 때 원하는 동작을 할 수 있게끔 코드작성

xml에 적은 뷰를 엑티비티에 가져와서 사용자 인풋이 발생했을때 우리가 

원하는 동작을 실행시킬것임. 

그때 사용해야하는 것이 익명함수임 

이름 만들 필요가 없다는 것 ? -> 나중에 부를일이 없다.

 

매니페스트는 우리 앱의 지도다. 

액티비티 추가했다. -> 우리 앱의 한 화면을 추가했다. -> 매니페스토에 추가되어야한다.

 

<사용자가 뭔가를 했을때 반응하기위해 연결하는 방법

1.val textView:TextView = findViewById(R.id.hello

findViewById 가 뷰 돌아다니면서 아이디가 hello이면서 텍스트뷰인애를

가져온다

 

2. hello 이렇게 xml의 가져오고 싶은 아이디를 적는다. 

이러면 xml파일이 임포트 된다. 그래서 id로 바로 접근할 수 있다. 

 

hello.setOnClickListener {
Log.d("click","Click!")
}

 

OnClick -> 사용자가 클릭했을 때 , Listener가 듣고 있겠다. 클릭하는 순간

아랫부분이 호출 됨. 안드로이드 시스템이 Listener를 쭉 찾음. 

 

View에다가 리스너를 달아서 사용자의 인풋을 캐치할 수 있다.

사용자의 뷰를 가져오고 거기다가 리스너를 달아주면서 그 동작을 캐치할 수 있다.  

 

여러개의 setOnClick 붙여놨을때 제일 마지막에 있는게 적용.

 

리소스 아이디는 뭐냐?

res 밑에 string.xml에 정의되어있는 스트링.

hello.setText("안녕하세요") hello 가 안녕하세요 로 변경

 

//3. 이름이 필요한 경우 (click)
val click = object : View.OnClickListener{
override fun onClick(v: View?) {
Log.d("click","Click!")
hello.setText("안녕하세요")
})

클릭했을 시 글자 변경 

 

image.setImageResource(R.drawable.face)

R -> 리소스

drawable -> R밑의 drawable의

face-> face사진으로 변경 

 

Log.d("number", ""+number)

빈 문자열 + 인트, 캐릭터 .. -> 스트링으로 자동캐스팅 

 

xml 뷰는 정적임. 한번 설정해놓으면 바뀌지 않음 .

동적이다 -> 한번 만든다음 변경 가능하다.

xml 뷰를 동적으로 바꾸고 싶을때 엑티비티에서 뷰를 가져와서 변경

뷰에 리스너 장착. 내가 한 활동을 캐치할 수 있다. 

 

<Intent>

03. Intent
// - 의도 , 요구, 의사전달 , 요청
// - Intent 사용처
// - ActivityActivity
// - Android System 과 내 App (전화)
// - 다른 App과 내 App -> 무작정 사용할 수 없다. 상호합의가 있어야한다.

// - 요청의 종류
// - 전달만 하는 요청 startActivity(intent)
// - 리턴을 받는 요청 startActivityForResult(intent2,200) 200id.

//- intent의 종류
// - 명시적 인텐트 -> 정확히 대상에게 요청
// - 암시적 인텐트 -> 할 수 있는 애에게 요청 .

 

alt+shift+enter -> import된다. 

 

val intent = Intent(this@Intent1, Intent2::class.java)

//packageContext란?
//intent를 만들었다. 1->2로 이동하겠다는 내용. 

//주변 정보를 넣어줄거니까 이 클래스를 넣어준다. Intent가 다 알고있으니까. 두번째는 이동 대상임.

//this@Intent2 -> 좀 더 정확한 의미. context넣어야 할 자리에는 골벵이 꼭

startActivity(intent)

//인텐트를 보낸다. 

 

intent.putExtra("number",1)
intent.putExtra("number2",2)

//intent에 값을 두개 넣은거임. 

val intent2 = Intent(this@Intent1, Intent2::class.java)
intent2.apply {
this.putExtra("number1",1)
this.putExtra("number2",1)
}

->//Apply -> 앞에 있는거에 apply를 적용하겠다. intent2에 적용되는 모든 것 여기에모여.
startActivity(intent2)

 

Intent1 보내는 쪽 Intent2 받는 쪽

꺼낼 때는 put(타입)Extra

putIntExtra 꺼낼 때는 타입을 적어준다. 

val number1= intent.getIntExtra("number1",0)
val number2 = intent.getIntExtra("number2",0)

(찾으려는거, 찾으려는게 없을 때 나오는 값)

 

 

Log.d("number", ""+number1)
Log.d("number", ""+number2)

스트링으로 캐스팅 하기 위해 아무것도 없는 문자열 더해주기

 

<보낸 요청에 대한 응답을 받는 방법>

setResult()결과를 설정해주는 애 

 

val result = number1 + number2

결과값 구했고 

val resultIntent = Intent()

인텐트를 만들었다. 

resultIntent.putExtra("result",result)

거기다가 putExtra 로 결과값을 넣어줬음 

setResult(Activity.RESULT_OK,)

그 인텐트를 

setResult(Activity.RESULT_OK, resultIntent)

setResult라는 애한테 할당을 해준다. 

 

-> 이렇게 하면 전송이 된다. 

 

setresult 니가 보낸 요청을 다 했는데 그걸 다 했어 그리고 결과값이 이거야 할때

결과값은 intent()에 넣어줌 . 

 

 

finish()//->Activity 종료

 

엑티비티는 스택개념. finish를 통해 intent2를 종료하면 intent1이 나오게된다.

 

 

<보낸 결과 받기>

온 크리에이트 밖으로 .  

인텐트를 보낸거 결과를 받으려면 

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
}

얘를 오버라이드 해줘야함 

 

intent2에서 보낸 resultcode가 setResult(Activity.RESULT_OK, resultIntent)

onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)

얘한테 보내지는 거임 

data는 intent2의 setResult(Activity.RESULT_OK, resultIntent) 얘가 들어옴

 

intent1에서 보낸 요청 .. 전달만 하는 요청 

->startActivity(intent2)

 

리턴을 받는 요청

->startActivityForResult(intent2,200)

명령이 여러개니까 명령을 각각 구분하기 위해 있는것.

200이 명령 이름임. 

-->이름 200이라는 intent2를 intent1 activity가 intent2에 보내는것 

 

if(requestCode == 200){
Log.d("number",""+requestCode)
Log.d("number",""+resultCode)
}

requestCode가 200인지 확인을 하고 맞으면 결과를 꺼냄 

 

결과를 보내는 쪽에서는

setResult(Activity.RESULT_OK, resultIntent)

resultcode라는걸 보내주고 결과값을 Intent에 넣어서 그 결과를 보내준다.

 

finish()는 activity를 종료하는거다. 

 

val intent = Intent(Intent.ACTION_VIEW, Uri.parse("http://m.naver.com"))

startActivity(intent)

저 URI를 보여달라는 intent

대상을 적는게 아닌 행동이 들어감, 행동에 필요한 정보 

암시적 인텐트 -> 할 수 있는 애에게 요청 . 직접 말하는게 아니고 인터넷 켤 수 있는 애들 모두 나옴

//배민 앱 매장 전화걸기도 암시적 인텐트 

 

<Task>

05.Task (일단 Activity와 같다고 생각하기)

-Stack
- 햄버거처럼 아래에서 위로 쌓이는 것
- Task가 쌓인다.

A -----> B --------> C --------> B ----->
A B A
A

켜지는 방법을 자체 속성으로 가지고 있는 경우
manifest에서 activity가 나오는데
-> launchMode라는 것을 정해주게 되면

켜지는 방법을 지시하는 경우
-> IntentFalg

LaunchMode 다중허용 ( a에서 b켜서 c를 켰고 C를 지워서 다시 A를 켠다면 아래의 두가지 방법.)
- Standard OK A A(아래의 A가 올라옴)
- singleTop 조건부OK B or B
---------------------------- A
- singleTask X (다중O) (다중X)
- singleInstance X

인텐트 플레그
FLAG_ACTIVITY_NEW_TASK
FLAG_ACTIVITY_SINGLE_TOP
FLAG_ACTIVITY_CLEAR_TOP
등등

 

인텐트에서 엑티비티가 스택으로 쌓인다고 말했음. 

비가 나는 켜질 때 이렇게 켜질래 자체적으로 속성 가지고 있을수도,

A가 B이렇게 켜져 라고 시킬수도 있음 

 

singleTop 조건부OK

->열러고 하는 애가 현재 Activity라면 새로 만들지 않음.

현재 Activity를 열고 싶다면 onNewIntent를 호출한다. 

Standard OK

->현재 Activity라도 새로 만든다. 

 

-->결론:엑티비티라는 것은 스텍으로 관리가 된다. 

그런데 런치모드나 인텐트 플레그로 사용자 마음대로 관리할 수 있다.

두 부분 개발하면서 왠만하면 안건드는게 제일 좋음. 

자연스럽게 관리가 되기때문에 특별히 조작하지 않고 자연스럽게하는게 좋다. 

 

 

edittext 뷰 컴포넌트 

얘의 리스너가 있음. 걔 찾아보기. 

<EditText
android:id="@+id/web_input"
android:layout_margin="20dp"
android:layout_width="match_parent"
android:hint="인터넷주소를 입력하세요"
android:textColorHint="#A4EAE3"
android:layout_height="wrap_content"/>

 

open.setOnClickListener {
val address = adress_edit_text.text.toString()
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(address))
startActivity(intent)
}

 

 

adress_edit_text.addTextChangedListener(object: TextWatcher{
override fun afterTextChanged(p0: Editable?) {
//변화 된 후 Editable이라는게 들어옴 .
Log.d("edit","afterTextChanged :" + p0)
}

override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
Log.d("edit","beforeTextChanged :" + p0)
}

override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
Log.d("edit","onTextChanged :" + p0)
}
})

 

adress_edit_text.addTextChangedListener(object: TextWatcher{

})

textWatcher를 적어주라했으니까 거기에 

object: TextWatcher 바로 넣기 . 

익명함수니까 {} 해서 시작하면 됨. 그러고 오버라이드 해서 셋 다 불러옴.

 

댓글