Android:如何确定 IntentService 是不是正在运行?

Posted

技术标签:

【中文标题】Android:如何确定 IntentService 是不是正在运行?【英文标题】:Android: How to determine if IntentService is running?Android:如何确定 IntentService 是否正在运行? 【发布时间】:2015-04-02 15:15:57 【问题描述】:

我有一个上传活动,我从中调用 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;

但是在 Activity Manager Running Service Info 中,我没有得到我正在运行的意图服务类,所以这总是错误的。

我已将广播用于 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();
 

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

请帮帮我。

【问题讨论】:

试试这个:***.com/a/17591175/2798289 这绝对是你想要的:***.com/questions/7440473/… 【参考方案1】:

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

当所有请求都处理完毕后,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 是否正在运行!

【讨论】:

这不是线程安全的,因为 onDestroy() 是在与 onHandleIntent() 不同的线程中调用的。您应该用 synchronized() 块包围额外的代码。 如何从一个Activity中获取服务实例?问题是使用 ActivityManager,但 android 文档说这仅用于测试和调试,所以这个解决方案还不够好。 developer.android.com/reference/android/app/…【参考方案2】:

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

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

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

这里是 link 的一个很好的教程。

【讨论】:

如果服务已经启动并且我去另一个活动并返回到上传活动并且那个时间服务正在运行但我无法得到任何响应并且有问题我已经写了我使用的代码怎么办示例中的相同代码。 在这种情况下,您可以在广播接收器中使用状态字段并根据服务状态更改其值。每当您的活动获得焦点时,您都​​可以检查此值。 @SandeepSolanki:您能否详细说明您的解决方案以回应 Ruchit Shah 的回复。一般广播接收器在Activity的onResume()方法中注册,在Activity的onPause()方法中注销。在广播接收器未注册时,如何为广播接收器的状态字段(您描述的)分配一个值,并且可以在 Activity 中获取相同的值?

以上是关于Android:如何确定 IntentService 是不是正在运行?的主要内容,如果未能解决你的问题,请参考以下文章

Android:如何确定 IntentService 是不是正在运行?

如何确定Android应用程序是不是被强制关闭?

如何确定Android源代码的版本?

如何确定 Android 库的正确版本?

如何确定图像是在 Android 的适配器中单击

如何确定我的 android 应用程序是不是存在内存泄漏?