티스토리 뷰
[Android] Activity & Intent (feat. Package Manager, Activity Manager)
ch4njun 2019. 7. 29. 18:10액티비티 ?
안드로이드의 4대 Component로 그냥 단순하게 눈에보이는 화면이라고 생각하면된다.
하나의 Application 에서 하나의 Activity만 사용하는 것이 아니다. (화면 전환 가능)
이 때 하나의 액티비티 A에서 액티비티 B로 넘어갈 때 데이터를 전달해주는 역할을 하는 것이 인텐트이다.
어떻게 A Activity가 B Package명과 B Activity명만으로 B Activity를 실행시킬 수 있는가?
- 시스템 서비스인 Package Manager, Activity Manager 를 사용하기 때문에 가능하다.
Package Manager : App을 설치, 삭제를 담당한다. 또한 설치된 모든 Package 정보를 수집한다.
(AndroidManifest.xml 파일의 내용을 기반으로 설치시점에 수집된다.)
- Sdk Version이 맞지 않거나, 이미 설치된 경우 다운로드 하지못하게 관리하는 역할 수행.
Activity Manager : 안드로이드의 4대 Component를 관리하며,
그중에서 Activity를 실행하는 기능도 담당한다.
- A Activity는 Inent를 작성해서 Activity Manager에게 전달하게 된다. (startActivity(intent))
- Activity Manager가 하는일은 Intent 정보를 추출해 Package Manager에게 전달한다.
- Package Manager은 전달받은 정보를 통해 설치된 Package인지 확인하고, 존재한다면 실행할 Activity 정보를 Activity Manager에게 전달하게 된다.
- 제공 받은 Activity 정보를 통해 해당 Activity를 실행하고 Intent도 B Activity에 전달한다.
Q. Activity 실행후에 역할이 끝났는데 왜 실행한 Activity에 Intent를 전달해야할까요?
A.
Intent는 실행할 Activity 정보, 실행할 Activity에 전달할 특정 Data를 포함하게 된다.
따라서 Activity를 실행한 후에도 이 Intent를 새로 실행된 Activity에게 반드시 보내야한다.
인텐트(Intent) ?
컴포넌트(액티비티, 서비스)간의 통신을 위해 주고받는 메세지 또는 데이터 덩어리.
인텐트의 생성자 ?
Intent()
Intent(Intent O)
Intent(String action, [, Uri uri])
Intent(Context packageContext, Class<?> cls)
Intent(String action, Uri uri, Context packageContext, Class<?> cls)
새로운 액티비티 실행하기
startActivity(intent); // 이런식으로 새로운 액티비티를 실행.
// 이 때 intent에 어떤 Activity를 실행할지와 데이터를 저장한다.
Intent intent = new Intent(getApplicationContext(), 액티비티명.class);
Intent intent = new Intent();
intent.setComponent(new Component(getApplicationContext(), 액티비티명.class));
intent.setComponent(new ComponentName("com.superdroid.test.activity.b", "com.superdroid.test.activity.b.BActivity"));
Intent intent = new Intent(MainActivity.this, 액티비티명.class);
Intent intent = new Intent(this, 액티비티명.class);
위와같이 여러가지 방법으로 intent생성과 실행시킬 Activity 지정을 할수있다.
( 위에 방법들은 굉장히 중요한 내용들이므로 꼭 기억하자. )
생성된 인텐트에 데이터를 집어넣을 때는 아래와 같은 함수들을 사용한다.
intent.putExtra("name", data);
반대로 추가실행된 액티비티에서 intent로 전달받은 데이터를 꺼낼때는 아래와 같은 함수들을 사용한다.
Intent intent = new Intent(this.getIntent());
// Intent intent = this.getIntent();
intent.getStringExtra("name");
→ 이와같이 데이터를 꺼낼때는 데이터형을 명시해줘야 한다.
새로 실행시킨 액티비티의 종료값을 돌려받고 싶을 때.
onActivityResult(int requestCode, int resultCode, Intent data){
switch(requestCode){
case ACT_EDIT:
if(resultCode == RESULT_OK)
.......
}
}
실행시킨 액티비티쪽에서는
setResult(RESULT_OK, intent);
finish();
이와같이 해주면 정해준 결과값이 전달된다. 물론 데이터도 전달된다.
'Android > Concept' 카테고리의 다른 글
[Android] Bundle (0) | 2019.07.29 |
---|---|
[Android] 명시적 인텐트 & 암시적 인텐트 (0) | 2019.07.29 |
[Android] 이벤트 별쾅쾅. (0) | 2019.07.19 |
[Android] View Attribute. (0) | 2019.07.16 |
[Android] Table Layout + Table Row (0) | 2019.07.16 |