레이블이 Android인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Android인 게시물을 표시합니다. 모든 게시물 표시

2012년 5월 19일

안드로이드 : Tab 구현 하기




안드로이드 플렛폼에서 Tab은 다음과 같은 3가지 요소로 이루어 진다.
  • TabHost: TabWidget(Tab 버튼 모음)과 FrameLayout을 포함하는 전체 컨테이너
  • TabWidget: Tab 버튼 모음을 나타내며 각각의 Tab 버튼은 text + icon (옵션)으로 이루어 진다.
  • FrameLayout: 선택된 Tab에 따른 실제 내용(Tab content)를 위한 컨테이너. 모든 Tab content는 FrameLayout의 child임.


위에 설명한 3개의 component를 사용해 정상적으로 작동하는 Tab을 구성하기 위해서는 다음과 같은 몇 가지 숙지해야 할 사항들이 있다.
  • TabWidget의 id와 최소높이: TabWidget의 id는 항상 "@android:id/tabs"로 설정 하여야 한다. 또 TabWidget의 최소 높이는 약 62px이다. 다시 말하면 Tab 버튼은 text + icon(옵션)으로 구성되는데 text로만 구성된 Tab 버튼도 무조건 62px정도의 높이를 차지한다. 물론 사용하는 icon에 따라 더 커질 수는 있다. (너무 작은 tab은 조작이 힘들어서가 아닐까 싶다)
  • FrameLayout의 Padding: TabHost는 FrameLayout에서 상속되며 FrameLayout에서 child view들은 어떤 layout을 사용하던 FrameLayout의 좌측 상단에 배치된다(여러 child view가 있다면 제일 마지막에 배치된 child view가 나머지 view를 가려버림). 그래서 FrameLayout이 TabHost내부에 배치될 때 TabWidget을 고려하지 않고 무조건 TabHost의 최 상단에 배치 되어 TabWidget을 가려버린다. 그럼으로 사용된 TabWidget의 높이만큼 FrameLayout위쪽에 padding을 주어야 한다. (TabWidget의 최소 높이가 62px임으로 최소 padding도 62px)
  • TabActivity 사용: TabActivity상속 받아 Activity를 구현 할 때(Tab 자체가 Activity의 main 화면일 때) TabHost의 id는 항상 "@android:id/tabhost"로 설정 하여야 한다.


추가로, Java 코드에서 XML에 선언된 여러 컴포넌트를 연결해서 정상적으로 작동하는 Tab view를 만들려면
TabHost객체의 내부객체인 TabHost.TabSpec이라는 Tab building helper 객체를 이용하여야 한다.
TabHost에 새로운 Tab을 추가하는 것은 다음과 같이 5단계로 나뉜다.
  • TabHost setup 시작: findViewById 메소드를 통해 TabHost인스턴스를 얻은 후 TabHost인스턴스에 Tab을 추가하기 위해서는 반드시 TabHost인스턴스.setup() 메소드 먼저 실행 해야함. (단, TabActivity를 사용해 구현된 Tab은 setup 필요 없음)
  • helper 생성: TabHost인스턴스.newTabSpec(String형 tag이름)를 사용해 helper 객체를 생성 (추후 생성시 지정한 'tag 이름'으로 다시 소환 할 수 있음.)
  • Tab button의 text 지정: helper인스턴스.setIndicator(String / String+Icon / View)를 사용해 Tab Button의 형태를 지정.
  • Tab content 지정: helper인스턴스.setContent(View ID / TabContentFactory / Intent)를 사용해 Tab content를 지정. (TabContentFactory와 Intent는 추후 설명)
  • TabHost에 Tab객체 등록: TabHost인스턴스.addTab(helper인스턴스)로 위에서 설정 완료(tag, indicator, content)된 Tab Building helper를 TabHost에 등록.


