안드로이드에서 위젯 추가 여부 확인하고 제안 띄우기

🕒 읽는 데 0분 예상
forest_articles
forest_날짜
forest_분류
문서
개발 중인 학교 앱
KLAS+
KLAS+
에는 모바일 학생증 QR코드를 바로 띄울 수 있는 위젯 기능이 있다. 이 모바일 학생증은 위젯 뿐만 아니라 앱 내의 메뉴를 통해서도 접근할 수 있다. 그런데, 생각보다 위젯을 추가해서 사용하는 경우는 많지 않고, 앱에 접속해 모바일 학생증 버튼을 눌러 여는 사용자의 비율이 더 많다는 것을 발견했다. 위젯이 있는데 굳이 이렇게 쓰지는 않을 것이고, 아마 위젯의 존재 사실을 알지 못하는 사용자가 많은 것 같다고 판단했다.
그렇다면, 해결책은 이렇게 나온다. 사용자에게 위젯의 존재 사실을 인지시켜야 한다.
어떻게? 대놓고 팝업 배너 같은 걸로 “모바일 학생증 위젯이 있어요! 추가해보세요!!!”라고 광고할 수는 없는 노릇이다. 생각해보면 모바일 학생증 위젯을 필요로 하는 사용자는 앱 내에서 한 번 쯤은 모바일 학생증 버튼을 눌러볼 것이다. 그럼 이때에만 위젯으로도 추가할 수 있다는 사실을 알려주면 되는 것이다.
아래 코드에서 LibraryQRWidget는 대상 Widget Provider 클래스 이름을 사용하면 된다.

위젯 추가 여부 확인하기

fun isWidgetAdded() : Boolean { val appWidgetManager = AppWidgetManager.getInstance(context) val widgetComponent = context?.let{ComponentName(it, LibraryQRWidget::class.java)} val widgetIds =appWidgetManager.getAppWidgetIds(widgetComponent) return widgetIds.isNotEmpty() }
이 함수는 사용자의 홈 화면에 특정 위젯(LibraryQRWidget)이 추가되었는지 확인하는 역할을 한다.
  1. AppWidgetManager.getInstance(context)는 현재 앱의 AppWidgetManager 인스턴스를 가져온다.
  1. ComponentName은 특정 위젯 클래스를 지정한다. 여기서는 LibraryQRWidget이 대상 위젯 클래스이다.
  1. getAppWidgetIds() 메서드는 지정된 위젯 클래스와 연결된 모든 위젯 ID 배열을 반환한다.
  1. 마지막으로, 반환된 배열이 비어 있지 않으면(isNotEmpty()), 해당 위젯이 하나 이상 추가되었다고 판단하여 true를 반환한다.

위젯 추가 제안하기

만약, 사용자가 아직 위젯을 홈 화면에 추가하지 않은 상태라면 추가적인 레이아웃을 띄워 위젯 추가 가능 사실을 알리고, 버튼을 눌러 바로 홈 화면에 추가할 수 있도록 했다.
val appWidgetManager = AppWidgetManager.getInstance(context) val provider = context?.let { it1 -> ComponentName(it1, LibraryQRWidget::class.java) } if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && appWidgetManager.isRequestPinAppWidgetSupported){ val intent = Intent(context, LibraryQRWidget::class.java) val successCallback = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_IMMUTABLE) if (provider != null) { appWidgetManager.requestPinAppWidget(provider, null, successCallback) } }
위 코드는 사용자가 위젯을 직접 홈 화면에 추가할 수 있도록 요청하는 기능을 수행한다.
  1. AppWidgetManager.getInstance(context)를 통해 AppWidgetManager 객체를 가져온다.
  1. ComponentName으로 특정 위젯 클래스(LibraryQRWidget)를 지정하여 해당 위젯의 정보를 참조할 수 있도록 한다.
  1. Build.VERSION.SDK_INT >= Build.VERSION_CODES.O 조건은 안드로이드 Oreo(API 26) 이상에서만 실행되도록 보장한다. 이는 requestPinAppWidget 메서드가 API 26 이상에서만 지원되기 때문이다.
  1. isRequestPinAppWidgetSupported는 현재 디바이스가 핀(Pin) 방식으로 위젯 추가를 지원하는지 확인한다.
  1. Intent는 성공적으로 핀 요청이 처리되었을 때 실행될 작업을 정의한다.
  1. PendingIntent.getBroadcast()는 성공 콜백으로 사용할 브로드캐스트 인텐트를 생성한다.
  1. 마지막으로, requestPinAppWidget() 메서드를 호출하여 사용자가 홈 화면에 해당 위젯을 추가할 수 있도록 요청한다.

댓글 0