バックグラウンドでサービスを含むAndroidアプリケーションを開発しました。このバックグラウンドサービスを実装するために、を使用しIntentService
ました。アプリケーションがサーバーを毎回ポーリングするようにします60 seconds
。したがって、IntentService
では、サーバーはwhileループでポーリングされます。whileループの最後にThread.sleep(60000)
、次の反復が60秒後にのみ開始されるように使用しました。
しかし、Logcat
では、アプリケーションがウェイクアップするのに5分以上かかることがあります(そのスリープから抜け出し、次の反復を開始します)。それは1 minute
私たちが望むようには決してなりません。
これの理由は何ですか?バックグラウンドサービスは別の方法で実装する必要がありますか?
問題2
Androidは、しばらくするとこのバックグラウンドプロセス(インテントサービス)を強制終了します。いつ正確に言うことはできません。しかし、バックグラウンドサービスが強制終了されるまでの数時間、場合によっては数日かかることもあります。その理由を教えていただければ幸いです。サービスは殺されることを意図していないからです。それらは、必要な限りバックグラウンドで実行することを目的としています。
コード:
@Override
protected void onHandleIntent(Intent intent) {
boolean temp=true;
while(temp==true) {
try {
//connect to the server
//get the data and store it in the sqlite data base
}
catch(Exception e) {
Log.v("Exception", "in while loop : "+e.toString());
}
//Sleep for 60 seconds
Log.v("Sleeping", "Sleeping");
Thread.sleep(60000);
Log.v("Woke up", "Woke up");
//After this a value is extracted from a table
final Cursor cur=db.query("run_in_bg", null, null, null, null, null, null);
cur.moveToLast();
String present_value=cur.getString(0);
if(present_value==null) {
//Do nothing, let the while loop continue
}
else if( present_value.equals("false") || present_value.equals("False") ) {
//break out of the while loop
db.close();
temp=false;
Log.v("run_in_bg", "false");
Log.v("run_in_bg", "exiting while loop");
break;
}
}
}
ただし、サービスが強制終了されると、プロセスがスリープ状態のときに発生します。最後のログは-を読み取りますSleeping : Sleeping
。サービスが強制終了されるのはなぜですか?