
안녕하세요. 휴우 입니다;;; '최근 연락처 위젯' 은 휴대폰 홈 화면에 위치하는 아주 작은 위젯으로, 사용자가 가장 최근에 사용한 연락처 정보가 최대 10개 까지 리스트 형식으로 나타나는 무료 어플리케이션입니다. 사용하기 쉽고, 안드로이드의 기본 기능만을 활용하여 구현되어 있음으로 여러 가지 환경에서 잘 동작하지요. (그렇다고 믿고 싶습니다;;;) 설치 하시고 위젯을 등록하시면 음...그러니까 아주 깔끔한;;;; 디자인의 위젯이 나타납니다. 위젯에 표시되는 목록은 사용자의 주소록 정보에 따라 동적으로 변경되며, 연결할 사람의 이름을 터치하면 오른쪽 화면처럼 QuickContact 패널이 표시되도록 구현되어있습니다. (편리하겠조???)

에... 쑥스러운 어플리케이션 광고는 여기까지하고;;;; 이전 작품(?) 로그 토스터와 마찬가지로, 최근 연락처 위젯은 아파치 라이센스 기반으로 소스가 공개된 1인 참가(ㅠㅠ) 오픈 소스 프로젝트입니다. 아래의 주소로 접근하시면, 웹상에서 직접 소스를 브라우즈 하실 수 있으며, SVN 클라이언트를 이용하시면 간편하게 전체 소스를 체크아웃 받으 실 수 있습니다.
코드 구글 호스팅 페이지:
http://code.google.com/p/huewu/source/browse/#svn/trunk/RecentContactsWidget
SVN 체크아웃 주소:
https://huewu.googlecode.com/svn/trunk/RecentContactsWidget

AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);ComponentName cpName = new ComponentName(context, RecentContactsWidget.class);if(stillviews != null)appWidgetManager.updateAppWidget(cpName, stillviews);if(aniViews != null) //need to animate views.appWidgetManager.updateAppWidget(cpName, aniViews);
//select ContactsContract information by using phone number - originatingAddress.Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(originatingAddress));Cursor c = mAppContext.getContentResolver().query(uri, null, null, null, null);if(c == null) //error happenreturn;c.close();
Cursor c = mAppContext.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null);if(c == null){//error happen.return new SimpleContact[0];}c.close();
마지막으로, 위젯에서의 사용자 이벤트 처리에 관해 간단히 이야기해보지요. 기본적으로 위젯에서 처리 가능한 사용자 이벤트는 오직 두 가지. 일정 주기 마다 날아오는 APPWIDGET_UPDATE 브로드캐스트 인텐트와 특정 View 가 클릭시 발생시킬 수 있는 PendingIntent 입니다. 그리고 위젯은 본질적으로 BroadcastReceiver 라는 점을 활용해서 여러가지 상태 정보를 저장하거나, GUI 를 다시 그리는 작업을 수행해야 합니다. 이때, 동일한 형식의 PendingIntent 는 하나 이상 존재할 수 없다는 제약조건(신용 거품을 피하기 위하여...)이 있음을 꼭 기억하셔야합니다. 예를 들어, '최근 연락처 위젯'에서, 버튼을 누를 때 해당 주소록에 대응되는 QuickContact 를 화면에 표시할 때, 투명한 Activity 를 호출하도록 구현되어 있는데요.이 Activity 를 호출하는데 사용한 PendingIntent 는 다음과 같습니다.
private String[] mCallIntentList = new String[]{
RecentContactsWidget.ACTION_CALL_1,
RecentContactsWidget.ACTION_CALL_2,
RecentContactsWidget.ACTION_CALL_3};
Intent intent = new Intent(mCallIntentList[index]);
intent.setData(uri);
intent.putExtra(ContactsContract.Contacts.DISPLAY_NAME, name);
PendingIntent pendingCall = PendingIntent.getActivity(mAppContext, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
views.setOnClickPendingIntent(mCallItemList[index + 1], pendingCall);
모두 전달하고자 하는 EXTRA 자료만 다른, 동일한 Activity 를 호출하고자 하는 Intent 이기 때문에, 명시적 방법으로 Intent 를 생성할 경우 중복 생성이 불가능 하며, 암시적으로 서로 다른 Action 값을 갖는 Intent 를 기반으로 PendingIntent 를 생성하고 있습니다.
간단하게 '최근 통화 위젯' 어플리케이션 코드 부분 부분을 설명 드렸습니다. 전체 코드 라인이 500여 라인 정도인 정말 정말 작은 어플리케이션인만큼, 위젯 어플리케이션 개발에 관심있으신 분들은 한번 체크아웃 받아서 이곳 저곳 살펴보시고 버그나 개선점등을 알려주시면 정말 좋겠습니다^^ (코드 구글 페이지에 직접 남겨주셔도, 제 블로그에 남겨 주셔도 좋습니다.
PS. '최근 연락처 위젯' 어플리케이션은이 주소로 접속(안드로이드 폰만 가능) 하시면, 현재 그리고 앞으로도 안드로이드 마켓에서 무료로 다운 받으실 수 있습니다.
와... 감탄사가 절로 나옵니다.
자신이 만든 소스를 남에게 공개한다는 자체가 엄청난 내공아니고서는 거의 불가능(?) 하다고 봅니다^^
휴우 님 대단하십니다^^ 또 존경스럽습니다^^
분석하여 많은 가르침을 받도록 노력하겠습니다.



