-
액티비티 ActivityAndroid 2019. 7. 1. 21:36
액티비티 개념
액티비티는 앱의 화면을 담당한다
하나의 액티비티는 java파일(제어) + xml파일(뷰) 로 이루어진다
액티비티 스택(Activity Stack)에 액티비티가 쌓인다
뒤로가기를 누르면 현재 액티비티가 스택에서 빠지고 이전 액티비티를 띄움
홈키를 눌러도 액티비티 스택은 사라지지 않는다
안드로이드 스튜디오 프로젝트 생성시 초기 MainActivity
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //뷰 활성화 } }Activity 클래스(android.app.Activity) : 해당 OS 버전의 기본 라이브러리 액티비티 클래스
그의 서브클래스
FragmentActivity(android.app.support.v4.app.FragmentActivity) : 과거 버전 호환성 유지 + 프레그먼트를 사용할때
AppCompatActivity(android.app.support.v7.app.AppCompatActivity) : 과거 버전 호환성 유지 + 새로운 버전 기능도 사용가능. 안드로이드 6.0의 새 기능이 구현되어 있어 안드로이드 스튜디오는 프로젝트 생성시 해당 클래스로 자동 생성
setContentView() : 레이아웃 xml의 내용을 파싱하여 뷰를 생성
onCreate() 에서 실행함
인자로 레이아웃 리소스 ID 지정
액티비티 생명주기 메소드
onCreate(Bundle savedInstanceState) : 액티비티가 최초로 생성될때 호출
여기서 초기화작업 수행
동적상태정보는 직전에 소멸된 동일한 액티비티 인스턴스의 정보(일반적으로 UI의 상태와 관련된 데이터)
onRestart() : 액티비티가 런타임 시스템에 의해 중단되었다가 다시 시작될때 호출
onStart() : onCreate나 onRestart가 호출된 후 바로 호출. UI가 곧 사용자에게 보이게 될때
onResume() : 액티비티가 액티비티 스택 맨 위에 있고, 사용자가 현재 실행중인 액티비티일때 호출(현재 화면에 보이고있는 액티비티)
onPause() : 사용자와 상호작용 중단. 이 메소드 호출후 onResume()이나 onStop()이 호출됨. 액티비티가 포그라운드로 돌아가는 경우 계속 실행하기 위해 onResume() 호출. 액티비티를 사용자가 볼수없게되면 onStop() 호출
onStop() : 액티비티가 화면에서 사라짐. 이 메소드 호출후 onRestart() 또는 onDestroy() 가 호출됨
다시 포그라운드로 돌아가면 onRestart. 액티비티가 종료되면 onDestroy
onDestroy() : 액티비티 종료될때 호출. 액티비티가 막 소멸되려하거나 자발적으로 소멸될때 호출. 액티비티에서 finish() 메서드를 호출했거나 메모리를 해제하거나 구성 변경이 생겨 런타임이 액티비티를 종결하는 경우. 종료될때 항상 onDestroy()가 호출되는건 아님
*위의 메소드는 오버라이드시 해당하는 super 클래스의 메소드를 호출해야함
ex) onCreate 오버라이드시 super.onCreate 호출
액티비티 동적상태 저장 및 복원
onRestoreInstanceState(Bundle savedInstanceState) : 상태정보가 저장된 이전 액티비티 인스턴스로부터 액티비티가 다시 시작하는 경우 onStart() 메소드 호출후 바로 호출. Bundle객체는 이전 상태에 대한 정보가 있음
onSaveInstanceState(Bundle outState) : 현재의 동적 상태 데이터가 저장될 수 있도록 액티비티가 소멸되기 전에 호출
여기서 동적 상태 데이터는 대부분 UI와 관련된 값들. Bundle 객체에는 저장되어야 하는 상태(데이터)를 추가
이 Bundle 객체는 onCreate()나 onRestoreInstanceState() 메서드에 전달됨. 동적 상태 데이터가 저장될 필요가 있음을 런타임이 알고있을때만 이 메소드가 호출됨
기본적인 생명주기 순서
- onCreate > onStart > onRestoreInstanceState > onResume > onSaveInstanceState > onPause > onStop > onDestroy > 액티비티 종료
- onStop > onRestart > onStart
액티비티가 소멸되고 다시 생성될때 호출순서
- onSaveInstanceState(여기서 액티비티 상태 저장) > onPause > onStop > onDestroy > onCreate > onStart > onRestoreInstanceState (여기서 액티비티 상태 복구) > onResume
Foreground : onResume ~ onPause : 액티비티가 실행중임
Visible : onStart ~ onStop : 사용자에게 액티비티를 보여줄수있는 상태
명시적 인텐트로 다른 액티비티 전환(호출)
*액티비티 추가시 AndroidManifest.xml에 Activity정보를 추가해야함
<application> 하위에 추가
<activity android:name=".액티비티이름" />*안드로이드 스튜디오는 생성시 자동으로 추가해줌
*명시적 인텐트
Intent에 컴포넌트 이름을 지정하여
해당 컴포넌트를 호출하는 방식
새 화면 띄우기 2가지
- startActivity(intent)
해당 인텐트에 설정된 Activity로 화면이 전환됨. (Intent는 뒤에서 설명)
- startActivityForResult(intent, int 요청코드)
화면전환 + 원래 화면으로 돌아올때 호출된 액티비티의 결과를 원래 액티비티에서 사용하고싶은 경우 사용.
요청코드 : 새로띄운 여러 액티비티 중 어떤것에서 온 응답인지 구분하기 위해 사용
데이터 전달 : Intent 객체
각 컴포넌트는 Intent객체를 통해 데이터를 주고받는다
- 생성자
public Intent (Context packageContext, Class<?> cls)Context : 현재 컴포넌트의 정보가있는 Context 객체
Class : 호출할 컴포넌트(클래스이름.class)
- 인텐트 생성 및 액티비티 지정하기
Intent intent = new Intent(this, 액티비티이름.class) //this는 자기자신(객체) 참조깂 또는 Intent intent = new Intent(getApplicationContext(), 액티비티이름.class)*안드로이드에서 Context란?
어떤 Activity인지. 또는 어떤 Application인지에 대한 정보
Intent 메소드
값 집어넣기(value는 아무거나 가능)
- putExtra(key, value)
값 얻기
- getExtra(key, value) : String,int, List 형태 일때
- getSerializableExtra() : value가 클래스의 객체 일때(해당 클래스명으로 형변환)
*클래스를 주고받을경우 해당 클래스가 Serializable 클래스를 implements 해야함
- getExtras() : Extra 전체 얻기
- getString(key) : String 으로 얻음 그외 getInt, getFloat 등
값얻기 예시
String data = getIntent().getExtras().getString("키이름")호출된 액티비티에서 결과 넘기기
setResult 메소드 호출
setResult(RESULT_OK, intent); //setResult(결과코드, Intent객체) finish(); //액티비티 종료. 원래(이전) 화면으로 복귀원래 액티비티에서 결과를 받아 처리하기
onActivityResult 메소드 구현
@Override protected void onActivityResult(int 요청코드, int 결과코드, Intent 데이터) { //처리코드 }
암시적 인텐트로 다른앱의 액티비티 호출
같은앱의 액티비티뿐만 아니라 다른앱의 액티비티도 호출 가능하다
Intent를 설정하는 방법만 다를뿐 startActivity 등으로 호출하는건 같다
*암시적 인텐트
Intent에 속성을 지정해서 해당 속성에 맞는 컴포넌트를 호출하는 방식
일치하는 컴포넌트가 여러개면 사용자가 선택할 수 있는 창을 띄움
속성 해석은 각 앱의 AndroidManifest.xml 중 <intent-filter> 를 참고한다
각 액티비티에 자신이 처리할 수 있는 작업을 intent-filter에 기재한다
(명시적 인텐트를 받는데는 intent-filter 필요X)
AndroidManifest.xml 내용예시
<activity android:name=".MainActivity"> <intent-filter> <!-- 이곳에 속성 추가 --> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>속성 추가는
원하는 액티비티의 <intent-filter> 하위에 추가
자세한 내용은 인텐트 필터 참고
기존 전화앱 액티비티 띄우기 예시
//전화번호는 원하는 번호로 Intent intent = new Intent(Intent.ACTION_DIAL, Uri.Parse("tel:01012345678")); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } 또는 Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.Parse("tel:01012345678")); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); }ACTION_DIAL : 전화번호를 입력하는 동작 (전화거는건 ACTION_CALL)
둘다 전화번호(데이터) 를 설정해야함
*암시적 인텐트를 처리할 수 있는 앱이 없으면 호출실패로 작동이 중단된다
resolveActivity 를 호출하고 반환값이 null이 아닌 경우 startActivity 를 호출하는 것이 좋다
Intent 메소드
addCategory
setType
확장 컴포넌트 : 특정 앱에서 다른앱의 액티비티를 호출할 수 있는것
액티비티 상태 저장
액티비티는 단말의 방향만 바뀌어도 소멸되고 다시 생성된다
그러면 원래의 상태가 사라지므로 저장해야한다
AndroidManifest.xml
<activity android:name="ClassEdit" android:configChanges="orientation">혹은 해당 액티비티 xml파일의 속성창에서 설정
그러면 현재 상태를 유지한채로 onConfigurationChanged 만 호출됨
참고 > 프레그먼트
'Android' 카테고리의 다른 글
안드로이드 매니페스트 (AndroidManifest.xml) (0) 2019.07.03 Intent 인텐트, 인텐트 필터 정리 (0) 2019.07.03 앱 호환성 build.gradle (0) 2019.07.01 뷰 속성 (0) 2019.06.24 안드로이드 프로그래밍 (0) 2019.06.18