본문 바로가기

소프트웨어/Android/Java/Ndk

Android] 위젯 만들기 - 1. 위젯 껍데기 만들기

우선 위젯의 껍데기를 만들것이다.

프로젝트로 바빠서 왠만큼 막히는거 아니면 글을 잘 안적는데 위젯은 '완전극도로심하게'삽질을 많이해서 꼭 글을 쓰고 나중에 또 삽질하지 말아야지..



Preview.

다른 블로그나 레퍼런스설명이 너무 어려웠다...그래서 쉽게쉽게 써놓으려고한다. 먼저 위젯의 기본구성은 위의 그림과 같다. (뻘짓을많이해서..)내 눈에서 본 위젯은 저렇게 세개의 구성으로 이루어졌다. mianifest는 많이 쓰니깐 쉽게 접근하겠지..만 그렇지않았다. Receiver쪽 Filter를 설정하면서 이부분이 가장 오래걸렸다. 뭐 자세한 설명은 2번째 글에서 쓸테니 일단 미뤄두고


그다음은 provider.xml이다. 사실 이름은 어떻게지어도 상관없다. custom_provider.xml도 되고 asdfg.xml도 된다.(즉, 다된다) 중요한건 manipest에서 meta-data로는 정확하게 자신이 설정한 xml의 이름을 넣어야한다.


마지막으로 Provider.class이다. Provider가 뭐지?라고하면 api를 타고 들어가면 이 클래스를 상속하는 AppWidgetProvider는 내부에서 BroadcastReceiver를 상속하고있다. 그래서 결국 이 클래스는 Widget을 위한 BroadcastReceiver란 것이다. (BroadcastReceiver가 무엇인지 모르는사람은....일단 BroadcastReceiver부터 공부하고 오는게 속 편할것이다..) 그래서 내부에서 onReceive()같이 BroadcastReceiver class의 method들을 overriding해서 사용한다.



(순서와는 다르게 Provider.xml을 먼저 설명)

1. provider.xml

프로바이더는 widget의 설정사항을 다룬다고 하였다. 그래서 나는 아래와 같이 xml을 구성하였다.



왼쪽이 provider xml이다.(캡쳐를 잘못했다!!위에는 이름이 widget_configuration.xml으로 나왔는데 잘못된 캡쳐임...ㅈㅅ) 나는 wifi_widget_provider.xml이라고 이름을 지어서 사용하였다. 이 xml은 "/res/xml/"에 저장되어야 한다.없으면 new로 새로 만들기를 바란다. minWidth와 minHeight를 설정하고 initialLayout을 설정한다. 이값은 실질적으로 widget이 설치되면 보이는 layout값이다. 나는 /res/layout/의 mycustomwidget.xml로 설정하였다.

updatePreiodMillis와 같은 속성은 레퍼런스참조. 



2. manifest.xml

매니패스트에서는 Receiver와 intent-filter에 관한 설정을 수정할 수 있다. 겁먹을 것 없다. Activity를 상속받아서 사용할때 <activity...를 추가하는 것 처럼 우리는 Receiver를 사용하기때문에 <Receiver ..를 추가하면 된다.



위의 캡쳐는 manifest.xml의 모습이다. 위에서 설명한 것 같이 <receiver...를 작성하면 되는데 여기에는 세가지 구성요소가 들어있다.

1. <receiver>의 속성인 name

2. <intent-filter>

3. <meta-data>

3번부터 설명하면 첫째줄인 android:name="android.appwidget.provider"는 꼭 넣어줘야한다. 왜냐하면 widget에서 BroadcastReceiver 기능을 사용하려면 필요한 설정사항이다. 그다음 provider.xml(나는 wifi_widget_provider.xml이라고 작성)을 resource속성으로 지정해준다.

그다음은 1번 설명. receiver의 name속성으로는 appWidgetProvider를 상속받는 class의 이름을 넣어주면 된다. ( dot는 붙여도되고 안붙여도 되더라는)

그다음은 2번 설명이다. 이부분때문 완전 해맸다. intent-filter라는 것 자체가 말그대로 intent로 들어오는 값을 filtering한다는 뜻이다. 

즉, <action android:name="MANTDU"> 라고 지정해버리면 리시버로 intent를 받으면 action이 MANTDU가 아닌이상 다 거부하는 기능이다. widget에서는 필수적으로 첫번째 설정인 android.appwidget.action.APPWIDGET_UPDATE를 설정해 줘야 widget에서 변경사항들이 업데이트된다. 그리고 두번째로 적어놓은 <action..은 내가 임의로 정한 Filter이다. 그래서 리시빙받았을때 저 두개만 통과된다.

매니패스트에서 이외에 특별한 설정은 없다.(기본적인 위젯에서는)



3. Provider.class 

실질적으로 receiver가 무슨 기능을 할 지 정의하는 class이다.


초기 설정은 onUpdate매서드에서 하면 된다.

구성은 레퍼런스를 따라했는데 처음에 appWidgetIds의 길이를 얻고 for문을 돌면서 RemoteViews들을 생성하면서 등록한다.

onUpdate안의 소스는 몰라도 일단 껍데기가 완성되었다. onUpdate안의 소스는 클릭해서 자기자신에게 브로드캐스팅을 하는 부분인데 이부분은 다음글에서 쓰도록 하겟다. 일단 여기까지만 해도 핸드폰에 올리면 내가 만든 레이아웃 껍데기 위젯이 올라가게 된다.