2012년 12월 23일 일요일

공돌이식 연애 화법






오빠가 옛날에준 연애편지 보니까 euc-kr이더라…
Utf-8 로 다시써줘.

오빠.. 난 변수야 상수야. 난 대답을 들어야겠어.
변수면 이제 그만 shutdown -h now 해.

오빠. 저 별(*)이 내꺼라면 저게 날 가리키고 있는거야?
내 포인터란 소리지?

-. 어느 블로그에서 퍼온 글입니다.

2012년 12월 5일 수요일

Intent와 PendingIntent 이해하기





Intent와 PendingIntent 이해하기

PendingIntent도 일종의 Intent라고 생각해도 된다. 
그런데 Intent의 기본 개념은 특정 컴포넌트(Activity, Service, Broadcast Receiver, Content Provider)를 실행시키는 메시지라는 것이다.
역시 마찬가지로 PendingIntent도 Intent의 일종이므로 특정 컴포넌트를 실행시키는 기능을 한다는 것이다. 

그런데 PendingIntent는 생성자가 없고 
다음 세 개의 메소드들에 의해서 객체가 생성된다. 
getActivity(Context, int, Intent, int), 
getBroadcast(Context, int, Intent, int), 
getService(Context, int, Intent, int). 

그런데 이들 세 개의 메소드 중 어느 메소드에 의해서 생성된 PendingIntent 객체냐에 따라서 그 객체가 activity를 실행시킬지 서비스를 수행할지, 방송을 실행시킬지가 결정된다는 것이다.

다음은 Intent에 대한 설명이다. 이 설명을 보면 PendingIntent와 개념상 매우 유사함을 볼수가 있다.
Three of the core components of an application - activities, services, and broadcast receivers - are activated through messages, called intents. 
⇒ 안드로이드 애플리케이션에는 3개의 핵심 컴포넌트가 있는데 activities, services, and broadcast receivers이다.그런데 이들을 실행시키는 것은 메시지에 의해서 이루어지는데 바로 그 메시지를 intent라 한다.

Intent messaging is a facility for late run-time binding between components in the same or different applications. 
The intent itself, an Intent object, is a passive data structure holding an abstract description of an operation to be performed - or, often in the case of broadcasts, 
a description of something that has happened and is being announced. 
There are separate mechanisms for delivering intents to each type of component:

ㆍAn Intent object is passed to Context.startActivity() or   
   Activity.startActivityForResult() to launch an activity or get an existing 
   activity to do something new.
   ⇒ 이건 Intent가 Activity를 실행하는 용도로 쓰인다는 뜻이다.

ㆍAn Intent object is passed to Context.startService() to initiate a service 
   or deliver new instructions to an ongoing service. Similarly, an intent 
   can be passed to Context.bindService() to establish a connection 
   between the calling component and a target service.
   ⇒ 이건 Intent가 서비스를 실행하는 용도로 쓰인다는 뜻이다.

ㆍIntent objects passed to any of the broadcast methods (such as
   Context.sendBroadcast(), Context.sendOrderedBroadcast(), or
   Context.sendStickyBroadcast()) are delivered to all interested 
   broadcast receivers.
   ⇒ 이건 Intent가 BR(방송)을 실행하는 용도로 쓰인다는 뜻이다.

이렇게 Intent가 Activity, Service, Broadcast Receiver를 수행하는 기능을 하듯이 PendingIntent도 PendingIntent 객체를 생성하는 세 개의 메소드가
getActivity(Context, int, Intent, int), 
getBroadcast(Context, int, Intent, int), 
getService(Context, int, Intent, int)인데 이들 각각은 순서대로 
activity를 실행, 
Broadcast Receiver를 실행, 
서비스를 실행시키는 용도로 PendingIntent 객체가 생성된다는 것이다.

즉 PendingIntent 객체가 getBroadcast(Context, int, Intent, int)에 의해서 생성되었으면 그 PendigIntent 객체로는 방송을 실행한다는 것이고 getActivity(Context, int, Intent, int)에 의해서 생성된 PendingIntent 객체는 activity를 실행시킨다는 것이다. 
어느 메소드에 의해서 객체가 생성되었느냐에 따라서 PendingIntent객체가 실행하는 컴포넌트가 달라진다는 것이다.

public static PendingIntent getBroadcast (Context context, int requestCode, Intent intent, int flags)
⇒ Retrieve a PendingIntent that will perform a broadcast, like calling
   Context.sendBroadcast().

context : The Context in which this PendingIntent should perform the 
                 broadcast.
requestCode : Private request code for the sender (currently not used).
intent : The Intent to be broadcast.
flags : May be FLAG_ONE_SHOT, FLAG_NO_CREATE, 
             FLAG_CANCEL_CURRENT, FLAG_UPDATE_CURRENT, or any of 
             the flags as supported by Intent.fillIn() to control which 
             unspecified parts of the intent that can be supplied when the 
             actual send happens.
Returns : Returns an existing or new PendingIntent matching the given 
                 parameters. May return null only if FLAG_NO_CREATE has 
                 been supplied.

요약하면 Intent는 Activity, Service, BR을 실행시키는 message이다. PendingIntent도 일종의 Intent인데 이것의 객체가 getActivity()에 의해서 생성된 것이면 그 PendingIntent 객체는 Activity를 실행시키고 getBroadcast()에 의해서 생성된 객체이면 그 객체는 방송을 실행시킨다.

방송을 내 보낼때 어떤 컴포넌트에게 내보내는지는 Intent가 특정 컴포넌트를 호출하는 기능(명시적, 암시적 호출)이 있으므로 Intent의 이 기능을 PendingIntent가 활용해서 특정 컴포넌트에게 방송을 내보낸다.

이때 특정 컴포넌트가 방송을 수신할 수 있기 위해서는 Menifest에 방송 수신에 대한 정보를 기록해 두어야 한다.