Android Widget Configuration 에서 자신을 호출한 위젯 클래스 이름 찾기

Donggi Hong·2022년 10월 20일
1

배경

3종류의 위젯에서 사용자 중 한 명을 선택하는 기능을 만들어야 하는 공수가 발생했습니다.
세 위젯에서 필요한 데이터는 동일하기에 하나의 Fragment를 재활용하는 방법을 고민했습니다.

목표

동일한 사용자 풀에서 데이터를 가져오면 되기에,
1개의 Configuratuin Activity(또는 fragment)에서 호출한 위젯을 찾아내 Intent를 전달하는 방식으로 구현하고자 합니다.

코드

val appWidgetId: Int = getIntent().extras?.getInt(
	AppWidgetManager.EXTRA_APPWIDGET_ID,
	AppWidgetManager.INVALID_APPWIDGET_ID
) ?: AppWidgetManager.INVALID_APPWIDGET_ID

var appWidgetManager: AppWidgetManager? =
	AppWidgetManager.getInstance(context).apply {
		Log.d(getAppWidgetInfo(appWidgetId).provider.shortClassName)
        Log.d(getAppWidgetInfo(appWidgetId).provider.className)
        Log.d(DetailWidget::class.java.name)
    }
  • WidgetConfigFragment.onViewCreated(...)
  • Fragment에서 클래스 명 획득을 위한 코드

저는 Fragment에서 진행했기에, onViewCreated에서 클래스명을 찾기 위한 작업을 진행했습니다.

위처럼 작성하여 로그를 찍어보면, 아래와 같은 로그를 얻을 수 있습니다.

2022-10-20 15:47:13.317 31716-31716/danggai.app.resinwidget E/myLog: (WidgetConfigFragment.kt:54) onViewCreated: danggai.app.presentation.ui.widget.DetailWidget
2022-10-20 15:47:13.318 31716-31716/danggai.app.resinwidget E/myLog: (WidgetConfigFragment.kt:55) onViewCreated: danggai.app.presentation.ui.widget.DetailWidget
2022-10-20 15:47:13.318 31716-31716/danggai.app.resinwidget E/myLog: (WidgetConfigFragment.kt:57) onViewCreated: danggai.app.presentation.ui.widget.DetailWidget

DetailWidget의 Configurate를 위해 호출한 Activity에서,

getAppWidgetInfo(appWidgetId).provider.shortClassNamegetAppWidgetInfo(appWidgetId).provider.className
DetailWidget의 classname과 같은 값을 반환하는 것을 알 수 있습니다.

획득한 class 값을 Activity에 전역변수로 선언한 widgetClassName에 보관한 뒤,
해당 className를 통해 자신을 호출한 위젯의 클래스를 찾아, 해당 클래스로 broadcast를 전달하였습니다.

var widgetClassName = ""

...

val widgetClass = Class.forName(widgetClassName)

val updateIntent = Intent(context, widgetClass).apply {
    action = Constant.ACTION_RESIN_WIDGET_REFRESH_DATA
    putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId)
    putExtra("data", data)
}
act.sendBroadcast(updateIntent)

val resultValue = Intent().apply {
	putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId)
}

act.setResult(Activity.RESULT_OK, resultValue)
act.finish()
  • WidgetConfigFragment
  • 자신을 콜한 WidgetProvider에게 결과를 전달하고 activity를 종료하는 코드
profile
꿈 많은 응애 안드로이드 개발자

0개의 댓글