Static한 Tab 구현
그럼 지금까지 정리한 것을 바탕으로 static(compile-time시 형태가 결정되는) 한 Tab의 구현 예제를 보자.
Static Tab 예제 (main.xml)
소스 펼치기


Static Tab 예제 (MyTab.java)
소스 펼치기


다음은 실행 화면이다.


위에서 본 예제는 Complie-Time에 Tab view의 형태가 결정된다.
하지만 경우에 따라서 run-time에 tab이 추가로 생성되어야 할 경우도 있다.
이런 경우에는 TabHost.TabContentFactory라는 TabHost의 내부객체를 사용한다.
TabContentFactory 객체는 View createTabContent(String tag)라는 abstract callback method를 포함하며,
TabContentFactory 객체 생성 시 자동으로 호출되어 결과로 Tab content를 구성하는 View를 return한다.


Dynamic 한 Tab 구현
다음은 dynamic(run-time시 동적으로 형태가 변하는)한 Tab의 구현 예제 이다.
Static Tab 예제 (main.xml)
소스 펼치기


Static Tab 예제 (MyDynamicTab.java)
소스 펼치기


다음은 실행 화면이다. 첫 Tab의 버튼을 누르면 AnalogClock이 표시되는 Tab의 추가된다.

안드로이드 inflate LayoutInflater 에 관한 고찰


inflate 라는 단어는 본래 : 부풀리다 라는 뜻을 가진 단어 입니다.
안드로이드에서 "전개"라는 의미로 이해하면 될듯합니다.

INFLATION 의 기능은 
1. XML 문서에 정의된 레이아웃과 차일드 뷰의 속성을 읽어 실제 뷰 객체를 생성해 내는 동작.
2. 레이아웃의 정보대로 객체를 생성하고 속성 변경 메서드를 순서대로 호출 하는것.
이라고 나와있습니다.

Avtivity 화면에서 사용자 인터페이스를 정의한 XML 을 VIEW 해줘야 되는데,
이때 inflate 라는 메소드를 통해서 이러한 XML 리소스의 정보를 해석하여 뷰를 생성하고 루트뷰를 리턴합니다.

리턴된 루트뷰를 setContentView() 라는 메소드를 통해 보여줄 수 가 있습니다.
즉, 핵심은 XML문서를 통채로 사용할 수 없으니까, 컴파일된 리소스를 넘겨줘야 된다는 뜻으로 정리하면 될듯합니다.
그리고,
LayoutInflater 클래스의 용도는 XML 리소스를 전개하여 뷰 객체를 만듭니다.
onCreate() 내부에서 아래처럼 선언되는 두가지 방법은 동일합니다.
setContentView(R.layout.main);
setContentView(View.inflate(this, R.layout.main, null);

조금 더 들어가자면,
setContentView(R.layout.main); 와

LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = (View) inflater.inflate(R.layout.main, null);
setContentView(v);
동일하다고 볼 수 있겠지요...

즉, setContentView() 메소드가 실행되면 인자로 넘겨준 XML 파일을 파싱하여 하나하나 생성하게 됩니다.
그리고 Activity가 그 인스턴스화된 View들을 보여주게 됩니다.
inflate()메소드도 동일하다고 볼 수 있겠습니다.

현재 화면 View에서 터치하는 코드를 만든다고 칩시다...
뻑나는 표시가 없는 코드기에, 안심하고 빌드 시키면... 결과는 참담합니다.
생성한 View 가 아무것도 아니란 말이지요.





위 코드처럼 inflate 시켜주면, 이상없이 돌아갑니다.
안드로이드는 알면 알수록 복잡하고, 참 재밌는 녀석임에 틀림없습니다


LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  View v = (View) inflater.inflate(R.layout.cameradetailinfo, null);
  setContentView(v);
  v.setOnTouchListener(vTouchListener);

 }

 View.OnTouchListener vTouchListener = new OnTouchListener() {

  @Override
  public boolean onTouch(View v, MotionEvent event) {
   // TODO Auto-generated method stub

   if (event.getAction() == MotionEvent.ACTION_DOWN) {

    할일....
    return true;
   }
   return false;
  }
 };



  
  출처- http://blog.naver.com/green187/110103693779
