현재 수능까지 남은 시간을 표시해주는 위젯을 만들고 있습니다.

 

책을 보면서 따라하고는 있습니다만, 앱위젯이 그냥 앱과는 너무도 틀려 시행착오를 많이 겪고 있습니다;;

 

일단 파일 세개 올리면서 질문드려봅니다.

 

 <?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="294dip"
    android:minHeight="148dip"
    android:updatePeriodMillis="0"
    android:initialLayout="@layout/sununglayout"
    >
</appwidget-provider>

이게 매니페스트에 등록된 sunung.xml입니다.

 

그리고 위젯 소스입니다.

 

 package kr.hs.bugil.logics.bwv;
import android.appwidget.*;
import android.content.*;
public class SunungWidget extends AppWidgetProvider {
 public void onEnabled(Context context) {
 }
 public void onUpdate(Context context, AppWidgetManager appWidgetManager,
   int[] appWidgetIds) {
  Intent intent = new Intent(context, SunungWidgetService.class);
  context.startService(intent); 
 }
 public void onDeleted(Context context) {
  Intent intent = new Intent(context, SunungWidgetService.class);
  context.stopService(intent);
 }
}

마지막으로, 위젯에서 사용되는 서비스입니다.

 

 package kr.hs.bugil.logics.bwv;
import java.util.Calendar;
import java.util.GregorianCalendar;
import android.app.*;
import android.appwidget.*;
import android.content.*;
import android.os.*;
import android.widget.*;
public class SunungWidgetService extends Service {
 public int onStartCommand(Intent intent, int flags, int startId) {
  super.onStartCommand(intent, flags, startId);
  Intent intent1;
  intent1 = new Intent(this, SunungWidgetService.class);
  AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
  PendingIntent sender;
  sender = PendingIntent.getBroadcast(this, 0, intent1, 0);
  am.setRepeating(AlarmManager.ELAPSED_REALTIME,
    SystemClock.elapsedRealtime(), 1000, sender);
  IntentFilter filter = new IntentFilter();
  filter.addAction(Intent.ACTION_BATTERY_CHANGED);
  registerReceiver(mBRBattery, filter);
  return START_STICKY;
 }
 public IBinder onBind(Intent arg0) {
  return null;
 }
 public void onDestroy() {
  super.onDestroy();
  unregisterReceiver(mBRBattery);
 }
 BroadcastReceiver mBRBattery = new BroadcastReceiver() {
  public void onReceive(Context context, Intent intent) {
   String action = intent.getAction();
   RemoteViews views = new RemoteViews(context.getPackageName(),
     R.layout.sununglayout);
   Calendar nowdate = Calendar.getInstance();
   nowdate.set(nowdate.get(Calendar.YEAR),
     nowdate.get(Calendar.MONTH),
     nowdate.get(Calendar.DAY_OF_MONTH));
   long mnowdate = nowdate.getTimeInMillis();
   Calendar m113 = Calendar.getInstance();
   m113.set(2012, 10, 8);
   long mm113 = m113.getTimeInMillis();
   Calendar cal = new GregorianCalendar();
   mnowdate -= mm113;
   mnowdate = mnowdate / 1000 / 86400;
   mnowdate = (-1) * mnowdate;
   String mnow = Long.toString(mnowdate);
   String Date;
   Date = String.format("%d년 %d월 %d일", cal.get(Calendar.YEAR),
     cal.get(Calendar.MONTH) + 1,
     cal.get(Calendar.DAY_OF_MONTH),
     cal.get(Calendar.HOUR_OF_DAY));
   views.setTextViewText(R.id.Today, "오늘은 " + Date);
   views.setTextViewText(R.id.remainsday, mnow + "일 남았습니다.");
   AppWidgetManager wm = AppWidgetManager
     .getInstance(SunungWidgetService.this);
   ComponentName widget = new ComponentName(context,
     SunungWidget.class);
   wm.updateAppWidget(widget, views);
   if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
    int scale, level, ratio;
    scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100);
    level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
    ratio = level * 100 / scale;
    views.setTextViewText(R.id.widgetText, "배터리 잔량 : " + ratio
      + "%");
    wm.updateAppWidget(widget, views);
   }
  }
 };
};

제가 질문드리고 싶은 점은, 리프레쉬 인터벌인데요, 보시다시피 알람매니저로 1000ms마다 리피팅 하도록 했습니다만,

 

원하는 대로 되지가 않네요. 단말마다 다른데, 10~30초마다 한번씩 리프레시되고, 나중에는 더 벌어져서 이게 리프레쉬 되는지 알기 힘들 정도입니다.

 

문제가 어디인지, 어디를 어떻게 고쳐야 하는지 알려주시면 정말 감사드리겠습니다ㅠㅠ

 

여러분의 도움이 절실한 초보 개발자입니다...