Android Programming
[Mobile Programming] 액티비티와 인텐트
gangintheremark
2021. 11. 10. 23:02
728x90
액티비티
사용자 인터페이스 내용을 담은 하나의 화면
- XMl 파일 추가 : 일반적으로 액티비티 하나당 XML 파일 하나
- JAVA 파일 추가
- Activity 에서 상속받은 클래스를 하나 만들어 새로운 액티비티의 자바 파일로 사용
- 자바 파일에서 setContentView(R.layout.second)와 같이 xml파일을 액티비티에 연결
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedinstanceState) {
super.onCreate(savedlnstanceState);
setContentView(R.layout.second); // second.xml 로 연결
}
}
액티비티 스택
- 액티비티들 간의 이동을 관리
- 스택 → task(애플리케이션) 단위로 하나씩 주어짐
- 앱에서는 새로운 액티비티의 호출과 액티비티의 종료 발생
- 새로운 액티비티가 호출될 때마다 스택에 차례대로 저장
- 하나의 task를 안드로이드 운영체제가 만듦
- 액티비티가 종료되면 스택에서 제거, 다음 액티비티로 제어가 넘어감

새로운 액티비티로의 이동
→ 위젯과 연동된 이벤트
→ startActivity(intent)
→ startActivityForResult(intent)
현 액티비티의 종료
→ finish(); 함수 호출
→ back 버튼;
인텐트
- 액티비티들 상호간 데이터를 주고 받기 위한 메시지 객체
- 인텐트에 전환될 액티비티 정보, 넘겨줄 데이터 값 저장
명시적 인텐트
- "애플리케이션 A의 컴포넌트 B를 구동 시켜라" 같이 명확하게 지정
- 이름을 아는 액티비티들 간의 이동에 주로 사용
- 주로 개발자가 만드는 하나의 애플리케이션 내에서 사용 : 액티비티들 간의 이동에 사용
암시적 인텐트
- 내가 만든 애플리케이션에서 안드로이드가 제공하는 일반적인 컴포넌트를 호출할 때 사용
명시적인 인텐트
실행하고자 하는 액티비티의 이름을 명시적으로 적음
- 메인 액티비티에서 인텐트에 액티비티에 대한 정보 넘김 → PutExtra();
- 인텐트를 통해 넘어온 데이터 처리 → getIntExtra();
Intent intent = new Intent(this, NextActivity.class);
intent.putExtra(name, value);
startActivity(intent);

양방향 액티비티와 데이터 전달
- 메인 액티비티에서 두 번째 액티비티로 데이터를 넘긴 후에 다시 돌려주는 경우
- 액티비티를 호출한 이후 돌려 받는 데이터를 위해 → onActivityResult() 함수를 통해 값을 돌려받음

// 서브 액티비티를 시작
Intent intent = new Intent(MainActivity.this, SubActivity.class);
startActivityForResult(intent, COMMAND);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
... // 여기서 값을 전달받음
}
실습
버튼 클릭 시, 해당 액티비티 화면으로 전환
// MainActivity.java
Button btn = (Button) findViewById(R.id.button);
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent myIntent = new Intent (MainActivity.this, activity2.class);
startActivity(myIntent);
}
});
// activity2.java
public class activity2 extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity2);
}
}
// manifests.xml
<activity android:name=".activity2" android:label="2번째 액티비티 화면"></activity>
암시적인 인텐트
- 액티비티 이름을 모르기 때문에 약속된 액션을 지정하면 안드로이드에서 최적의 타깃 컴포넌트를 찾아주는 방법
- 주로 안드로이드가 제공하는 컴포넌트들을 호출하여 작업할 때 사용
일반적인 인텐트 객체에서 지정 가능한 항목
- 타킷 컴포넌트 이름 : 명시적 인텐트 경우 정확히 지정
- 수행 액션의 종류 : 액션들을 결정해 주는 것
- 액션에 필요한 데이터 : View(보여줄 것), Dial(전화번호) 등
- 카테고리
- 엑스트라 : 타깃 컴포넌트로 전달될 추가적인 정보
// 미국에서 911 전화번호를 거는 경우,
Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:/911"));
startActivity(intent);
// 이메일을 보낼 경우,
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_EMAIL, recipientArray);
startActicity(intent);`
- 타깃 컴포넌트에 대해 정할 수 없으므로 액션의 종류를 지정

암시적 인텐트의 액션 종류
- ACTIN_VIEW : 데이터를 사용자에게 표시
- ACTIN_EDIT : 사용자가 편집할 수 있는 데이터 표시
- ACTION_MAIN : 테스크의 초기 액티비티로 설정
- ACTION_CALL : 전화 통화 시작
- ACTION_SYNC : 모바일 장치의 데이터를 서버 상의 데이터와 일치시킴
- ACTION_DIAL : 전화번호를 누르는 화면을 표시
암시적인 인텐트에 필요한 데이터
- Uri.parse(string 데이터)
- ex. ACTION_VIEW content://contacts/people/1 → 1번에 등록된 연락처를 띄움
- ex. ACTION_VIEW tel:01012345678 → 번호로 전화걸기 화면 띄움
실습
전화걸기 버튼과 웹 브라우저 버튼을 만들기
// MainActivity.java
public void onClicked(View view) { // onClicked 이벤트 지정
Intent myintent = null;
switch (view.getId()) {
case R.id.button_call:
myintent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:(+82)12345678"));
break;
case R.id.button_web:
myintent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.naver.com"));
break;
}
if(myintent != null) {
startActivity(myintent);
}
}
// manifests
<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
// 안드로이드가 제공하는 컴포넌트를 사용할 때는 [manifests] 파일의 허가 필요

생명주기
- 액티비티의 생성부터 소멸까지의 주기를 의미함
- 안드로이드 응용프로그램은 동시에 여러 개의 액티비티가 나올 수 없어 앞에 나온 화면 하나만 활성화된 상태이고 나머지는 모두 비활성화 상태
- 생명의 상태가 변함에 따라 어떤 메소드가 호출되는지 미리 정의

액티비티의 상태
- 실행 상태(resumed, running) : 액티비티가 전경에 위치, 사용자의 포커스를 가짐
- 일시멈춤 상태(paused) : 현재 액티비티의 일부가 약간씩 보이는 경우
- 정지 상태(stopped) : 액티비티는 배경에 위치
중요한 콜백 메소드
- onCreate()
- 액티비티가 생성되면서 호출
- 중요한 구성요소들을 초기화
- onPause()
- 사용자가 액티비티를 떠나고 있을 때, 이 메소드 호출
- 그 동안 이루어졌던 변경사항 저장
728x90