Loading presentation...

Present Remotely

Send the link below via email or IM

Copy

Present to your audience

Start remote presentation

  • Invited audience members will follow you as you navigate and present
  • People invited to a presentation do not need a Prezi account
  • This link expires 10 minutes after you close the presentation
  • A maximum of 30 users can follow your presentation
  • Learn more about this feature in our knowledge base article

Do you really want to delete this prezi?

Neither you, nor the coeditors you shared it with will be able to recover it again.

DeleteCancel

Make your likes visible on Facebook?

Connect your Facebook account to Prezi and let your likes appear on your timeline.
You can change this under Settings & Account at any time.

No, thanks

Android_app_intent

데이터 전송을 위한 Serializable, parcelable, intent
by

대희 장

on 25 June 2015

Comments (0)

Please log in to add your comment.

Report abuse

Transcript of Android_app_intent

bundle, intent Android App 개발 객체 직렬화(Serializable) Parcel 객체 Parcelable 객체 intent 란? Bundle 객체 Activity componet
에서 intent 활용 intent 상세 직렬화의 기본 개념은 아주 간단하다. 프로세스간 데이터(객체 포함)를 전달하는 목적.
Serializable의 개념과 크게 다르지 않다. Parcelable 객체는 데이터에 대한
조립과 분해를 쉽게 하도록 도와준다.
다른 의미로 특정 객체 자체를 저장할 수
있도록 도와준다. 간단한 객체를 직렬화 시키는 유용한 객체 Component에서 ActivityManager에게 특정 Component를 실행해 달라고 요청하는 과정에서
ActivityManager에 의해 실행될 Component의 정보

즉, Intent는 활성화 될 Component의 정보 그 자체 Intent를 작성하고 ActivityManager를 통해
Comonent를 활성화 하는 방식이 두가지가 존재 intent 정보 구성 요소 9가지 안드로이드 은하력 5년... 고집불통인 Windows 공화국과 BlackBerry 무역연합의
전쟁은 모두에게 멸망을 안기고 말았다. 새로이 나타난 iPhone 제국은 강력한 포스로 횡포를 부리게 되고,
모바일 은하는 공포에 떨게 되었다. Open 가치를 내세운 반란군 리더 Google은 Android 연합을 맺어 이에
맞서게 된다.
Android 연합군은 HTC , 모토롤라, 삼성, LG 등의 Component 들로
구성되어 점차 그 세력을 확장하게 된다. 함수는 신경쓰지 않고 단지 변수를 직렬화 시킨다. (byte 코드로 순차적으로 나열시킨다.) 1.직렬화 2.byte코드를 쓸 수 있다. 4. byte코드를 읽고 5.역직렬화 하면 됨 직렬화 방법은 "Serializable" 을 상속 직렬화 객체내에 또 다른 객체를 포함하는 경우
포함되는 객체 또한 "Serializable"을 상속 자동으로 직렬화 해준다. "Serializable" 객체가 뭐냐? 직렬화 Class를 생성할때 꼭 지켜야할 조건 1. 송신측과 수신측에
동일한 Class 존재

2. 패키지명 동일

3. Serializable을 상속

4. serialVersionUID를
선언하고 같은 값 유지
(버전이다.) 직렬화한 데이터 그 자체 : 꾸러미 Parcel 객체 Parcel 객체는 Serializable하게 데이터가 저장 읽을 때, 순차적으로 읽는다.
so, 순서, 내용을 모르면 꽝!!! Parcel 객체 사용 예 생성 & 변수넣기 넣어던 데이터를 하나씩 꺼내서 화면에 출력 그래서 필요한게 Parcelable !! 송신 수신 송신과 동일하게! 읽기 출력 결과 송신 : writeToParcel() 분해
수신 : createFromParcel() 조립 HashMap : 데이터를 Key와 값
으로 분리된 데이터 구조 Bundle 객체 생성
key + value Intent에 Bundle 객체를 실어 보내게 된다 편하지 않는가?
단지 전송하는 데이타별 Key값만 알고 있으면 된다.
Parcel 처럼 데이터의 전송 순서는 기억하지 않아도 된다. Bundle 이렇게 기본적인 Primitive Type
자료형을 전송하는데 아주 편리한 구조이다.
(Boolean, Byte, Char, Short, int, Long,
Float, Double, String, Parcelable,
각 Type Array...등 모두 지원) Intent 객체의 목적은
안드로이드 상에서 Component들을
활성화하고 제어하기 위한 규격화 된 정보
그 자체 패키지 A의 Component Acitivty에서
패키지 B의 Component들을 호출한다. intent에 담을 정보 Component 는 내 외부
다 된다. ActivityManager와
PackageManager를 포함한
Component 활성화 과정 Activity, Service,
Broadcast Receiver Intent에 각 Component가
어떤 정보를 실어 보내고,
그 정보를 받은
ActivityManager가
어떤 처리를 해서, Component가
활성화 되는지 알아 보자 1번에서 활성화할 Component의 정보 즉 Intent를 작성하고

2번에서 startActivity()등의 함수로 ActivityManager에게 활성화를 요청한다.

3번과 4번에서 활성화 될 Component 정보가 유효한지 그리고 활성화 하기 위한 Component의 패키지 정보를 PackageManager에 요청한다.

5번과 같이 PackageManager는 해당 Component 정보를 탐색하고 탐색된 Component 정보를 다시 ActivtyManager에게 전달한다.

6번에서 ActivityManager는 전달받은 Component 정보를 기반으로 해당 Component를 활성화 시킨다.