cnfasdfl;kasdjflksd LayoutInflater 에 관한 고찰|작성자 미니187

안드로이드 Intent 그리고 PendingIntent 와 Intent Sender



안드로이드 인텐트 관련해서, 두 가지 신기한 클래스가 제공됩니다. 이름만 들어서는 그 쓸모가 무엇인지 애매한, PendingIntent 와 IntentSender 가 바로 그 주인공입니다. 개발자 사이트에 서술된 내용을 살펴보아도 두 가지가 하는일이 정확히 무엇인지, 그리고 특히, 둘 사이의 차이점이 무엇인지 좀 헷갈립니다. 두 가지 클래스는 어떤 역할을 수행하고, 어떤 차이점이 있으며, 안드로이드 어플리케이션을 개발할 때, 어떻게 유용하게 사용될 수 있는지 간단하게 정리해 보았습니다. 

1.PendingIntent
 PendingIntent 은 비교적 이해하기 쉽습니다. 커뮤니케이션에는 세 가지 기본 요소가 있습니다. 메세지, 송신자, 수신자. 인텐트는 메세지 입니다. 수신자는 해당 인텐트를 수신하기 위한 인텐트 필터를 갖고 있는 컴포넌트 입니다. 송신자는 인텐트를 보내기 위한 API (startActivity/startService 등)를 호출한 컴포넌트입니다. 

<부디 나쁜데 쓰지 말고 내가 시킨것만 잘 하시오...>

 PendingIntent 는 인텐트를 전송하고자 하는 '송신자'가 인텐트를 하나 생성한 후, 별 도의 컴포넌트에게 '이 인텐트를 나중에 나 대신 보내 주렴.' 하고 전달하고자 할 때 사용되는 클래스입니다. 즉, 내가 친구에게 은행 통장에서 돈을 대신 뽑아달라고 부탁하며, 뽑을 돈의 액수를 알려주고 (인텐트), 내 카드를 빌려주는 것과 비슷한 개념이라고 생각 할 수 있습니다. 당연히, PendingIntent 를 사용할 때는 내가 맡긴 카드가 악용되지 않도록, '권한' 문제에 관해서 신경을 기울일 필요가 있으며, 이와 동시에 안드로이드 플랫폼 상에서도 PendingIntent 의 권한 문제를 제어할 수 있는 API는 물론이고, 다양한 FLAG를 제공해 주고 있습니다. 


intFLAG_CANCEL_CURRENT이전에 생성한 PendingIntent 는 취소하고, 새롭게 하나를 만듭니다. (친구에게 예전에 빌려준 카드를 정지 시키고 새롭게 하나 신청합니다.)
intFLAG_NO_CREATE현재 생성된 PendingIntent 를 반환 합니다. (친구 보고 내가 빌려준 카드를 당장 가져와 보라고 요청합니다. 이 후에, 해당 카드를 회수 할 수도 있습니다.)
intFLAG_ONE_SHOT이 플래그를 이용해 생성된 PendingIntent 는 단 한번 밖에 사용될 수 없습니다. (일회용 카드)
intFLAG_UPDATE_CURRENT만일 이미 생성된 PendingIntent 가 존재 한다면, 해당 Intent 의 내용을 변경합니다. (친구에게 전화해서, 인출할 돈의 액수를 다시 알려줍니다.)

 따라서, 저는 의미적으로 'PendingIntent' 를 '위임된 인텐트' 라고 해석할 수 있지 않을까 생각합니다.  PendingIntent 는 여러가지로 유용하게 사용될 수 있는데(여러가지 이유로 특정 패키지만 사용가능한 컴포넌트를 다른 컴포넌트와 상호 작용시킬 필요가 있는 경우 등....)그 중에서도, 안드로이드 화면 상단에 위치한 'Notification Bar' 와 상호 작용하는 어플리케이션을 작성할 때 널리 사용됩니다.

 예를 들어, 인터넷 상에서 음악을 다운로드 받는 어플리케이션이 있습니다. 음악 다운로드가 진행 중일 때, 'Notification Bar' 에 진척 상황이 나타나도록 구현하였습니다. 그리고 다운로드가 완료된 후에 사용자가 해당 알림 정보를 클릭하면, 다운로드 완료된 음악이 재생됩니다. 얼핏 생각해보면 'NotificationBar' 가 특정 아이콘이 클릭되었을 때, 어떻게 알고 음악 재생 Activity 를 띄우는지 신기하게 여겨질 수도 있습니다. 이 과정은 우리가 'Notification Manager' 에게 특정 아이콘을 등록함과 동시에 해당 아이콘이 클릭되는 순간에 전달되어야 PendingIntent 를 넘겨 주기 때문에 가능합니다. 

