Android粘性后台服务在关闭后重新启动应用程序

时间:2012-12-09 16:41:45

标签: android android-4.2-jelly-bean sticky background-service

我正在开发一款需要每小时左右在后台进行一些更新的Android应用。我有一个后台服务,我已经做了Sticky。我使用Timer.scheduleAtFixedRate来安排更新。

这似乎工作正常。但我注意到,当我关闭应用程序时,下次计划更新运行时,会导致Application.onCreate再次被调用。

这是一个问题,因为Application.onCreate是我从准备显示给用户的API中抓取数据的地方。我不希望这种情况发生在后台。

这是预期的行为吗?如果是这样,也许我需要在onCreate中添加一个检查以查看应用程序是否首先位于前台?或者我的设置错了?

谢谢!

P.S。它是运行Jelly Bean 4.2.1的Galaxy Samsung。

后台服务代码:

@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?

1 个答案:

答案 0 :(得分:2)

您的服务作为应用程序的一部分运行,因此将为其创建应用程序。

大多数应用不需要扩展Application。没有看到你的所有代码,我很确定你也不需要。只需将显示内容的类扩展Activity给用户,然后在其中执行API。服务运行时不会创建。