1

我目前正在恢复我一直在从事的项目,并从头开始重新创建它。
但是,在创建 Service 类时,我注意到了一些事情 - 在我的旧项目中,Service 内部的一个名为 onStartCommand 的方法包含所有需要触发的代码,而在我的新项目中,当我创建一个 Service 类时,这个方法是无处可寻。

- 我需要手动添加这个“onStartCommand”方法来包含我的服务代码吗?

- 如果没有,我的代码究竟会去哪里?似乎在我的“旧”项目代码中,我完全注释块公共 TimerService,并将 null 传递给 IBinder,并创建 onStartCommand 等。我不太明白为什么。

- 当我在这里时,有人可以仔细检查我下面的 CountdownTimer 代码吗?如果它是正确的,我应该把它放在一个线程中吗?


当我创建一个新的服务类时,它看起来像这样:

public class TimerService extends Service {

    public TimerService() {

    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");

    }

}


但是在我的旧项目中,我的服务类如下所示:

public class TimerService extends Service {

/*
public TimerService() {

}
*/

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

@Override
public int onStartCommand(final Intent intent, int flags, int startId) {

    intent.getStringExtra("TIMER_VALUE");

    String string_timerValue;
    string_timerValue = intent.getStringExtra("TIMER_VALUE");

    long long_timerValue;
    long_timerValue = Long.parseLong(String.valueOf(string_timerValue));

    // I DO NOT WANT ANY TICK VALUE, SO GIVE IT FULL TIMER VALUE
    long long_tickValue;
    long_tickValue = Long.parseLong(String.valueOf(string_timerValue));

    new CountDownTimer(long_timerValue, long_tickValue) {

        public void onTick(long millisUntilFinished) {
            // DO NOTHING
        }

        public void onFinish() {

            Toast.makeText(TimerService.this, "TIMES UP", Toast.LENGTH_LONG).show();

            stopService(intent);

        }
    }.start();

    return START_STICKY;

    // END OF onStartCommand
}

@Override
public void onDestroy() {
    super.onDestroy();

    Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();
}

// END OF ENTIRE SERVICE CLASS
}


谢谢你!!

4

1 回答 1

0

我是否需要手动添加这个“onStartCommand”方法来包含我的服务代码?

是的。

有人可以在下面仔细检查我的 CountdownTimer 代码吗?

仅在绝对必要时才创建服务。目前尚不清楚为什么需要这项服务。

除此之外:

  • 使用stopSelf(), notstopService()来从该服务内部停止该服务。

  • 检查Intent额外内容使用START_STICKY不是一个好的组合。START_STICKY说“如果您终止我的进程以释放系统 RAM,请尽可能重新启动我的服务,但通过nullIntent。这将导致您的服务因NullPointerException.

于 2019-01-15T21:01:41.533 回答