본문 바로가기

소프트웨어/Android/Java/Ndk

Android] 위젯 만들기 2 - 클릭이벤트 먹이기

하.. 이해하고나서 보니깐 나는 정말 바보였던것 같다. 쉬운내용인데.. 아무튼 이어서 설명.



우선 Widget은 Activity와 다르게 RemoteViews를 view로 이용한다. 선언은 소스와 같이 하도록 하자. 


onUpdate내부의 소스 중   "//Btn Turn on WIFI " 부분의 세 줄만 보도록 하자.

1. Intent 생성

2. PendingIntent 생성

3. Event 추가


1번에서는 Intent를 생성하는데 new Intent(ACTION_TURNON_WIFI)로 객체를 생성한다. 이때 parameter를 보면 class 내부에서 final static String으로 선언되어 있다. 이 값을 보면 "com.example.wifiwidget.widget.ACTION_TURNON_WIFI"가 할당되어있다. 이전 글에서 본 Manifest의 intent-filter에서 내가 직접 설정한 필터명과 일치하는것을 볼 수 있다. 기호에따라 필터명을 "ABCD"로 해도되고 아무렇게나 해도 되지만 알아보기만 좋게 하도록 하자. 이렇게 생성된 intent 인스턴스는 action값으로 "com.example.wifiwidget.widget.ACTION_TURNON_WIFI"를 갖게된다.


2번에서는 PendingIntent를 생성한다. notification을 설정할때와 비슷하게 팬딩인텐트를 사용한다. view가아니라 remoteview를 사용하기 때문이라고 한다. 어쨋뜬, 위에서 설정한 intent를 바탕으로 팬딩intent를 만들었으면


3번째 줄에서 Removeviews의 객체인 views에 이벤트를 먹인다. setOnClickPendingIntent는 PendingIntent를 날려서 onReceive함수에서 리시빙을 해줄 수 있게 한다.


살펴볼점은 //Btn Turn on WIFI와 //Btn CALL ACtivity의 각각의 두번째 줄은 각각 다른 Method로 PendingIntent를 생성하는것을 볼 수 있다. 전자는 getBroadcast로 생성하고 후자는 getActivity를 이용해서 생성한다. getBroadcast를 사용하면 BroadcastReciving을 통해서 다시 자신의 class로 intent를 날린다. 그러나 getActivity매서드는 클릭 이벤트가 일어났을때 바로 지정한 (Activity를상속받은)class를 실행하게 된다. getBroadcast를 써서 onReceive내에서 Activity를 call해도 되고 그건 개발자 마음~~


소스에서는 Log를 이용해서 intent의 action을 출력하고있다. 따로 소스로 표현하지는 않았으나 기호에 맞게 action을 구분해서 행동을 지정해주면 Widget을 구성하고 ClickEvent를 달기 끝~~



삽질하지말자..하...