안드로이드 With Java #10 Intent
Intent intent = new Intent(this, NextActivity); // 현재 Activity에서 다음 Activity로 정보를 전달하는 Intent 생성
startActivity(intent);
Intent intent = new Intent(package.name.NextActivity); // 위와 다르게 this 없이 argument 1개로 진행
startActivity(intent)
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.naver.com");
startActivity(intent);
위 소스를 실행하면, 스마트폰의 웹 브라우저들이 선택 리스트처럼 아래에서 위로 올라오고 사용자가 웹 브라우저 중 하나를 클릭했을 때 Intent
에 넣어둔 웹 주소가 열림
Intent intent = new Intent(Intent.ACTION_CALL, Uri_parse("tel:01012341234");
startActivity(intent);
위 소스를 실행하면, 스마트폰에서 전화를 걸 수 있는 앱의 리스트가 뜨게 되고 사용자가 선택을 하면 전화가 걸림 단, 사용자 스마트폰에 전화를 걸 수 있는 앱이 하나밖에 없다면 그것이 자동으로 선택될 수 있음
인텐트는 어플리케이션 안에서 무작위로 발생시키고 실행시킬 수 있음. 하지만 인텐트를 받는 입장에서는 들어오는 모든 요청을 실행시켜줄 필요는 없음. 그리고 원하지 않는 인텐트가 있을 수 있는데, 이 때 필요한 것이 인텐트 필터이다. 내가 원하는 인텐트만을 받아서 요청이 들어온 작업을 할 수 있음.
Intent
>Intent Filter
>Component
순으로 진행된다.
putExtra
, getString
메소드를 통하여 Map
자료형처럼 넣고 빼고 할 수 있다.
Intent intent = new Intent(this, NextActivity);
Intent.putExtra(key, value);
Intent intent = getIntent(); // new Intent가 아닌 getIntent를 이용하여 받은 Intent 꺼내기
String data = intent.getString(key);
getString
이외에 get+자료형
에 맞게 데이터를 꺼낼 수 있음
// 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
를 통해 옮겨갈 Activity
들이 필요하니 아래의 그림과 같이 New > Activity > Empty Activity 로 이동하여 빈 Activity를 만들자.
위에 보이듯이 SecondActivity
를 추가하였고 activity_second.xml
파일을 뷰로 연결시켰다.
manifest.xml
파일에 들어가보면
위와 같은 정보들이 있다.
여기서 <activity>
라고 된 태그 사이에 <intent-filter>
태그를 추가하여 intent-filter
를 추가할 수 있다.
manifest.xml
에서는 어플리케이션의 '목차'를 확인할 수 있다고 봐도 무방하다.
위와 같이 두번째 Activity라는 내용을 넣어주고 gravity
속성을 이용하여 정렬했다.
참고로
gravity
와layout_gravity
는 미묘한 차이가 있는데,gravity
는 자신을 정렬하는 것이고layout_gravity
는 해당 위젯에 포함된 하위 위젯들을 정렬하라는 이야기다. 여기서는 글자 자체를 가운데로 옮기기 위해 그냥gravity
속성을 사용하였다.
MainActivity
에서 SecondActivity
로 옮겨가는 소스를 작성해보자.
인텐트의 파라미터 두개는 순서대로 from
과 to
의 의미를 갖는다. 어디에서 어디로 갈지 정해주어야 한다.
위와 같이 작성하면 된다.
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
이 부분이 핵심인데, this
는 나의 현재 클래스를 의미하는 키워드이다. 현재 클래스는 당연히 MainActivity
이다.
앱을 실행하자마자 두번째 Activity로 잘 넘어온다.
라이프사이클은 어떻게 돌아가는지 라이프사이클 로그를 추가해서 확인해보자.
라이프사이클 확인 결과
MainActivity
에서 Intent
없이 처음 시작할 때와 같이
onCreate
> onStart
> onResume
까지는 같은데,
이후에 바로 onPause
가 들어가고
SecondActivity
의 onCreate
> onStart
> onResume
이 들어간다.
그리고 MainActivity
의 라이프사이클 상태는 onStop
이 된다.