Android 中服务 Class 的结构 - 问题和检查工作
The Structure of a Service Class in Android - Questions and Check Work
我目前正在恢复我一直在做的项目,并从头开始重新创建它。
但是,在创建服务 class 时,我注意到了一些事情 - 在我的旧项目中,服务中名为 onStartCommand 的方法包含所有需要触发的代码,而在我的新项目中,当我创建服务时 class,找不到这个方法
- 我是否需要手动添加此 "onStartCommand" 方法以包含我的服务代码?
- 如果没有,我的代码究竟会去哪里?似乎在我的 "old" 项目代码中,我完全注释块 public TimerService,并将 null 传递给 IBinder,然后创建 onStartCommand 等。我不太明白为什么。
- 当我在这里时,有人可以仔细检查下面我的 CountdownTimer 代码吗?如果它是正确的,我应该把它放在线程中吗?
当我创建一个新服务 Class 时,它看起来像这样:
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");
}
}
但是在我的旧项目中,我的服务 class 看起来像这样:
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
}
谢谢!
Do I need to manually ADD this "onStartCommand" method to contain my service code?
是的。
can someone please double-check my CountdownTimer code below?
仅在绝对必要时才创建服务。目前还不清楚为什么需要这项服务。
除此之外:
使用 stopSelf()
,而不是 stopService()
,从该服务内部停止该服务。
使用 START_STICKY
检查 Intent
extras 和 不是一个好的组合。 START_STICKY
说 "if you terminate my process to free up system RAM, please restart my service when possible, but pass null
for the Intent
"。这将导致您的服务崩溃 NullPointerException
.
我目前正在恢复我一直在做的项目,并从头开始重新创建它。
但是,在创建服务 class 时,我注意到了一些事情 - 在我的旧项目中,服务中名为 onStartCommand 的方法包含所有需要触发的代码,而在我的新项目中,当我创建服务时 class,找不到这个方法
- 我是否需要手动添加此 "onStartCommand" 方法以包含我的服务代码?
- 如果没有,我的代码究竟会去哪里?似乎在我的 "old" 项目代码中,我完全注释块 public TimerService,并将 null 传递给 IBinder,然后创建 onStartCommand 等。我不太明白为什么。
- 当我在这里时,有人可以仔细检查下面我的 CountdownTimer 代码吗?如果它是正确的,我应该把它放在线程中吗?
当我创建一个新服务 Class 时,它看起来像这样:
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");
}
}
但是在我的旧项目中,我的服务 class 看起来像这样:
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
}
谢谢!
Do I need to manually ADD this "onStartCommand" method to contain my service code?
是的。
can someone please double-check my CountdownTimer code below?
仅在绝对必要时才创建服务。目前还不清楚为什么需要这项服务。
除此之外:
使用
stopSelf()
,而不是stopService()
,从该服务内部停止该服务。使用
START_STICKY
检查Intent
extras 和 不是一个好的组合。START_STICKY
说 "if you terminate my process to free up system RAM, please restart my service when possible, but passnull
for theIntent
"。这将导致您的服务崩溃NullPointerException
.