public void setLatestEventInfo (Context context, CharSequence contentTitle, CharSequence contentText, PendingIntent contentIntent)


 위와 같이, Notification 클래스에는 해당 Notification 이 수행할 PendingIntent 값을 설정할 수 있도록 되어 있습니다. 즉, PendingIntent 를 잘 사용하면, 다른 컴포넌트들과 상호 작용할 때, 실재로 수행할 일 자체를 PendingIntent 를 통해 추상화 할 수 있음으로(음악을 재생해라... 라는 구체적인 명령 대신, 전달받은 PendingIntent 를 수행하라 식으로...), 보다 더 확장성있는 어플리케이션 컴포넌트를 구성할 수 있습니다.

2.IntentSender
 IntentSender 는 좀 애매합니다. 무엇보다도 IntentSender 가 사용되는 꼭 맞는 샘플 코드를 찾기가 어렵더군요. IntentSender 를 생성하는 방법도 조금 색다른데, PendingIntent 를 우선 생성한 뒤, getIntentSender() API 를 호출해야합니다. 처음에는 IntentSender 는 좀 더 추상화된 PendingIntent 가 아닐까 생각했습니다. (두 클래스 간의 직접적인 상속관계가 있는 것은 아니지만...)

 하지만, 여러가지 자료를 좀 뒤져보고 (내용은 거의 없지만...) 결정적으로 안드로이드 프레임워크 소스를 살펴본 결과 허무한 결론을 내리고 말았습니다. IntentSender 는 PendingIntent 의 쌍둥이 클래스 입니다. 말하자면, PendingIntent 에 비하면 조금 못난... 쌍둥이 동생이라고 할 수 있습니다. 위임 받은 인텐트를 전달 할 수 있다는 점에서는 PendingIntent 와 정확하게 동일하지만, PendingIntent 와 비교하면 사용하기가 좀 어렵고 결정적으로 '권한' 을 관리하기 위한 API 를 제공해 주지도 않습니다. 

[출처] 안드로이드 Intent 그리고 PendingIntent 와 Intent Sender|작성자 휴우
http://huewu.blog.me/110084228131

<서비스> bindService() flag??



BIND_AUTO_CREATE 플래그는  
bindService() 호출에 의한 바인딩이 존재하는 동안
그것의 대상이 되는 Service를 자동으로 생성합니다. 

이 플래그가 Service를 자동 생성하게끔은 하지만, 
즉 Service의 onCreate() 콜백메쏘드가 호출되게끔 하지만, 
Service의 onStartCommand() 콜백 메쏘드는 
여전히 startService()를 통한 명시적 호출에 의해서만 호출됩니다.

그리고 이 플래그를 사용하지 않아도(즉 플래그를 0으로 설정해도)
일단 bindService()를 호출해 놓으면, 
추후에 그것의 대상 Service가 생성될 때 bind 커넥션이 확립되고 
Service 내에 구현되어 있는 Bind Object 내의 메쏘드들을 호출할 수 있습니다.

