我有一个上传活动,我称之为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;
}
但是在活动管理器运行服务信息中,我没有得到我正在运行的意向服务类,所以这总是错误的。
我已经使用Broadcast for 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();
}
但是在这段代码中,在检查服务时它也会再次启动服务,因此服务被调用两次。
请帮我解决这个问题。
答案 0 :(得分:6)
IntentService需要实现onHandleIntent()
这个方法是在工作线程上调用的,请求处理Intent请求,而IntentService将是&#34; alive&#34;只要它正在处理一个意图请求(这里没有考虑低内存和其他核心情况,只是考虑逻辑),
当处理完所有请求后,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
}
如果您可以选择在IntentService类的onDestroy()
中,请设置isIntentServiceRunning = false;
使用isIntentServiceRunning
检查IntentService是否正在运行!
答案 1 :(得分:1)
在您的代码中,您尝试从“活动”获取服务状态。正确的方法是服务应该提供状态。
活动与服务进行通信有多种可能性,反之亦然。当您使用广播接收器时,您可以在服务启动时在onHandleIntent()方法中广播消息。
然后当您的任务完成或出现任何错误时,您可以再次呼叫广播接收器以获取服务已完成的事件。
这是一个很好的教程link。