한 걸음 두 걸음
Android 안드로이드 ] 30분 이내의 업데이트 주기를 가진 위젯 본문
반응형
백그라운드 실행 제한때문에 작동은 안하네요ㅠ
이전에 리스트뷰를 활용한 위젯을 만들었는데 30분 주기라는 제약이 있었죠? 그래서 이번엔 30분 주기를 깨는 방법을 알아보려고 합니다 : ) 새로고침할 때 활용하려고 브로드캐스트 발생시켜서 상태 업데이트 하는 로직을 이해하고자 만들어보았습니다.
- TimeWidget을 하나 만들어줍니다.
xml이나 info xml은 설명할 필요를 못느끼겠고,
public class TimeWidget extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.time_widget);
Calendar cal = Calendar.getInstance();
remoteViews.setTextViewText(R.id.time_widget_date_textview, cal.get(Calendar.HOUR_OF_DAY)+":"+cal.get(Calendar.MINUTE));
Intent intent = new Intent(context, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context,0,intent, 0);
remoteViews.setOnClickPendingIntent(R.id.time_widget_date_textview, pendingIntent);
appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);
}
@Override
public void onEnabled(Context context) {
Intent intent = new Intent(context, TimeWidget.class);
intent.putExtra("mode","time");
PendingIntent pendingIntent = PendingIntent.getBroadcast(context,0, intent, 0);
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 60000, pendingIntent);
}
//마지막 제거되는 순간
@Override
public void onDisabled(Context context) {
//새로고침 기능 넣을거, 알람기능 등록!
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, TimeWidget.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent,0);
alarmManager.cancel(pendingIntent);//알람 해제
pendingIntent.cancel(); //인텐트 해제
}
/**
* AppWidgetProvider가 브로드캐스트 하위 클래스이기 때문에 이와같은 onReceive함수가 있다.
* * @param context
* @param intent
*/
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
if(intent.getStringExtra("mode") != null){
Calendar current = Calendar.getInstance(); //캘린더 싱글톤
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.time_widget);
remoteViews.setTextViewText(R.id.time_widget_date_textview, current.get(Calendar.HOUR_OF_DAY)+":"+current.get(Calendar.MINUTE));
AppWidgetManager manager = AppWidgetManager.getInstance(context);
manager.updateAppWidget(new ComponentName(context, TimeWidget.class),remoteViews);
}else {
super.onReceive(context, intent);
}
}
}
onEnabled()에서 pending intent를 발생시켜 alarmService에 등록시켜준 후, 1분마다 브로드캐스트를 발생시켜 onReceive를 호출합니다.
onDisable()에서는 해당 알람과 intent를 해제합니다.
github link :https://github.com/losnah/ModuleAsset
반응형
'FrontEnd > Android' 카테고리의 다른 글
android 안드로이드 ] 레드로핏 Retrofit2 실습 _ 서버 없이 (1) | 2019.12.03 |
---|---|
Android 안드로이드 ] 위젯 버튼 클릭 이벤트 설정하기 (0) | 2019.09.22 |
Android 안드로이드 ] 위젯 Widget 리스트뷰 로딩중...문제 해결! (0) | 2019.09.21 |
Android 안드로이드 ] Listview Widget 위젯 만들기 (0) | 2019.09.21 |
API / Library / Framework / Platform의 차이 (0) | 2019.09.14 |