이 플래그를 지정하는 것은, 시스템에게 bindService()를 호출한 프로세스 만큼 
중요하게, 그것의 대상이 되는 Service를 취급할 것을 지시하는 의미를 갖습니다. 
즉, 메모리가 부족해서 메모리를 확보하기 위해 제거할 프로세스를 선택할 때, 
그 Service에 바인드되어 있는 프로세스를 제거해야 하는 상황이 될 때에만 
해당 서비스도 제거될 수 있도록 설정하는 의미를 갖습니다.

이것은 안드로이드의 LowMemoryKiller의 작동메커니즘과 관련되어 있습니다.
예를 들어, bindService()가 Foreground Activity에서 호출되었다고 가정할 때,
이 컴포넌트를 보유한 프로세스는 Foreground Activity를 보유하고 있기 때문에
가장 높은 중요도로 관리됩니다. 
하지만 일반적으로 그것의 대상이 되는 Service를 보유한 프로세스의 중요도는 
Foreground Activity를 보유한 프로세스 만큼 중요하게 관리되지 않습니다.

하지만 이 플래그를 사용하게 되면  Service를 보유한 프로세스 역시 
bindService()를 호출한 프로세스와 동일한 중요도로 시스템에 의해 관리됩니다.

이것은 메모리가 부족한 상황에서 반복적으로 Service가 제거되었다가 다시 생성되는
상황을 방지하게 됩니다.

Braodcast Receiver






Android의 구성요소는 크게 Activity, Service, Content Provider, BroadCast Receiver 의 4가지로 나눌 수 있다.

그중에 이번에 다룰 것은 BroadCast Receiver이다.

브로드케스트 리시버는 Android 핸드폰에서 정말 중요한 역할을 담당한다고 할 수 있다. 예를 들어 핸드폰으로 문자나 전화가 올경우 모두 이 브로드케스트 리시버가 해당 액션을 캐치하고 이 액션(액션이 핸드폰에 도달하면 Android OS에서는 이를 휴대폰 내의 모든 어플리케이션에게 BroadCast 함)에 귀기울이고 있는 Receiver가 받아들여서 이 액션이 있었을 때의 행동을 정의하는 방법으로 사용이 가능하다.

쉽게 말해 SBS, KBS, MBC 등의 방송사가 있다. 이 각각 방송사는 계속 방송(BroadCast)를 하고 있다. 나는 무한도전 애청자여서 토요일 6시 30분에 MBC를 틀어서 무한도전을 시청했다. 이 때 방송사에서 보내주는 무한도전이라는 BroadCast를 시청자인 내가 Receiver의 역할을 한 것이다.

이 브로드케스트 리시버가 좋은 이유는 서비스의 경우에는 지속적으로 Background에서 돌아가고 있어 베터리 소모가 불가피 하다는 점과 또한 서비스는 언제 어떻게 왜 갑작스럽게 죽어버리는 경우도 있기 때문에 확실한 보장을 할 수 없다.

하지만 브로드케스트 리시버는 평상시에는 아무런 행동을 하지 않다가 OS가 전달해주는 브로드케스트가 있을 때 깨어나서 자기가 원하는 Intent(Action)가 있는지 잠깐 귀를 기울이고 있다면 그 때 필요한 행동을 하고 다시 휴면상태로 돌아간다는 점이 굉장히 효율적이다.

이러한 Android BroadCast의 Action의 종류에는 많은 것이 있다.

접기
android.intent.action.(Action_ 다음의 Constant)

ACTION_BOOT_COMPLETED : 부팅이 끝났을 때
-> RECEIVE_BOOT_COMPLETED permission 필요.

