화면을 구성하는 가장 기본적인 UI
앱이 실행되면 전체 화면에 앱의 UI가 나타나고, 사용자가 입력한 화면터치 등의 이벤트에 따라 앱의 기능이 수행되는 것을 말한다. 예를 들어서 핸드폰으로 회원가입을 할 경우, 회원가입 버튼을 사용자가 터치하거나 클릭하게 되면 회원가입 페이지로 넘어가는 것과 동일하다.
가장 기본이 되는 Activity가 메인 Activity가 된다. 프로젝트를 생성하면 있는 MainActivity가 가장 기본이 되는, 메인 Activity가 된다고 볼 수 있다.
👉 Activity는
mainfest
파일에 등록이 되어야 한다.
여러 다양한 Activity를 추가 한 뒤, 가장 먼저 선언하고 싶은 Activity의 앞에<intent-filter>
을 추가해주면 가장 먼저 선언되어 먼저 실행되는 Activity를 설정해 줄 수 있다.
👉 First Activity에서 Second Activity를 호출할 때
intent
사용
Activity를 넣는, 그리고 intent-filter을 추가할때 넣는 mainfest
는 대체 뭘까?
mainfest는 패키지 이름, 구성 요소를 추가, 권한을 설정, 라이브러리 추가 및 API 최소 수준을 설정할 때 사용한다.
Intent에 대해서 좀 더 자세히 정리해볼까?
이 두 가지의 Intent 종류가 있다. 솔직히 이름만 봐서도 뭔지 대충 감이 올 것이다.
직접 이름을 부여해서 호출한다. 즉, 앱 안에서 가지고 있는 Activity
간에 호출을 하고자 할 때 명시적 Intent를 사용하면 된다.
호출받을 Activitiy의 이름을 직접 넣어서 사용하면 된다.
val intent = Intent(this, 호출할 Activity 명 :: class.java) startActivity(intent)
내가 만든 Activity
에서 인터넷 브라우저를 띄울 경우 인터넷 브라우저 기능을 하는 앱이 핸드폰에 여러 개 존재할 가능성이 있다. 이런 여러가지 중 웹브라우저를 띄울 수 있는 앱을 열어달라는 암시적 Intent를 사용하게 되면, 가능한 앱을 스캔을 한 뒤 가능한 앱들을 아래 사진처럼 띄워준다.
명시적 Intent와 다르게 호출받을 Activity의 이름을 직접 넣지 않는다.
val call_intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:114")) startActivity(call_intent)
MainActivity가 있는 폴더 안에 new -> Activity -> Empty View Activity를 눌러서 새로운 Activity를 두 개 생성한다.
그 다음으로는 새로 생성한 FirstActivitiy, SecondActivity에 TextField 하나랑 버튼 하나를 생성하고 id 및 텍스트 수정, 그리고 위치 조정을 해준다.
FirstActivity에서 버튼을 클릭하면 SecondActivity로 넘어가게 구현할 것이다.
1. FirstActivity 클래스 : 버튼 연결
이전 실습 때 해봤던 버튼 연결 방법 그대로 복습하면 된다.
2. SecondActivity 클래스 : Finsh()
Finish를 해주면 되는데, FirstActivity 클래스와 동일하게 버튼을 연결해주면 된다.
3. 코드 분석 ✅
FirstActivity에서 버튼 클릭 시 명시적 intent를 선언해 SecondActivity 호출
호출 시 SecondActivity가 호출됨
btn_close 버튼을 클릭하면 finish
4. 실행 🌟
Hello World! 이건 초기화면인 MainActivity의 화면이 나오는 것이다. 이럴 경우에는 mainfest
를 확인해보자.
MainActivity가 true로, intent로 설정되어 있다. 그렇다면 우리는 FirstActivity를 intent로 설정해주면 문제가 해결될 것이다.
다시 실행해보면 잘 작동하는 것을 확인할 수 있다.
FirstActivity layout에서 버튼을 두 개 추가해 준 뒤, 새로 추가한 버튼의 onClick를 doOnButtonClick이라는 속성으로 설정해준다.
다이얼을 호출하거나 지도보기를 호출할 때 doOnButtonClick 함수를 사용하는데, 두 개의 기능이 다른데 똑같은 함수를 사용해서 호출해도 괜찮을까? ㅇㅇ 완전 괜찮다.
view의 getId를 통해 Id를 가져와서 구별하기 때문에 별로 상관이 없다.
실행하면 다이얼 버튼을 눌렀을 때 114가 눌러진 전화앱으로 이동하고, 지도 버튼을 눌렀을 때는 설정된 경도와 위도가 표시된 부분을 지도앱을 열어서 보여준다.
<intent-filter>
태그를 SecondActivity인 <activity>
요소 하위에 추가한다.
암시적 Intent를 받을건데 Dial과 관련된 것을 받는다.
데이터 전달은 extra data를 이용해 이름과 값의 쌍으로된 정보를 전달하면 된다.
- Intent putExtra(String name, int value)
- Intent putExtra(String name, String value)
- Intent putExtra(String name, boolean value)
- int getInExtra(String name, int defaultValue)
- String getStringExtra(String name)
- boolean getBooleanExtra(String name, boolean deafultValue)
데이터를 입력할 수 있는 EditText를 추가하고 데이터를 입력한 뒤에 버튼을 클릭하면 세번째 Activity로 데이터를 전달하는 버튼을 추가해준다.
데이터를 전달해주는 버튼을 상수 btn_data로 설정했다. 코드를 한 번 살펴보자.
strData에 editText의 텍스트를 문자열로 가져와서 저장해준다. 그리고 intent를 통해 명시적 Intent를 해주고 데이터를 전달해주면 된다.
strData 변수명을 선언하고 intent.getStringExtra로 아까 ThirdPage Activity를 호출할때 보냈던 Key값을 받게되면 string Data가 strData 변수 안에 설정된다. 그리고, ThirdPage Layout 위에 있는 EditText를 setText라는 메소드로 받아온 strData를 넣게되면 Activity를 데이터에 넣고 버튼을 누르면 Finish를 통해 끝나게 된다.