2013-06-17 4 views
0

현재 내 안드로이드 장치 용 자체 배터리 위젯을 만들고 있습니다. 배터리 레벨을 퍼센트로 표시하는 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" /> 
+0

설명서에 업데이트주기가 30 분 미만이면 AlarmManager –

+0

을 사용해야한다고 생각합니다. 실제로는 업데이트 작업이 필요하지만 업데이트주기가 필요하지 않습니다. 한 번 호출해야하는 onUpdate가 필요합니다. 어딘가에서 나는 이것을 updatePeriodMillis를 0으로 설정함으로써 달성 할 수 있다고 읽었습니다. –

+0

지금이 문제에 직면하고 있습니다. 이것을 해결 했습니까? – SalutonMondo

답변

-2

죄송합니다. 서비스를 전경으로 만들어보십시오. 모자 시스템을 죽이고 그것을 전경 설정 여기가 완벽하게 모든 시간을 코드를 처리하지 않습니다 :

NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 

    Intent bIntent = new Intent(this, urmainactivity.class);  
    PendingIntent pbIntent = PendingIntent.getActivity(this, 0, bIntent,0); 

    NotificationCompat.Builder bBuilder = 
      new NotificationCompat.Builder(this) 
       .setSmallIcon(R.drawable.ic_launcher) 
       .setContentTitle("write the title") 
       .setContentText("write subtitle") 
       .setAutoCancel(true) 
       .setOngoing(true) 
       .setContentIntent(pbIntent); 
    Notification barNotif = bBuilder.build(); 
    this.startForeground(1, barNotif); 

을하고 수신기로 유 할 때 수신기가 유지해야하기 때문에이 서비스를 발사하고 시도 귀하의 전경 서비스만큼이나 적극적입니다. 그리고 그렇게 ... : 저를 잘 용서하지 않을 경우

Intent i = new Intent(context, urService.class); 
context.startService(i); 

당신의 서비스 및 매니페스트에 수신기를 등록하는 것을 잊지 마세요이 ,,,, 내가 도움이되기를 바랍니다.

관련 문제