ACTION_CAMERA_BUTTON : 카메라 버튼이 눌렸을 때
ACTION_MEDIA_BUTTON
ACTION_DATE_CHANGED : 날짜가 변경되었을 때
ACTION_TIME_CHANGED 
ACTION_TIMEZONE_CHANGED : 시간대가 변경 되었을 때(로밍 등???)
ACTION_LOCALE_CHANGED
ACTION_GTALK_SERVICE_CONNTECTED
ACTION_GTALK_SERVICE_DISCONNECTED
ACTION_MEDIA_EJECT : external storage media를 eject 했을 때.
- external media storage 내용 다룰 때 함께 다루는 것이 좋다.
ACTION_MEDIA_MOUNTED : 아마... SDcard가 인식 되었을 때
ACTION_MEDIA_UNMOUNTED : 아마... SDcard가 인식이 해제 되었을 때
ACTION_SCREEN_OFF : 화면의 Off
ACTION_SCREEN_ON : 화면의 On
ACTION_AIRPLANE_MODE_CHANGED
ACTION_BATTERY_CHANGED
ACTION_BATTERY_LOW : 현재 Battery양이 적어 젔을 때
ACTION_BATTERY_OKAY
ACTION_CLOSE_SYSTEM_DIALOGS : user가 일시적으로 system dialog를 없애기 위해 사용.
ACTION_CONFIGURATION_CHANGED : 환경설정이 변경 되었을 때
ACTION_DEVICE_STORAGE_LOW
ACTION_DEVICE_STORAGE_OK
ACTION_MANAGE_PACKAGE_STORAGE : ACTION_DEVICE_STORAGE_LOW에 이어 정리하라는 broadcast
ACTION_DOCK_EVENT: 물리적 docking state가 변했을 때.
- EXTRA DOCK STATE에 현재의 dock state를 가지고 있음

ACTION_EXTERNAL_APPLICATIONS_AVAILABLE: external media에 있을 때
-EXTRA CHANGED PACKAGE LIST 에 list형태로 담김
- EXTRA CHANGED UID LIST 에 list 형태로 uid 담음.

ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE
ACTION_HEADSET_PLUG
ACTION_INPUT_METHOD_CHANGED
ACTION_MEDIA_BAD_REMOVAL
ACTION_MEDIA_CHECKING
ACTION_MEDIA_EJECT
ACTION_MEDIA_NOFS : external media는 있으나 호환되지 않는 file system을 사용할 경우.
ACTION_MEDIA_REMOVED
ACTION_MEDIA_SCANNER_FINISHED
ACTION_MEDIA_SCANNER_SCAN_FILE
ACTION_MEDIA_SCANNER_STARTED
ACTION_MEDIA_SHAED : USB mass storage와 연결되어 unmounted 되었을 때
ACTION_MEDIA_UNMOUNTABLE : external media는 있지만 mount는 불가능할 때
ACTION_NEW_OUTGOING_CALL : 사용자의 휴대폰에서 전화를 걸 때(Sender로 접근하여 전화번호를 가져 올 수 있음)
ACTION_PACKAGE_ADDED : 새로운 apk파일이 추가되었을 때(새로 어플을 설치할 때)
ACTION_PACKAGE_CHANGED : apk파일의 정보가 수정 되었을 때
ACTION_PACKAGE_DATA_CLEARED
ACTION_PACKAGE_INSTALL : 새로운 apk파일을 설치 할 때
ACTION_PACKAGE_REMOVED : apk파일(설치되어 있던 어플)을 삭제 할 떄
ACTION_PACKAGE_REPLACED
ACTION_PACKAGE_RESTARTED
ACTION_POWER_CONNECTED : 충전기에 연결 되었을 때(외부 전원이 들어 올 때)
ACTION_POWER_DISCONNECTED : 충전기와의 연결이 해제 되었을 때
ACTION_PROVIDER_CHANGED: 예) gmail에서 새 메일이 왔을 때?
ACTION_REBOOT
ACTION_SHUTDOWN
ACTION_TIME_TICK : 매분마다 받음
ACTION_UID_REMOVED : user id가 사라졌을 때
ACTION_UMS_CONNECTED: usb mass storage 모드로 들어갔을 때
ACTION_UMS_DISCONNECTED
ACTION_USER_PRESENT : 예) 키가드가 없어질 때?
ACTION_WALLPAPER_CHANGED
접기
이 외에도 굉장히 많은 것들이 존재하지만 전부 다룰 수 없기 때문에 Android Developer 에서 확인하시길... 영어로 되어 있지만 굉장히 잘 설명 되어있다;;


