액티비티 실행과 인텐트(1)

·2021년 10월 15일
1

안드로이드

목록 보기
7/17

액티비티 실행

하나의 앱에서 다른 앱을 실행하는 상황

A앱에서 B앱을 킨다고 가정하자
이때 A앱에서 intent를 사용하여 B앱을 킨다
intent란? 컴포넌트 간에 통신을 위해 주고 받는 메시지 또는 데이터 덩어리
예제에서 생성되는 액티비티로 메시지를 전달하기 위해 startActivitiy의 인자로 전달됨

Intent intent = new Intent();
ComponentName componentName = new ComponentName("b앱의 패키지네임", "b앱의 액티비티");
intent.setComponent(componentName);
startActivity(intent);

어떻게 A액티비티가 B패키지명과 액티비티명만으로 B 액티비티를 실행할 수 있을까?
→ 그건 바로 시스템 서비스인 패키지 매니저와 액티비티 매니저가 있기 때문

패키지 매니저와 액티비티 매니저

패키지 매니저

앱을 설치하고 삭제하며, 설치된 모든 패키지 정보를 수집한다.
AndroidManifest.xml 파일의 내용을 기반으로 모든 패키지 정보를 수집한다.

액티비티 매니저

안드로이드의 4대 컴포넌트를 관리하며, 액티비티를 실행하는 기능도 가진다.


인텐트가 액티비티를 실행하고 역할이 끝났음에도 B액티비티에 전달하는 이유
→ 우편물로 비유될 수 있는 인탠트가 추가적인 정보를 담고 있을 경우에 이를 전달하기 위해서

서로 다른 프로세스는 데이터를 공유할 수 없다. 그런데 어떻게 인텐트를 목적지 액티비티에 전달했을까?
→ os의 일반적인 메모리 정책 : 한프로세스가 다른 프로세스의 메모리를 침범하여 접근할 수 없다.
→ 이유 : 다른 프로세스에 영향을 주어서 오동작을 야기하거나 보안 정보를 획득하는 것을 막기 위함
→ 다른 프로세스의 정보를 획득하기 위해서는? → IPC 공유 메모리 사용
→ 안드로이드에서는 IPC를 위해 Binder를 제공한다.
→ 이것을 통해서 두개의 앱이 데이터를 주고받는다.

프로세스 간 데이터 전달

Binder?

안드로이드에서 지우너하는 IPC 프로토콜(리눅스에서 메시지큐, shared memory 같은)

직렬화?

여러 데이터를 메모리에 직렬로 할당하는 동작


세 가지 Primitive 타입 변수를 전달한다고 가정하자
String, int, long 형 데이타를 보낸다고 가정할 때,
3가지의 데이터를 따로 보내게 되면 3번의 바인더 통신을 하게 되어 성능 저하가 발생함

프로세스간 직렬화를 통해서 데이터를 보내면 한번에 보낼 수 있어 성능 저하를 막을 수 있음

인텐트

사실상 데이터 덩어리에 불과하다. 클래스 내부적으로 특별한 기능이 존재하지 않는다는 의미이다
단순히 직렬화된 데이터 덩어리라고 볼 수 있다.

프리미티브 타입 직렬화 객체

프리미티브 탕빙의 변수 자체를 전달하는 경우는 드물고 대부분 변수들을 클래스 내에 정의하고 객체화한다.
이때 내부의 프리미티브 타입 변수들이 서로 연속된 메모리에 할당되지 않아 직렬화 객체가 될 수 없다.
→ 이를 위해 자바의 Serializable 인터페이스를 사용하면 된다.

클래스가 Serializable 객체만 상속 받으면 시스템상에서 직렬화를 하게 된다.
이때 serialVersionUID 를 통해 송수신 측 클래스가 동일한지 확인한다.
이렇게 정의만 하고 내용은 쓰지 않는 인터페이스를 마커인터페이스라고 한다.

A Actvitiy에서
SampleDate sampleData = new SampleData();\
sampleData.setIntData(123456789);
sampleData.setStringData("Serializable Object");
intent.putExtra("Sample_Data", sampleData);
startActivity(intent);
B Activity에서
Intent intent = getIntent();
SampleData sampleData = (SampleData)intent.getSerializableExtra("Sample_Data");
TextView receivedTxt = (TextView)findViewById(R.id.intent_sample_data);
reveivedTxt.setText("SampleData : " + sampleData.getIntData() + 
						"," + sampleData.getStringData());

자바의 Serializable 인터페이스를 상속받은 직렬화 객체

Serializable 활용

Serializable 인터페이스는 프로세스 간 통신을 위해서만 활용되는 것이 아닌 파일을 쓰거나 네트워크를 이용해 다른 단말기나 서버로 전송할 때 활용되기도 한다.

Parcel

안드로이드에서 IPC 전용 데이터로 사용하기 위해 만들어진 클래스
사용하기 불편하다

Bundle

번들 클래스 Parcelable 클래스를 상속받아 구현된 클래스
안드로이드 SDK 라이브러리에 포함되어 있기 때문에 클래스 파일 자체를 배포할 필요가 없다
Bundle은 키와 값 형식으로 사용한다.

A Actvitiy에서
Bundle bundleData = new bundleBundleData();\
bundleData.putInt("Int_Data", 123456789);
bundleData.putString("Str_Data", "Bundle String");
intent.putExtra("Sample_Data", bundleData);
startActivity(intent);
B Activity에서
Intent intent = getIntent();
Bundle bundleData = intent.getBundleExtra("Sample_Data");
TextView receivedTxt = (TextView)findViewById(R.id.intent_sample_data);
reveivedTxt.setText("SampleData : " + bundleData.getString("Str_Data") + 
						"," + bundleData.getInt("Int_Data"));
profile

0개의 댓글