안드로이드 개발 질문/답변
(글 수 45,052)
현재 수능까지 남은 시간을 표시해주는 위젯을 만들고 있습니다.
책을 보면서 따라하고는 있습니다만, 앱위젯이 그냥 앱과는 너무도 틀려 시행착오를 많이 겪고 있습니다;;
일단 파일 세개 올리면서 질문드려봅니다.
<?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초마다 한번씩 리프레시되고, 나중에는 더 벌어져서 이게 리프레쉬 되는지 알기 힘들 정도입니다.
문제가 어디인지, 어디를 어떻게 고쳐야 하는지 알려주시면 정말 감사드리겠습니다ㅠㅠ
여러분의 도움이 절실한 초보 개발자입니다...