그렇다면 이러한 BroadCast Receiver는 어떻게 사용할까?
위에 있는 액션 중 Power 가 연결되었을 때와 해제 되었을 때에 대한 Action을 가지고 예제를 만들어 보았다.

Menifest 닫기
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.j2enty"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".BroadCastReceiverExample"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

    <receiver android:name="ReceiverExample">
    <intent-filter>
             <action android:name="android.intent.action.ACTION_POWER_CONNECTED"></action>
             <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"></action>
    </intent-filter>
       </receiver>
</application>
    <uses-sdk android:minSdkVersion="7"/>

</manifest>
Menifest 닫기

Menifest에서 해야 할일은 단순하다. 먼저 Activity를 추가할 때 처럼 receiver를 하나 추가한다.
그리고 그 안에 인텐트 필터를 갖고 있으며 인텐트 필터에는 사용할 엑션들이 들어간다.
이 두가지만 추가하면 menifest에서 추가 할 것은 없다.
(경우에 따라서 몇가지 Action들은 별도의 퍼미션이 필요한 경우가 있으니 유의하시길!!!)


접기
public class ReceiverExample extendsBroadcastReceiver
{
       private String ACTION1 = "android.intent.action.ACTION_POWER_CONNECTED";
       private String ACTION2 = "android.intent.action.ACTION_POWER_DISCONNECTED";
      
       @Override
       public void onReceive(Context context, Intent intent)
       {
             if(intent.getAction().equals(ACTION1))
             {
                   Toast.makeText(context,"Be received action aboutACTION_POWER_CONNECTED",1000).show();
             }
             else if(intent.getAction().equals(ACTION2))
             {
                    Toast.makeText(context,"Be received action aboutACTION_POWER_DISCONNECTED",1000).show();
             }
       }
}
접기

Menifest의 Application 탭에서 리시버를 추가한 경우 Activity를 추가하면 기본적으로 onCreate()가 추가되듯이 리시버에서는 onReceive()가 추가된다. 이 때 같이 넘어오는 인자로 context와 intent가 있는데 이 context를 이용하면 어플리케이션 Context를 사용할수 있고 이 를 이용해서 Toast창이나 다이얼로그 등을 띄울 수 있다. 또한 함께 넘어오는 intent에는 해당 액션이 들어있어 getAction()을 통해서 어떠한 액션인지 알아내고 내가 원하는 액션과 비교하여 맞다면 그 때 원하는 작업을 처리하는 식으로 구현이 가능하다.


파워를 연결하게 되면 토스트 창이 뜨는 것을 확인 할 수 있다.
(예제를 만들 때는 잊고 있었는데 USB를 제거하면 화면을 캡쳐할 수 없다는 것을 깜빡하고;; 그래서 파워연결이 끊겼을 때의 캡쳐화면은 보여주지 못하게 되었다;; 하지만 잘작동한다!!)

무튼 다양하게 제공되는 BroadCast 를 통해서 좀더 양질의 어플을 만들 수 있을 것으로 예상된다.
(게임이 실행 중에 전화가 왔을 경우 먼저 이 내용을 어플에서 인지하고 현재 게임의 상태를 미리 저장해둔 다거나, 아니면 SMS상태를 감지하여 새로운 문자 어플을 만든다거나 아니면 서비스를 이용하는데 휴대폰 배터리가 다 되어서 종료되었다가 다시 휴대폰을 켰을 때 자동으로 서비스를 다시 구동시켜야 한다거나 등등)