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"?>
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상태를 감지하여 새로운 문자 어플을 만든다거나 아니면 서비스를 이용하는데 휴대폰 배터리가 다 되어서 종료되었다가 다시 휴대폰을 켰을 때 자동으로 서비스를 다시 구동시켜야 한다거나 등등)
댓글 없음:
댓글 쓰기