7번과 8번에서 해당 활성화 될 Component는 Intent정보를 넘겨 받고 드디어 활성화 된다. 활성화할 패키지명과 Component명을 정확히 지칭하여 Component를 활성화하는 방법이다.
이를 Explicit(명시적) Intent라고 한다. 순수하게 활성화 할 Component의 동작 만으로
원하는 Component 활성화를 요청하는 경우이다.

사용자에게 선택된 Component를 활성화 시켜 준다.
이런 방식을 Implicit(암시적) Intent라고 한다. 사전적 의미 : 목적, 의도 불려지는 App 패키지 명 : com.test.ActivityCallee
Component 명 : com.test.ActivityCallee.ActivityCallee 호출하는 App ComponentName 이라는 객체는 Component의 기본 정보를 가진다. 결과 불려지는 App <action android:name="android.intent.action.TEST1"> 호출하는 App 결과 그렇다면... 호출하는 App -> 아까랑 같지만... Intent에 Action을 추가 활성화 될 패키지 정보가 없어도 된다??? 불려지는 App에 같은 Activity Component
를 추가해 보자. intent-filter 에 동일한 action 을 추가하고... 결과는... 구글을 찬양하라!!! 명시적 intent 결정 요소 1. mComponent 활성화 될 Component 정보를 말하며, 이 항목 자체가 명시적 Intent를 의미한다.Component 에 대한 정보를 담는 객체는ComponentName 이다.
ComponentName 객체에는
- Package Name , - Class Name 2. 명시적 Intent 전달 데이터 1) mExtras : DataType은 Bundle
넣기 : putExtra( "Key 값", "전달할 자료형 값");
빼기 : getBooleanExtra( "Key 값", "해당 Key 값이 없다면 Default값");
getIntExtra("Key 값", "해당 Key 값이 없다면 Default값");
getStringExtra("Key 값"); 2) mData : DataType 은 Uri (Uniform Resource Identifiers)
정보가 있는 위치를 정의한다. Uri 객체 셈플... 3) mType : 위에서 나왔던 Data(Uri)의 Type을 말하는 것이다. "[Type]/[Type Value]" 두가지를 같이 사용할때는 꼭 setDataAndType()함수를 이용 암시적 intent 결정 요소 1. mAction 활성화 할 Component의 동작을 설정한다. 2. mCategories Category는 Action의 추가적인 설명 혹은 범주,분류 셈플... 3. mData와 mType 데이터 전달을 목적으로 한다. 명시적intent 데이터와 같다.

추가된 것은 <Intent-filter> 역할도 한다는 것이다.
즉 <action>과 <category>와 마찬가지로 활성화 할
Component를 결정하는 역할도 한다는 것이다.

활성화 조건을 추가한다고 생각하면 된다. 불려지는 아이 부르는 아이 : 모두 맞춰서 호출!! vs setComponent 드디어 안드로이드 은하력 3년만에 iPhone 제국을 궁지로 몰아 넣는데...
하필 각 연합군들간의 의사소통에 문제가 발생하여 고민에 빠진다.

이에 각 Android 연합군은
각 Component 간 통신을 위해 직렬화를 시작하게 된다... 객체는 메모리에 존재하는 것이다. (new 를 통해 객체 생성된 것들)
이렇게 메모리에 존재하는 것을 파일 혹은 네트워크를 통해
저장 및 전송할 수 있을까?
객체 자체는 함수와 변수들이 존재하고
함수와 변수는 메모리의 다른 영역에 저장된다. (함수 : code 영역 , 변수 : heap영역)
이것을 그대로 파일/네트워크 등으로 전송/저장 한다는 것은 쉽지 않다.

직렬화는 함수는 신경쓰지 않고
단지 변수를 직렬화 시킨다. (byte 코드로 순차적으로 나열시킨다.) "Serializable"이라고 마킹해 두면 시스템 내부적으로 객체를 직렬화 시켜 저장한다. 각기 다른 Process들은 그 Process내 메모리를 공유할 수 없다. IPC(Inter Process Communication)란 기법을 사용하여야 한다.
Android 에서는 Open Binder라는 드라이버를 통해 적용된다. (Service에서 다시 언급하겠다.)
IPC는 byte stream 전송이 가능하므로 직렬화가 필요한 것이다. 송신 송신 수신 수신 송신측 패키지 코드를 복사 아직 Intent에 대해 배우지 않았으므로빨강생 코드만 이해하자. 송신측 Activity에서 지금 작성한 수신측 Activity를 호출할 것이다.
송신측에서 수신측 Activity를 호출할 때 intent 객체를 넘겨 준다.
intent 객체내에는 직렬화 객체가 들어가 있다.
수신측에서는 이 객체를 읽어들여 객체의 내용을 출력한 과정이다. 일단 전에도 설명했듯 Process간에는 메모리를 공유할 수 없다.그러므로 위 그림과 같이 메모리 공유가 가능한 커널의 공유 메모리를 이용하여야 한다. Process간 전달한 데이터를 묶는 데이터 컨테이너 Parcel은 송신측에서 수신측으로 전달되는 데이터를 저장하는 용도이다.(IPC 통신은 최대한 고속으로 이뤄져야 한다. 그러므로 전달되는 데이터는
IPC 통신이 신속히 이뤄질 수 있도록 최적화 되어야 하고
고성능 IPC 전송을 가능케 하는 데이터가 바로 Parcel이다.) 송신 수신 명시적 intent 암시적 intent
Full transcript