我有一个 IntentService 执行以下操作:
protected void onHandleIntent(Intent intent) {
// TODO Auto-generated method stub
while (true) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Hello, World!");
}
}
以上是我正在使用的代码示例。我打算将 println() 替换为发送到服务器的 HTTP 请求,但现在我将其用作测试。我这样调用 startService() :
@Override
public void onPause() {
ConnectionUtility.getInstance().startService(this);
super.onPause();
}
@Override
public void onDestroy() {
ConnectionUtility.getInstance().startService(this);
super.onDestroy();
}
@Override
public void onStop() {
ConnectionUtility.getInstance().startService(this);
super.onStop();
}
我的自定义 startService 方法在哪里执行此操作:
public void startService(Activity activity) {
if (!isMyServiceRunning(activity)) {
Intent intent = new Intent(activity, BackgroundUpdateService.class);
activity.startService(intent);
}
}
注意: isMyServiceRunning() 方法是我在其他地方找到的用于确定服务是否正在运行的自定义方法。据我所知,该方法有效。
现在,此服务的目的是在特定 Activity 退出时(通过 onPause()、onDestroy() 或 onStop())触发 println(),并且当 onCreate() 或 onResume() 运行时,该服务将像这样停止:
@Override
public void onResume() {
ConnectionUtility.getInstance().stopServiceIfRunning(this);
super.onResume();
}
更深入地了解 stopServiceIfRunning():
public void stopServiceIfRunning(Activity activity) {
if (isMyServiceRunning(activity)) {
Intent intent = new Intent(activity, BackgroundUpdateService.class);
activity.stopService(intent);
}
}
现在问题来了:我可以正常启动服务,当我通过 Home/Back 按钮退出 Activity 或切换到不同的 Activity 时,startService() 方法启动并完美运行;也就是说,“你好,世界!” 根据需要每 5 秒打印一次。但是当我导航回 Activity 时,我可以确定我的自定义 stopServiceIfRunning() 方法运行并且代码正常进入 IF 块(已确认),但是服务没有停止并且“Hello,World!”只是保持未来。我究竟做错了什么?
---编辑---回应塞拉芬的评论:
private boolean isMyServiceRunning(Activity activity) {
ActivityManager manager = (ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE);
for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if (BackgroundUpdateService.class.getName().equals(service.service.getClassName())) {
return true;
}
}
return false;
}
但同样,到目前为止,这种方法可以准确地返回真假值,所以我认为这不是问题所在。