检查服务是不是在 Android 上运行?

Posted

技术标签:

【中文标题】检查服务是不是在 Android 上运行?【英文标题】:Check if service is running on Android?检查服务是否在 Android 上运行? 【发布时间】:2013-07-09 11:04:09 【问题描述】:

我想检查服务是否正在运行 我写了这段代码

public class startServiceOrNo 
public static void startServiceIfItsNotRuning(Class<?> class1, Context context) 
    ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) 
        if (class1.getName().equals(service.service.getClassName())) 
            Lg.d("servisstart SERVICE ALREADY START" + class1.getName());
            return;
        
    
    Lg.d("servisstart SSERVICE NEW SERVIS " + class1.getName());
    context.startService(new Intent(context, class1));

并使用它 startServiceOrNo.startServiceIfItsNotRuning(OfflineChopsMonitor.class,this)

如果我检查一个类的服务它的工作,但如果我检查不同类的相同服务,它的检查不起作用

【问题讨论】:

你想要什么?你想检查服务是否正在运行?? 请查看这个***.com/questions/600207/… 【参考方案1】:

1.) 在 Activity 类中:

private boolean isMyServiceRunning(Class<?> serviceClass) 
    ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) 
        if (serviceClass.getName().equals(service.service.getClassName())) 
            return true;
        
    
    return false;

2.) 在非活动类(BroadcastReceiver)中:

private boolean isMyServiceRunning(Class<?> serviceClass,Context context) 
        ActivityManager manager = (ActivityManager)context. getSystemService(Context.ACTIVITY_SERVICE);
        for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) 
            if (serviceClass.getName().equals(service.service.getClassName())) 
                Log.i("Service already","running");
                return true;
            
        
        Log.i("Service not","running");
        return false;
    

【讨论】:

注意 getRunningServices 已被弃用。 感谢您划分活动和非活动。它使我的工作更轻松。【参考方案2】:

为什么不让服务自己解决这个问题?

public class MyService extends Service

    private boolean mRunning;

    @Override
    public void onCreate()
    
        super.onCreate();
        mRunning = false;
    

    @Override
    public int onStartCommand(Intent intent, int flags, int startId)
    
        if (!mRunning) 
            mRunning = true;
            // do something
        
        return super.onStartCommand(intent, flags, startId);
    

【讨论】:

但是你如何从你的意图中访问你的服务对象呢? 你将如何从其他活动/片段中使用它来检查服务是否正在运行? @IgorGanapolsky 你不会 不需要使用静态变量吗? 无用的答案。服务死了怎么办?【参考方案3】:

我在活动中使用以下内容:

private boolean isMyServiceRunning(Class<?> serviceClass) 
  ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
  for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) 
    if (serviceClass.getName().equals(service.service.getClassName())) 
        return true;
    
  
  return false;

【讨论】:

活动管理器。 getRunningServices 已弃用【参考方案4】:

你可以在 Kotlin 中使用这个方法

fun Activity.isServiceRunning(serviceClassName: String): Boolean 
    val manager = getSystemService(ACTIVITY_SERVICE) as ActivityManager
    return manager.getRunningServices(Integer.MAX_VALUE).any  it.service.className == serviceClassName 

【讨论】:

【参考方案5】:

检查服务是否正在运行 如果我的情况:Open***Service.class 是我的服务类

if (isMyServiceRunning(Open***Service.class)) 
                success_txt.setVisibility(View.VISIBLE);
             else 
                success_txt.setVisibility(View.GONE);
            





 private boolean isMyServiceRunning(Class<?> serviceClass) 
        ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) 
            if (serviceClass.getName().equals(service.service.getClassName())) 
                return true;
            
        
        return false;
    

【讨论】:

以上是关于检查服务是不是在 Android 上运行?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查应用程序是不是在 Android 上运行?

当应用程序在真正的Android设备上运行时,虚线实际上不是虚线

如何检查是不是在 Android 的 UI 线程上运行? [复制]

我如何检查运行我的应用程序的 Android 设备是不是在 4.2.2 及更低版本上运行 [重复]

如何检查 JobService 是不是在 android 中运行?

如何在真实设备上运行 Android 应用程序?