현재 내 안드로이드 장치 용 자체 배터리 위젯을 만들고 있습니다. 배터리 레벨을 퍼센트로 표시하는 Just 및 ImageView와 TextView.서비스 내의 방송 수신기가 잠시 후 작동을 멈 춥니 다.
모든 것이 실제로는 (예 : 1 시간, 어쩌면 2와 같이) 언젠가 시간이 지나면 배터리 작동을 멈추고 수신 대기하는 브로드 캐스트 수신자가 더 이상 정확한 백분율 수준으로 업데이트되지 않습니다. 이것의 원인이 무엇일까요?
또한 수신자가 수신을 중지하고 더 이상 UI가 업데이트되지 않아도 서비스가 계속 실행 중임을 인식했습니다. 브로드 캐스트 리시버를 가지고 있으며, 사용자 인터페이스 onReceive()를 업데이트
public class BatteryWidgetHD extends AppWidgetProvider {
private static BatteryController bctrl;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
if(bctrl == null) bctrl = new BatteryController(context, appWidgetManager, appWidgetIds);
Log.i("BatteryWidgetHD", "OnUpdate... starting service...");
Intent batteryServiceIntent = new Intent(context.getApplicationContext(), BatteryMonitoringService.class);
context.getApplicationContext().startService(batteryServiceIntent);
}
/**
* service that keeps the broadcastreceiver alive that listens for battery changes
* @author philipp
*
*/
public static class BatteryMonitoringService extends Service {
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
if(bctrl != null) bctrl.listenToBatteryStatus();
}
@Override
public void onDestroy() {
if(bctrl != null) bctrl.stopListeningToBatteryStatus();
}
}
}
그리고 내 batterycontroller 클래스 : 여기
내 위젯 클래스
public class BatteryController {
private int status, level;
private boolean isCharging, isUSBPlugged, isACPlugged;
private Context c;
private BatteryStatusReceiver bsr;
private RemoteViews remoteViews;
private AppWidgetManager appWidgetManager;
private ComponentName thisWidget;
/** constructor
* @param appWidgetManager */
public BatteryController(Context c, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
this.c = c;
this.appWidgetManager = appWidgetManager;
remoteViews = new RemoteViews(c.getPackageName(), R.layout.battery_widget_layout);
thisWidget = new ComponentName(c, BatteryWidgetHD.class);
bsr = new BatteryStatusReceiver();
}
/**
* start listening to broadcasts concerning the battery
*/
public void listenToBatteryStatus() {
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
c.getApplicationContext().registerReceiver(bsr, ifilter);
getStartupBatteryLevel();
}
/**
* stop listening to battery broadcasts
*/
public void stopListeningToBatteryStatus() {
c.getApplicationContext().unregisterReceiver(bsr);
}
private void updateUI() {
remoteViews.setTextViewText(R.id.tvBatteryLevel, "\n" + level + "%");
appWidgetManager.updateAppWidget(thisWidget, remoteViews);
}
/**
* this class is responsible for listening to broadcasts concerning the
* battery status
*/
private class BatteryStatusReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL;
int isPlugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
isUSBPlugged = isPlugged == BatteryManager.BATTERY_PLUGGED_USB;
isACPlugged = isPlugged == BatteryManager.BATTERY_PLUGGED_AC;
// inform the UI about battery changes
updateUI();
Log.i("BatteryController", "BATTERY STATUS CHANGED. Level: " + level + ", Charging: " + isCharging);
// Toast.makeText(c, "Battery status changed.", Toast.LENGTH_SHORT).show();
}
}
}
그리고 widget_provider.xml을
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:initialLayout="@layout/battery_widget_layout"
android:minHeight="100dip"
android:minWidth="60dip"
android:previewImage="@drawable/battery75"
android:widgetCategory="keyguard|home_screen"
android:updatePeriodMillis="0" />
설명서에 업데이트주기가 30 분 미만이면 AlarmManager –
을 사용해야한다고 생각합니다. 실제로는 업데이트 작업이 필요하지만 업데이트주기가 필요하지 않습니다. 한 번 호출해야하는 onUpdate가 필요합니다. 어딘가에서 나는 이것을 updatePeriodMillis를 0으로 설정함으로써 달성 할 수 있다고 읽었습니다. –
지금이 문제에 직면하고 있습니다. 이것을 해결 했습니까? – SalutonMondo