본문 바로가기

개발/안드로이드 개발

LiveWallpaper - 간단한 LiveWallpaper 만들기(1)

우선 LiveWallpaper에 대해 알아야 하니 CubeLiveWallpaper로 기본 동작방법을 알아보면

(참고로 CubeLiveWallpaper는 Android의 Sample프로젝트중에 있으니 바로 받으실 수 있습니다.)


1. 일단 일반 App과 다른점은 Manifest.xml파일에서 

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

이 두항목을 Intent-filter로 가지는 Activity가 없습니다. LiveWallpaper의 특성을 생각해보자면 모 당연한 말일 수 있지만요.


2. Manifest.xml 파일에 Service가 있는데 일반적으로 Android에서 Service는 Activity와 같이 실행되었을 경우에만 실행되는 것이 아니라 항상 Background에서 돌아가는 것, 그리고 별도의 Activity를 가지지 않는다는 것을 알고 넘어가시면 되겟구요. (참고로 Service를 사용하시면 GameCHI라는 게임 핵(?)에서 처럼 항상 화면에 떠있는 View를 만들 수도 있습니다.) Service에 보시면 두개로 나뉘어져 있는데 실행해보시면 아시겠지만 Cube1,Cube2를 나누어 놓은 것입니다.

그리고 중요한 것이 

<intent-filter>

<action android:name="android.service.wallpaper.WallpaperService" />

</intent-filter>

<meta-data android:name="android.service.wallpaper" android:resource="@xml/cube1" />

Intent-filter와 meta-data입니다.

LiveWallPaper를 구현하시려면 이부분은 항상 고정이라 생각하셔도 되구요

아 그리고 또 넣어야 하는부분이 Service의 attribute로 android:permission="android.permission.BIND_WALLPAPER"를 넣어주셔야 합니다. Activity와는 다르게 Application 밖에 한꺼번에 지정을 하던 permission이 Service에서는 하나하나마다 지정해주어야 하는것인지는 아직 모르겠습니다.(알려주세요 ;;;)

3. meta-data에서 resource로 지정된 @xml/cube1에는 볼게 없으니 cube2에서 보자면

<wallpaper xmlns:android="http://schemas.android.com/apk/res/android"

        android:settingsActivity="com.example.android.livecubes.cube2.CubeWallpaper2Settings"

/>

LiveWallPaper를 적용해보셨던 사용자분이라면 누구나 알 수 있듯이 환경설정을 할 수 있는 화면이 존재하는데(프로그램상에 지정이 되어있다면말이지만요.) settingsActivity에서 그 환경설정을 위한 Activity를 지정해줍니다.

출처 : http://developer.android.com/resources/samples/CubeLiveWallpaper/index.html


4. CubeWallpaper2Settings파일에서 보면 static변수나 DB를 사용하는것이 아닌 Preference를 사용하는것 같습니다.

PreferenceActivity를 상속받고 addPreferencesFromResource(R.xml.cube2_settings);으로 cube2_settings라는 xml파일의 내용을 preference에 등록합니다.


5. CubeWallpaper1.class파일을 보면


Class파일을 모두 붙여넣긴 햇지만 정작 필요한 것은

WallpaperService를 상속받고, onCreateEngine()에서 화면을 구성한다는 부분입니다.

소스상에는 큐브를 돌려야 하기때문에 이것저것 코딩이 많은데 Engine을 생성하고 Engine내부에서 화면에 표시해주는 것으로 하면 끝입니다.(?)

아래Sample은 Cube를 그리는 걸 빼고 터치된 좌표에 Circle을 그려주는 것만 있을때의 결과입니다.