检查服务是不是在 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 的 UI 线程上运行? [复制]
我如何检查运行我的应用程序的 Android 设备是不是在 4.2.2 及更低版本上运行 [重复]