한 걸음 두 걸음

Android 안드로이드 ] 30분 이내의 업데이트 주기를 가진 위젯 본문

FrontEnd/Android

Android 안드로이드 ] 30분 이내의 업데이트 주기를 가진 위젯

언제나 변함없이 2019. 9. 22. 20:31
반응형

백그라운드 실행 제한때문에 작동은 안하네요ㅠ

이전에 리스트뷰를 활용한 위젯을 만들었는데 30분 주기라는 제약이 있었죠? 그래서 이번엔 30분 주기를 깨는 방법을 알아보려고 합니다 : ) 새로고침할 때 활용하려고 브로드캐스트 발생시켜서 상태 업데이트 하는 로직을 이해하고자 만들어보았습니다.


  1. TimeWidget을 하나 만들어줍니다.
    widget- appwidet

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

반응형