안드로이드 개발 질문/답변
(글 수 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초마다 한번씩 리프레시되고, 나중에는 더 벌어져서 이게 리프레쉬 되는지 알기 힘들 정도입니다.
문제가 어디인지, 어디를 어떻게 고쳐야 하는지 알려주시면 정말 감사드리겠습니다ㅠㅠ
여러분의 도움이 절실한 초보 개발자입니다...



