私は、1時間程度ごとにバックグラウンドで更新を行う必要があるAndroidアプリを開発しています。スティッキーにしたバックグラウンドサービスがあります。そして、Timer.scheduleAtFixedRateを使用して更新をスケジュールしています。
これはうまくいくようです。しかし、アプリを閉じると、次にスケジュールされた更新が実行されるときに、Application.onCreateが再度呼び出されることに気付きました。
これは問題です。Application.onCreateは、ユーザーに表示する準備ができているAPIからデータを取得する場所だからです。これがバックグラウンドで発生することは望ましくありません。
これは予想される動作ですか?もしそうなら、おそらく私はアプリが最初にフォアグラウンドにあるかどうかを確認するためにonCreateにチェックインを追加する必要がありますか?または多分私は何かが間違って設定されていますか?
ありがとう!
ps JellyBean4.2.1を実行しているGalaxySamsungです
バックグラウンドサービスコード:
@EService
public class BackgroundService extends Service {
...
private Timer timer = new Timer();
private void performUpdate() {
// Do the stuff here that we need to do on a schedule...
Log.i(LOG_CONTEXT, "Perform scheduled update");
...
}
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(LOG_CONTEXT, "Background thread started");
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
performUpdate();
}
}, 0, UPDATE_INTERVAL);
// Sticky means service will continue running until explicitly stopped
return START_STICKY;
}
@Override
public void onDestroy() {
Log.d(LOG_CONTEXT, "Background thread stopped");
timer.cancel();
}
}
アプリケーションコード:
@EApplication
public class MyApplication extends Application {
...
@Override
public void onCreate() {
super.onCreate();
initApp();
}
private void initApp() {
// This is where I want to do stuff when the app is actually
// opened by the user, not every time the background service
// update occurs!
Log.i(LOG_CONTEXT, "Initialise. Why does this happen again after app's closed?");
...
}
...
ログ:
12-09 16:28:15.828: I/MyApplication(3049): Initialise. Why does this happen again after app's closed?
[Now I close the app, by pressing the Recent Apps menu button and swiping it away]
12-09 16:28:16.015: I/BackgroundService(3049): Perform scheduled update
12-09 16:28:33.875: I/MyApplication(3080): Initialise. Why does this happen again after app's closed?