6

我有一个上传活动,我从中调用 Intent 服务。在那里我正在处理 API 请求调用。

我想让一个活动知道服务是否正在运行,以显示上传标签。

我尝试以下以确定服务是否正在运行:

public void startUploadServiceTask() {
    if (Util.isNetworkAvailable(mContext)) {

        if (!isMyServiceRunning(UploadDriveService.class)) {

                startService(new Intent(mContext,
                        UploadService.class));

            }
        } else {
            Toast.makeText(mContext,
                    "Service is already running.", Toast.LENGTH_SHORT)
                    .show();
        }
    } else {
        Toast.makeText(mContext,
                getString(R.string.please_check_internet_connection),
                Toast.LENGTH_SHORT).show();
    }
}



private boolean isMyServiceRunning(Class<?> serviceClass) {
    ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    for (RunningServiceInfo service : manager
            .getRunningServices(Integer.MAX_VALUE)) {
        Log.e("ALL SERVICE", service.service.getClassName().toString());
        if (serviceClass.getName().equals(service.service.getClassName())) {

            return true;
        }
    }
    return false;
}

但是在活动管理器运行服务信息中,我没有得到我正在运行的意图服务类,所以这总是错误的。

我已将广播用于 API 调用响应。

我什至检查了这段代码。

if(startService(someIntent) != null) { 
 Toast.makeText(getBaseContext(), "Service is already running",     Toast.LENGTH_SHORT).show();
} else {
 Toast.makeText(getBaseContext(), "There is no service running, starting     service..", Toast.LENGTH_SHORT).show();
} 

但是在这段代码中,在检查服务时它也会再次启动服务,所以服务被调用了两次。

这个你能帮我吗。

4

2 回答 2

7

IntentService 需要实现onHandleIntent()这个方法在工作线程上调用,请求处理 Intent 请求,只要 IntentService 正在处理 Intent 请求,它就会“活着”(这里不考虑内存不足和其他核心情况,只是想在逻辑方面),

并且当所有请求都被处理后, IntentService 会自行停止,(因此您不应显式调用 stopSelf() )

有了这个理论,您可以尝试以下逻辑:
在 IntentService 类中声明一个类变量。
public static boolean isIntentServiceRunning = false;

@Override    
     protected void onHandleIntent(Intent workIntent) { 
        if(!isIntentServiceRunning) {
         isIntentServiceRunning = true;
       }
      //Your other code here for processing request
 }

如果您可以选择,在onDestroy()IntentService 类中设置isIntentServiceRunning = false;

并用于isIntentServiceRunning检查 IntentService 是否正在运行!

于 2015-02-04T10:13:19.723 回答
1

在您的代码中,您试图从 Activity 获取服务状态。正确的方法是状态应该由服务给出。

活动与服务通信有多种可能性,反之亦然。当您使用广播接收器时,您可以在服务启动时在 onHandleIntent() 方法中广播消息。

然后当您的任务完成或出现任何错误时,您可以再次调用广播接收器以获取服务完成事件。

这是一个不错的教程的链接

于 2015-02-03T12:45:31.187 回答