본문 바로가기
Android

[깡샘의 안드로이드 프로그래밍] 정리 31 - Collection Type 의 App Widget

by 들풀민들레 2018. 1. 6.

 

본 글은 [깡샘의 안드로이드 프로그래밍 - 루비페이퍼] 의 내용을 발췌한 것입니다.
좀더 자세한 내용은 책을 통해 확인해 주세요.

 

 

 

 

 

 

29장. 앱 위젯 개발

 

29.2.1. Collection 앱 위젯 구조

 

앱 위젯을 개발할 때 화면에 ListView, GridView 등 데이터 여러 건이 추가되는 뷰를 이용할 때는 앞에서 설명한 앱 위젯 개발 방법에 구성요소가 더 추가되어야 합니다.

 

 

앱 위젯이 ListView이면 레이아웃 XML과 Widget Provider XML, 브로드캐스트 리시버로 구성하여 앱 위젯을 만들어 적용하고, 앱 위젯 업데이트 의뢰는 RemoteViews로 처리하는 구조는 앞에서 살펴본 일반 앱 위젯 개발과 같습니다.

 

그런데 ListView는 Adapter가 있어야 화면에 데이터를 출력할 수 있는 뷰입니다. 따라서 앱 위젯의 ListView를 위한 Adapter를 어떻게 전달할 것인지의 문제가 있습니다. Adapter는 우리가 만들지만 Adapter를 활용해 ListView를 완성하는 곳은 런처 앱입니다. 또한, 앱 위젯의 뷰 클릭 이벤트는 앞에서 살펴본 대로 의뢰하면 되지만, ListView는 항목 선택 이벤트가 되며 각 항목 선택 시 항목을 식별하기 위한 데이터가 이벤트에 포함되어 발생해야 합니다. 이를 어떻게 표현할 것인지의 문제도 있습니다.

 

Collection 타입의 앱 위젯에서 화면을 구성하기 위한 Adapter를 위해 RemoteViewsFactory라는 클래스를 제공합니다. Collection 타입의 앱 위젯을 위한 구조도로 설명해 보겠습니다.

 

 

①번 흐름에서 앱 위젯을 위한 레이아웃 XML, Widget Provider XML, AndroidManifest.xml, 브로드캐스트 리시버는 모든 앱 위젯의 공통 구성요소입니다. 그런데 Collection 타입의 앱 위젯은 RemoteViewsService와 RemoteViewsFactory를 더 준비해야 합니다. RemoteViewsFactory는

앱 위젯의 뷰를 구성하기 위한 Adapter 역활을 하는 클래스이며, RemoteViewsService는 RemoteViewsFactory를 얻기 위해 실행되는 서비스입니다.

 

②번 흐름에서 브로드캐스트 리시버가 실행되면 RemoteViews로 의뢰내용을 담아 런처 앱에 전달하게 되는데, 이때 의뢰내용에 포함될 내용이 RemoteViewsFactory를 얻기 위해 RemoteViewsService 를 실행하기 위한 인텐트 정보가 포함되어야 합니다. 그리고 사용자가 ListView에서 항목을 선택했을 때 발생시켜야 하는 인텐트 정보가 포함되어야 합니다.

 

③번 흐름에서 런처 앱은 ②번에서 반환한 RemoteViews에 포함된 RemoteViewsService를 실행하기 위한 인텐트를 발생시킵니다. RemoteViewsService가 실행되어 준비된 RemoteViewsFactory를 생성하여 반환하면 되며 RemoteViewsFactory에는 각 항목을 어떻게 구성할지에 대한 내용과 항목 선택 이벤트 시 각 항목에 추가되어야 하는 데이터를 명시하게 됩니다.