Android #12 - Activity 전환 (국비38일차)

 

오늘은 우리가 만드는 화면 끼리의 전환을 공부해볼 것이다.

한 화면에서 어떤 버튼을 누르면 다른 화면으로 간다든지

그 화면에 입력한 정보를 다른 화면에서 출력한다든지 등의

공부를 해보자.

 

 

 

1. 화면 전환
2. 화면 간 데이터 전송
3. 두번째 화면에 입력한 값 다시 메인 액티비티로 가져오기
4. 묵시적 인텐트로 액티비티 실행
5. 다른 앱에서 앱 화면 켜기

 

 

 

 

 

1. 화면 전환

 

etc-image-0

우선 액티비티 메인 xml에 액티비티 전환을 해줄

버튼을 하나 만들어주자.

etc-image-1

그리고 메인 자바 파일로 와서

버튼 참조변수를 만들고

리스너까지 만들어주자.

etc-image-2

이제 두 번째 화면을 만들어줘야 한다.

새로운 자바 클래스를 만들자.

 

etc-image-3

2번째 액티비티 자바 파일에

setContentView를 쓰고

그 안에 내용물을 넣기 위해

activity_second.xml을 만들자.

 

etc-image-4

layout폴더 안에 만들어야 한다.

etc-image-5

이 xml파일에

간단하게 텍스트뷰로 2번째 액티비티라고 쓰고

 

etc-image-6

다시 2번째 자바로 돌아와서

setCOntentView 안에 방금 만든

activity_second를 넣어준다.

 

etc-image-7

이때 주의해야 할 점이 있다.

우선 manifests폴더 안에 있는

AndroidMAnifest 파일을 켜보자.

etc-image-8

 

액티비티는 안드로이드의 4대 구성요소로

반드시 새로 만들거나 하면

방금 킨 xml 파일에 등록해야 한다.

<activity>가 있는 곳 앞뒤로

새로 <activity>를 만들고

name과 exporter값(false로)을 주자.

 


Android Application의 4대 구성요소[Component] - AndroidManifest.xml의
 <application> 태그 안에 반드시 등록해야만 사용할 수 있는 주요 클래스들 ]

1. Activity  - 화면 담당 클래스
2. BroadcastReceiver - 디바이스의 특정 상태[문자수신, 배터리부족, 부팅완료, gps 상태정보 등등..]를 
OS에서 방송해 주면 이를 수신할 때 사용
3. Service - 백그라운드(앱은 실행 중- 화면에서 안 보이는)에서 코드를 동작하게 하고 싶을 때 사용. [ex. 뮤직플레이어 앱]
4. Contents Provider - 다른 앱에게 나의 DB 정보를 제공할 때 사용 [ex. 사진앱 or 연락처앱 ]


 

etc-image-9

그리고 메인 액티비티 자바로 가서

btn에 뷰를 넣고

리스너를 만든다.

 

여기서 2번째 액티비티를 실행시켜 줄 객체를 만들어야 한다.

이것이 Intent 객체다.

파라미터엔 context와 내가 실행시킬 액티비티의 class 정보를 주면 된다.

그리고 startActivity(intent)를 하면 끝

 

 

etc-image-10
etc-image-11

첫 번째 결과물 화면에서

버튼을 누르면 두 번째 액티비티로 가게 된다.

 

그리고 만약 화면 제일 아래에 있는

폰 자체의 내비게이션에서 뒤로 가기 버튼을 누르면

다시 첫 번째 액티비티로 가게 된다.

etc-image-12

만약 그게 싫다면

즉, 2번째 액티비티로 갈 때 메인 액티비티가 종료되길 원한다면

finish();를 써주자.

 

 

 

etc-image-13

이제 리스너를 만들 때 굳이 익명클래스를 만들지 않아도 된다.

리스너 괄호 안에

view -> {}를 만들고

이 { } 안에 intent 객체를 만드는 방식을 사용해도 되기 때문이다.

이런 방식을 람다 방식이라고 한다.

etc-image-14

그리고 만약 그 액티비티의

액션바의 타이틀을 바꾸고 싶다면

getSupportActionBar().setTitle("여기에 이름"); 을 쓰고

 

뒤로 가기 버튼을 만들고 싶다면

getSupportActionBar().setDisplayHomeAsUPEnabled(true);를

쓰면 된다.

그러나 이것만 써선

뒤로 가기 버튼이 작동하지 않는다.

이땐 inSupportNavigateUp() 메소드를 만들어

super.onbackPressed(); 코드를 안에 적어주자.

etc-image-15

 

그럼 위의 화면과 같이 결과가 나오며

뒤로 가기 버튼도 잘 작동할 것이다.

 

 

 

 

2. 화면 간 데이터 전송

 

이번엔 한 화면에서 입력한 데이터를

다른 화면에서 출력해 보자.

 

우선 새로운 프로젝트를 만들자.

etc-image-16

그리고 자바 안에 있는

내 폴더를 오른쪽으로 눌러 

New - Activity - Empty View Activity를

눌러주자.

etc-image-17

그리고 액티비티 이름을

SecondActivity로 설정하고 ok를 누르자.

 

그럼 1번에서 했던

새로운 자바 클래스를 만들고, 새로운 xml을 만든 후,

manifest파일에 가서 <activity를 선언하고,

