안드로이드 With Java #10 Intent

Jake Seo·2020년 8월 5일
0

안드로이드 With Java

목록 보기
10/31

안드로이드 With Java #10 Intent

Intent 개념

  • 어플리케이션 구성요소간 작업 수행을 위한 정보 전달을 하는 역할

Intent 종류

  • 명시적 Intent
    • 작업을 수행하길 원하는 컴포넌트를 정확히 지목
    • 암시적 Intent에 비해 안정적
Intent intent = new Intent(this, NextActivity); // 현재 Activity에서 다음 Activity로 정보를 전달하는 Intent 생성
startActivity(intent);
  • 암시적 Intent
    • 해당 작업을 할 수 있는 컴포넌트 전부에게 전달
    • 앱에서 공유버튼 등을 눌렀을 때 특정 어플리케이션이 열리는 것이 아니라 공유 기능을 수행할 수 있는 소셜어플리케이션 중 하나를 선택하는 등의 기능
Intent intent = new Intent(package.name.NextActivity); // 위와 다르게 this 없이 argument 1개로 진행
startActivity(intent)

Intent 사용 종류

WebView

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.naver.com");
startActivity(intent);

위 소스를 실행하면, 스마트폰의 웹 브라우저들이 선택 리스트처럼 아래에서 위로 올라오고 사용자가 웹 브라우저 중 하나를 클릭했을 때 Intent에 넣어둔 웹 주소가 열림

Call

Intent intent = new Intent(Intent.ACTION_CALL, Uri_parse("tel:01012341234");
startActivity(intent);

위 소스를 실행하면, 스마트폰에서 전화를 걸 수 있는 앱의 리스트가 뜨게 되고 사용자가 선택을 하면 전화가 걸림 단, 사용자 스마트폰에 전화를 걸 수 있는 앱이 하나밖에 없다면 그것이 자동으로 선택될 수 있음

Intent Filter

인텐트는 어플리케이션 안에서 무작위로 발생시키고 실행시킬 수 있음. 하지만 인텐트를 받는 입장에서는 들어오는 모든 요청을 실행시켜줄 필요는 없음. 그리고 원하지 않는 인텐트가 있을 수 있는데, 이 때 필요한 것이 인텐트 필터이다. 내가 원하는 인텐트만을 받아서 요청이 들어온 작업을 할 수 있음.

Intent > Intent Filter > Component 순으로 진행된다.

Intent data 전달

putExtra, getString 메소드를 통하여 Map 자료형처럼 넣고 빼고 할 수 있다.

Intent에 data 넣는 방법

Intent intent = new Intent(this, NextActivity);
Intent.putExtra(key, value);

Intent에 data 꺼내는 방법

Intent intent = getIntent(); // new Intent가 아닌 getIntent를 이용하여 받은 Intent 꺼내기
String data = intent.getString(key);

getString 이외에 get+자료형에 맞게 데이터를 꺼낼 수 있음

Intent의 결과값 받기

  • Intent로 새로 생성된 activity로부터 응답 받기
// Activity A의 영역
Intent intent = new Intent(this, NextActivity);
startActivityForResult(intent, REQUEST_CODE); // Intent의 결과값을 받을 때는 startActivity로 실행시키지 않도록 주의


// Activity B의 영역
Intent intent = new Intent();
intent.puExtra(key, value);
setResult(RESULT_CODE, intent);


// Activity A의 영역
@Override
Protect void onActivityResult(int requestCode, int resultCode, Intent data){
  // 많은 Activity가 A에게 ActivityResult를 보낼 수 있기 때문에 REQUEST_CODE를 잘 설정하는 것이 중요함
  if(requestCode == REQUEST_CODE){
    String result = intent.getStirng(key); // B가 보낸 결과값
  }
  // resultCode를 통해 받은 데이터가 에러인지 등등 결과에 대한 정보를 추가로 얻을 수 있다.
}

Intent 실습

빈 프로젝트를 하나 생성한 뒤에 Intent를 통해 옮겨갈 Activity들이 필요하니 아래의 그림과 같이 New > Activity > Empty Activity 로 이동하여 빈 Activity를 만들자.

위에 보이듯이 SecondActivity를 추가하였고 activity_second.xml 파일을 뷰로 연결시켰다.

manifest 파일 탐방하기

manifest.xml 파일에 들어가보면

위와 같은 정보들이 있다.

여기서 <activity>라고 된 태그 사이에 <intent-filter> 태그를 추가하여 intent-filter를 추가할 수 있다.

manifest.xml에서는 어플리케이션의 '목차'를 확인할 수 있다고 봐도 무방하다.

activity_second.xml 파일 작성하기

위와 같이 두번째 Activity라는 내용을 넣어주고 gravity 속성을 이용하여 정렬했다.

참고로 gravitylayout_gravity는 미묘한 차이가 있는데, gravity는 자신을 정렬하는 것이고 layout_gravity는 해당 위젯에 포함된 하위 위젯들을 정렬하라는 이야기다. 여기서는 글자 자체를 가운데로 옮기기 위해 그냥 gravity 속성을 사용하였다.

두번째 Activity로 옮기는 소스 작성하기

MainActivity에서 SecondActivity로 옮겨가는 소스를 작성해보자.

인텐트의 파라미터 두개는 순서대로 fromto의 의미를 갖는다. 어디에서 어디로 갈지 정해주어야 한다.

위와 같이 작성하면 된다.

Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);

이 부분이 핵심인데, this는 나의 현재 클래스를 의미하는 키워드이다. 현재 클래스는 당연히 MainActivity이다.

결과 확인

앱을 실행하자마자 두번째 Activity로 잘 넘어온다.

LifeCycle 실습

라이프사이클은 어떻게 돌아가는지 라이프사이클 로그를 추가해서 확인해보자.

라이프사이클 확인 결과

MainActivity에서 Intent없이 처음 시작할 때와 같이

onCreate > onStart > onResume 까지는 같은데,

이후에 바로 onPause가 들어가고

SecondActivityonCreate > onStart > onResume이 들어간다.

그리고 MainActivity의 라이프사이클 상태는 onStop이 된다.

profile
풀스택 웹개발자로 일하고 있는 Jake Seo입니다. 주로 Jake Seo라는 닉네임을 많이 씁니다. 프론트엔드: Javascript, React 백엔드: Spring Framework에 관심이 있습니다.

0개의 댓글