<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 사용처
// - Activity와 Activity
// - Android System 과 내 App (전화)
// - 다른 App과 내 App -> 무작정 사용할 수 없다. 상호합의가 있어야한다.
// - 요청의 종류
// - 전달만 하는 요청 startActivity(intent)
// - 리턴을 받는 요청 startActivityForResult(intent2,200) 200은 id.
//- 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 바로 넣기 .
익명함수니까 {} 해서 시작하면 됨. 그러고 오버라이드 해서 셋 다 불러옴.
'안드로이드 스튜디오' 카테고리의 다른 글
안드로이드: Fragment , NullSafety,Resource (0) | 2020.08.16 |
---|---|
안드로이드 : 에센셜 - 안드로이드 스튜디오 투어 (0) | 2020.08.15 |
안드로이드 스튜디오: 에센셜 UI (0) | 2020.08.13 |
안드로이드 스튜디오:AndroidManifest.xml, Java, Res 폴더 설명 (0) | 2020.05.30 |
댓글