1

以下のコードは、デバイスのバッテリー レベルを追跡し、db に保存するように記述されています。バッテリー残量を取得するために、関数「batterylevel」が 3 分ごとに呼び出され、バッテリー残量が db テーブルに挿入されます。また、コードは、デバイスが完全に充電されると、時間を別の db テーブルに保存します。しばらくの間、すべてが正常に機能します。しかし、約 30 分後に問題が発生し、実行中のサービスが自動的に oncreate メソッドに入り、そのサービスがログを表示しなくなった後、最終的にサービスが停止し、サービスを手動で停止しようとしたときに強制的に終了します。

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();

}
4

1 に答える 1

0

メソッド onStart() は、古い Android バージョン (<2.0) でのみ使用されます。それ以降のバージョンでは、次のように onStartCommand() を使用する必要があります。

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

これはあなたの問題を解決します

于 2013-07-29T05:38:11.613 に答える