2013-07-29 56 views
1

下面給出的代碼是用來跟蹤設備的電池電量並將其存儲在數據庫中。爲了獲得電池電量,每3分鐘調用一次「batterylevel」功能,並將電池電平插入到db表中。此外,代碼還可以將設備充滿電時的時間保存在另一個數據庫表中。一切正常工作一段時間。但約30分鐘後出現問題,運行的服務自動進入其創建方法,此後服務不會顯示任何日誌,最終服務停止導致強制關閉,而嘗試手動停止服務。運行服務自動進入創建

public class BatteryLevelService extends Service { 
    BroadcastReceiver batteryLevelReceiver; 
    Timer t ; 
    Calendar cal; 
    Date lastBatteryFullTime; 
    Context context; 
    int sec; 
    int lastFullChargeYear,lastFullChargeMonth,lastFullChargeDay; 
    int lastFullChargeHour,lastFullChargeMinute,lastFullChargeSecond; 
    private File dir; 


@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 
@Override 
public void onCreate(){ 

    Log.d("Service", "oncreate Service Started"); 

} 

    private void batteryLevel() { 
    cal=Calendar.getInstance(); 
    long currentHour=cal.get(Calendar.HOUR_OF_DAY); 
    long currentMinute=cal.get(Calendar.MINUTE); 
    long currentSecond=cal.get(Calendar.SECOND); 
    final String currentTime=currentHour+" : "+currentMinute+" : "+currentSecond; 

    Intent batteryIntent = registerReceiver(null, 
      new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 
    int rawlevel = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 
    int scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); 
    int level = -1; 
    if (rawlevel >= 0 && scale > 0) { 
     level = (rawlevel * 100)/scale; 

    } 
    MainActivity.sqladp.insertBatteryLevel(level, currentTime); 
    if(level==100){ 
     cal=cal.getInstance(); 
     lastFullChargeYear=cal.get(Calendar.YEAR); 
     lastFullChargeMonth=cal.get(Calendar.MONTH); 
     lastFullChargeDay=cal.get(Calendar.DAY_OF_MONTH); 
     lastFullChargeHour=cal.get(Calendar.HOUR_OF_DAY); 
     lastFullChargeMinute=cal.get(Calendar.MINUTE); 
     lastFullChargeSecond=cal.get(Calendar.SECOND); 
     lastBatteryFullTime=new Date(lastFullChargeYear, lastFullChargeMonth, lastFullChargeDay, lastFullChargeHour, lastFullChargeMinute); 

     String[] lastFullChargeTime=lastBatteryFullTime.toString().split("GMT"); 
     MainActivity.sqladp.deleteLastFullBattery(); 
     MainActivity.sqladp.insertLastUsage("Battery", "", lastFullChargeTime[0], ""); 
    } 
    Log.d("Battery level", ""+level + "%"); 
} 

@Override 
public void onStart(Intent intent, int startId) { 


    Log.d("Service", "Service Started"); 
    t = new Timer(); 
    //Set the schedule function and rate 
    t.scheduleAtFixedRate(new TimerTask() { 

     @Override 
     public void run() { 
      //Called each time when 1000 milliseconds (1 second) (the period parameter) 
      batteryLevel(); 
      Log.d("", "batlevel "); 
     } 

    }, 
    //Set how long before to start calling the TimerTask (in milliseconds) 
    0, 
    //Set the amount of time between each execution (in milliseconds) 
    3*60*1000); 


} 
@Override 
public void onDestroy() { 

    Log.d("service", "onDestroy"); 
    t.cancel(); 

} 

回答

0

onStart()方法僅用於舊的Android版本(< 2.0)。對於以後的版本,你應該使用onStartCommand()波紋管:

@Override 
public int onStartCommand(Intent intent, int flags, int startId) 

這將解決你的問題

+0

仍然有同樣的問題.. – user2435740