2012년 4월 17일 화요일

[안드로이드] SD 마운트-탈착에 관한 인텐트



SD 카드에 관련한 작업을 하다보면 예외적인 상황을 고려하지 않을 수 없다. 작업중에 강제로 SD카드가 뽑히거나, USB 연결등으로 마운트 해제가 될수도 있기 때문이다. 그러한 경우 다행히 Broadcast가 날라 오므로 필요에 맞게 받아 처리 할 수 있다.
  • Intent.ACTION_MEDIA_MOUNTED
SD 카드가 마운트 되면 날라옴
  • Intent.ACTION_MEDIA_EJECT
SD 카드가 강제로 뽑히거나 유저가 마운트 해제 하였을때 날라옴
  • Intent.ACTION_MEDIA_UNMOUNTED
유저가 마운트 해제 하였을때 날라옴
  • Intent.ACTION_MEDIA_REMOVED
SD 카드가 장치에서 제거 되었을때 날라옴
  • Intent.ACTION_MEDIA_BAD_REMOVAL
유저가 마운트 해제 하지 않은체 SD 카드가 강제로 뽑혔을때 날라옴

실제로 SD카드를 강제로 뽑아 보면 다음 순으로 발생 함
Intent.ACTION_MEDIA_BAD_REMOVAL -> Intent.ACTION_MEDIA_EJECT

마운트 해제 하면 다음 순으로 발생함
Intent.ACTION_MEDIA_EJECT -> Intent.ACTION_MEDIA_UNMOUNTED

SD 카드를 새로 꼽으면 다음 순으로 발생함
Intent.ACTION_MEDIA_UNMOUNTED -> Intent.ACTION_MEDIA_MOUNTED
희안하게도 언마운트가 먼저 호출되니 처리시 주의가 필요함

참고로 위 인텐트들을 등록 할 때는 아래와 같이 Data scheme을 지정해 줘야 한다.
<receiver android:name=".TestBroadcastReceiver">
    <intent-filter>
        <action android:name="android.intent.action.MEDIA_EJECT" />
        <action android:name="android.intent.action.MEDIA_BAD_REMOVAL" />
        <action android:name="android.intent.action.MEDIA_MOUNTED" />
        <action android:name="android.intent.action.MEDIA_REMOVED" />
        <action android:name="android.intent.action.MEDIA_UNMOUNTED" />
        <data android:scheme="file"></data>
    </intent-filter>
</receiver> 

[안드로이드] 브로드케스트리시버 동적으로 등록/해지 하기

브로드케스트 인텐트를 받기 위해
보통 AndroidManifest.xml 파일에 리시버를 등록 하곤 한다.
이렇게 하면 해당 브로드케스트가 발생하면 항상 실행되게 되는데, 기능에 따라 On/Off 를 하고 싶을 경우가 있다.
뭐 그런 경우 브로드케스트 리시버에서 처리를 안해도 되지만 아예 꺼버린다면 여러모로 효율이 좋게된다.

* 먼저 브로드케스트 리시버를 등록 하는 법
// 인텐트 필터 생성
IntentFilter filter = new IntentFilter();
filter.addAction("com.hermina.broadcast.TEST");
// 브로드케스트 리시버 등록
registerReceiver(reciever, filter);
물론 reciever는 등록할 BroadcastReciever 이며
다룰 인텐트에 따라 필터를 좀더 명확 하게 설정할 수 있다.
filter.addCategory
filter.addDataType
filter.addDataScheme
* 해지 하는법
unregisterReceiver(reciever);

2012년 4월 3일 화요일

[안드로이드] 테마 적용 + 배경이 투명한 액티비티 만들기

안드로이드 ICS가 출시 되면서 Holo.Light 테마가 생겨 났다.
그러한 테마를 적용 하면서 투명 액티비티를 띄우면 투명 액티비티만 테마가 후리다;;;

인터넷에서 찾아 보면 투명 액티비티를 만드는 테마는 다음과 같다.
<activity android:name="Test" android:theme="@android:style/Theme.Translucent">
물론 잘 동작 한다.
하지만 위에서 적었듯이 투명 액티비티에서 보여지는 위젯들은 테마가 적용이 않된 후린 기본 스타일로 보여지게 된다.

내 경우 다이얼로그를 띄워야 하는데 다른 다이얼로그는 테마가 적용 됬는데 투명액티비티에서 띄우는 녀석만 미운오리새끼 같다.

그럼 어떻게 해야 하는가!!

일단 테마를 만듭니다.
project/res/values/themes.xml 을 추가 하면 된다.
다음과 같이 themes.xml파일의 내용을 체운다.
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="Translucent_Dialog" parent="@android:style/Theme.Holo.Light.Dialog.NoActionBar">
        <item name="android:windowBackground">@android:color/transparent</item>        
    </style>

</resources>
이미 themes.xml 파일이 있다면 style 항목만 추가 하면 되겠죠?

style 에서 "parent" 부분이 상속받을 스타일이고 "item" 으로 배경을 투명하게 지정 한것이다.
사실 "@android:style/Theme.Holo.Light.Dialog.NoActionBar" 테마는 투명액티비티에 필요한 "NoActionBar"라던가 "Dialog"라던가 하는 스타일이 거의 지정 되어 있다.
현재 사용하는 테마 스타일이 다른것이라면 아래와 같은 속성을 추가해 타이틀과 액션바를 없애줘야 할 것 이다.
<item name="android:windowActionBar">false</item>
<item name="android:windowNoTitle">true</item>
테마가 적용된 투명한 새로운 테마를 생성하였으면 이를 액티비티에 적용해 줘야 한다.
"AndroidManifest.xml" 파일을 열어 투명효과를 적용할 액티비티에 다음과 같이 테마를 지정해 준다.
<activity
    android:name=".TrasparentTestActivity"
    android:label="@string/app_name"
    android:theme="@style/Translucent_Dialog" >
이렇게 하면 투명한 액티비티 생성 완료~