4

我正在关注“Beginning Android 4 Development”一书,并且正在使用按钮的以下功能控制服务:

public void startService(View view) {
    startService(new Intent(getBaseContext(), QOLService.class));
}

public void stopService(View view) {
    stopService(new Intent(getBaseContext(), QOLService.class));
}

QOLService.java 包括

public class QOLService extends Service {

    int counter = 0;

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        //Keep running service until stopped, so return sticky
        Timer timer=new Timer();
        TimerTask tt =new TimerTask() {
            @Override
            public void run() {
                Log.d("QOLService", String.valueOf(++counter));
                }
        };

        timer.scheduleAtFixedRate(tt, 0, 1000);

        Toast.makeText(this, "Service started", Toast.LENGTH_LONG).show();
        return START_STICKY;
    }


    @Override
    public void onDestroy() {
        super.onDestroy();
        Toast.makeText(this, "Service destroyed", Toast.LENGTH_LONG).show();
    }

正如预期的那样,在按下开始按钮时,我得到了“服务启动”toast,在 logcat 中,我每秒都会收到一条递增的消息。即使在应用程序关闭时,这种情况也会按预期继续。

当我单击 stopservice 按钮时,我也会收到预期的“服务已损坏”消息,但计时器仍然存在!如果我关闭应用程序,它仍然会继续运行。如果我再次单击 stopservice 按钮,它不会给出服务销毁消息,就好像它第一次被成功销毁一样。

我是否不恰当地调用我的计时器?如果是这样,我似乎完全按照书中的建议去做了!

4

3 回答 3

7

我是否不恰当地调用我的计时器?

你永远不会停止计时器。因此,它将继续运行,直到进程终止。您应该在onDestroy().

于 2012-08-24T23:59:20.647 回答
4

我同意 CommonsWare,你没有在代码中停止你的计时器。建议你走这条路

public class QOLService extends Service {

    int counter = 0;
    Timer timer;
    TimerTask tt;

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        //Keep running service until stopped, so return sticky
        timer=new Timer();
        tt =new TimerTask() {
            @Override
            public void run() {
                Log.d("QOLService", String.valueOf(++counter));
                }
        };

        timer.scheduleAtFixedRate(tt, 0, 1000);

        Toast.makeText(this, "Service started", Toast.LENGTH_LONG).show();
        return START_STICKY;
    }


    @Override
    public void onDestroy() {
        super.onDestroy();
        Toast.makeText(this, "Service destroyed", Toast.LENGTH_LONG).show();
        tt.cancel();
        timer.cancel();
    }
}

cancel() 方法也会停止你的 Timer。

于 2012-08-25T03:03:47.530 回答
0

这可能是因为系统正在尝试重新启动您的服务,因为您正在START_STICKYonStartCommand. 尝试返回START_NOT_STICKY

于 2012-08-24T23:58:46.017 回答