setContentView를 작성하는 것까지 자동적으로 다 처리가 되어있을 것이다.

 

etc-image-18

 

etc-image-19

위에 보이는 것처럼

모두 다 되어있다.

 

etc-image-20

이제 메인 xml로 가서

이름, 나이를 적을 editText와 button을 만들자.

 

etc-image-21

그 후 메인 자바 클래스로 와서

참조변수를 선언하고

btn에 리스너를 단 후

String name, int age에 각각 적은 값을 넣어준다.

 

그리고 Intent 객체를 만들어서

그 객체가 데이터를 보내게 해 준다.

putExtra라는 명령어이며

첫 번째 파라미터는 그 데이터를 지칭할 이름,

그리고 두 번째 파라미터는 값을 넣는다.

 

마지막으로 startActivity(intent);를 해주면 끝

 

etc-image-22

이제 두번째 액티비티 xml로 가서

텍스트 뷰를 만들어주자.

 

etc-image-23

그리고 두번째 액티비티 자바 클래스로 이동해서

intent 객체를 만들고
(이때 new 가 아닌 getIntent를 쓰자.)

String과 int 값들을 받은 후

각각 title에 넣고

텍스트 뷰에 setText를 해주면 된다.

 

etc-image-24

 

첫 번째 화면의 모습이며

etc-image-25

첫 번째 화면에 넣은 값이

두 번째 화면에 나타나는 모습이다.

 

 

 

3. 두번째 화면에 입력한 값 다시 메인 액티비티로 가져오기

 

 

다시 새로운 프로젝트를 만들고

etc-image-26

액티비티 메인 xml에

두번째 화면으로 갈 버튼과

값을 출력할 텍스트뷰를 만들자.

 

etc-image-27

 

간단하게 테스트하기 위해

위와 같이 만들었다.

 

etc-image-28

그리고 메인 자바 클래스로 이동해

참조변수에 뷰를 넣고

리스너를 람다 형식으로 만든 후

intent 객체까지 만들었다.

 

etc-image-29

그 후 onCreate 메소드

밖에 멤버 함수로

ActivityResultLauncher라는 객체를 만들어야 한다.

registerForactivityResult 안에 파라미터로는

ActivityResultContracts.StartActivityForResult()와

new ActivityResultCallback을 써야 한다.
(두 번째 파라미터로 인해 익명클래스 생성)

etc-image-30

이 익명클래스 안에는

실행시켰던 액티비티에서 [뒤로 가기 버튼]으로 취소했을 수도 있어서

if 문을 통해

그 상황을 나눠줘야 한다.

 

etc-image-31

이제 두 번째 액티비티 xml로 가서

이름, 나이를 입력할 EditText를 만들고

버튼까지 만들어주자.

 

etc-image-32

이런 느낌으로..

etc-image-33

그 후 2번째 액티비티 자바 클래스로 와서

버튼에 리스너를 달고

위에서도 했듯

각각의 데이터를 String과 int 자료형에 넣어서

intent 객체를 통해

데이터를 보낸다.

그리고 setResult(RESULT_OK, intent)를 통해

보내줘야 아까 if 문으로 나눈 것이 제대로 작동을 한다.

etc-image-34

다시 메인 액티비티 자바 클래스로 와서

if문에

RESULT_OK 일 때

Intent 객체를 만들어서

데이터를 받아서

텍스트뷰에 setText를 하면 끝!

 

etc-image-35
etc-image-36

 

etc-image-37

 

위의 결과화면처럼 잘 작동하게 된다.
(회원가입할 때 주소나 id 중복 테스트 하는 느낌이다...)

 

 

 

4. 묵시적 인텐트로 액티비티 실행 

 

 

새로운 프로젝트를 만들고

etc-image-38

메인 xml에

버튼을 하나 만들자.

etc-image-39

그 후 메인 자바 클래스로 가서

버튼에 리스너를 만든 후

 

새로운 액티비티를 만들어주기 해서

자동으로 2번째 액티비티 xml과 자바파일을 생성하자.

 

etc-image-40

그 후 androidmanifest.xml로 가서

두 번째 액티비티 쪽에

<intent-filter> 안에 

이름을 명명하고

카테고리도 넣어주자.
(둘 다 필수)

 

etc-image-41

그리고 메인 자바 클래스로 가서

버튼 리스너 안에

인텐트 객체를 만들고 

setAction에 aaaa(묵시적 인텐트 : 아까 명명한 두 번째 액티비티 이름 )을

넣고 startActivity(intent)를 하면

 

etc-image-42

 

etc-image-43

별 다른 코드 없이도

2번째 화면이 실행이 된다.

 

 

 

 

5. 다른 앱에서 앱 화면 켜기

 

새로운 프로젝트를 만들어서

4번의 2번째 화면을 켜보자.(aaaa라고 명명된 액티비티)

etc-image-44

메인 xml에

버튼만 놓고

 

 

etc-image-45

이를 메인 자바 클래스에서

리스너를 만들고 

그 안에 intent객체도 만들어 준 후

setAction("aaaa");를 하고

startActivity(intent);

를 해준다.

 

 

etc-image-46

 

그럼 저 버튼을 누르면

etc-image-47

4번에서 만든 2번째 액티비티가 켜진다...(신기해)