1

私は、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?
4

1 に答える 1

2

サービスはアプリケーションの一部として実行されるため、アプリケーションはそのために作成されます。

ほとんどのアプリは拡張する必要はありませんApplication。すべてのコードを見なくても、どちらも見る必要はないと確信しています。ユーザーに何かを表示するクラスを拡張Activityし、その中でAPIのことを実行するだけです。これは、サービスの実行時には作成されません。

于 2012-12-09T16:51:50.803 に答える