Android 检查服务是否已在运行

Android 检查服务是否已在运行,android,Android,我在android应用程序中的应用程序类中启动了一项服务 这项服务每小时运行一次,我不希望它在每次打开应用程序时都启动,这似乎就是它现在所做的。我想检查它是否正在运行,如果没有,则运行它 在另一个我认为可行的答案中,但如果我运行两次应用程序,我仍然会从以下代码中收到消息“服务未运行,作业已安排”: public class App extends Application { public static final String TAG = "Application"; publ

我在android应用程序中的应用程序类中启动了一项服务

这项服务每小时运行一次,我不希望它在每次打开应用程序时都启动,这似乎就是它现在所做的。我想检查它是否正在运行,如果没有,则运行它

在另一个我认为可行的答案中,但如果我运行两次应用程序,我仍然会从以下代码中收到消息“服务未运行,作业已安排”:

public class App extends Application {

    public static final String TAG = "Application";
    public static final int JOB_NUMBER = 3007;

    @Override
    public void onCreate() {
        super.onCreate();
        if(!isMyServiceRunning(DevotionalService.class)) {
            ComponentName componentName = new ComponentName(this, DevotionalService.class);
            JobInfo info = new JobInfo.Builder(JOB_NUMBER, componentName)
                    .setRequiresCharging(false)
                    .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
                    .setPersisted(true)
                    .setPeriodic(60 * 60 * 1000)
                    .build();
            JobScheduler scheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
            int resultCode = scheduler.schedule(info);
            if (resultCode == JobScheduler.RESULT_SUCCESS) {
                Log.d(TAG, "Service is not running, Job Scheduled.");
            } else {
                Log.d(TAG, "Service is not running, However job scheduling failed.");
            }
        } else {
            Log.d(TAG, "Service is already running.");
        }
    }

    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;
    }

    public void cancelJob() {
        JobScheduler scheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
        scheduler.cancel(JOB_NUMBER);
        Log.d(TAG, "Job Cancelled.");
    }
}
公共类应用程序扩展应用程序{
公共静态最终字符串TAG=“Application”;
公共静态最终int作业编号=3007;
@凌驾
public void onCreate(){
super.onCreate();
如果(!isMyServiceRunning(DevigationalService.class)){
ComponentName ComponentName=新的ComponentName(这是DevigationalService.class);
JobInfo=new JobInfo.Builder(作业编号、组件名称)
.SetRequirementRescharging(错误)
.setRequiredNetworkType(作业信息.网络类型\u未测量)
.setPersisted(true)
.setPeriodic(60*60*1000)
.build();
JobScheduler=(JobScheduler)getSystemService(作业调度程序服务);
int resultCode=scheduler.schedule(信息);
if(resultCode==JobScheduler.RESULT\u SUCCESS){
Log.d(标记“服务未运行,作业已调度”);
}否则{
d(标记“服务未运行,但作业调度失败”);
}
}否则{
Log.d(标记“服务已在运行”);
}
}
专用布尔值isMyServiceRunning(类serviceClass){
ActivityManager=(ActivityManager)getSystemService(Context.ACTIVITY_服务);
对于(ActivityManager.RunningServiceInfo服务:manager.getRunningServices(Integer.MAX_值)){
if(serviceClass.getName().equals(service.service.getClassName())){
返回true;
}
}
返回false;
}
public void取消作业(){
JobScheduler=(JobScheduler)getSystemService(作业调度程序服务);
计划程序。取消(作业编号);
Log.d(标记“作业已取消”);
}
}

有人知道为什么会这样吗?

要检查服务是否正在运行:

class MyService extends Service {
   private static boolean isRunning;
   public int onStartCommand (Intent intent, 
                int flags, 
                int startId) {
        isRunning = true;
        ...
   }
   public void onDestroy() {
       isRunning = false;
   }
   public static boolean isRunning() { 
       return isRunning;
   }
}
然后要检查它是否正在运行,只需检查MyService.isRunning()

要检查是否计划了服务,请执行以下操作:

if(JobScheduler.getPendingJob(jobID) == null) {
   //job notscheduled
}

要检查服务是否正在运行,请执行以下操作:

class MyService extends Service {
   private static boolean isRunning;
   public int onStartCommand (Intent intent, 
                int flags, 
                int startId) {
        isRunning = true;
        ...
   }
   public void onDestroy() {
       isRunning = false;
   }
   public static boolean isRunning() { 
       return isRunning;
   }
}
然后要检查它是否正在运行,只需检查MyService.isRunning()

要检查是否计划了服务,请执行以下操作:

if(JobScheduler.getPendingJob(jobID) == null) {
   //job notscheduled
}

当应用程序被终止时销毁服务不是一个选项?@Greggz否,它每小时检查一次,以了解是否有来自网站的新通知等。当应用程序被终止时销毁服务不是一个选项?@Greggz否,它每小时检查一次,以了解是否有来自网站的新通知等。嗯,有趣!!你的回答让我觉得我的问题措辞不正确。我不想知道它是否在运行,只是它是否已经被安排在未来运行,比如,“我已经安排好了这项服务吗?”@Chud37好的,是的,这是一个完全不同的问题。但是您发布的代码示例也不会这样做,它还会查看当前正在运行的代码。ActivityManager.getRunningServices()对将来计划的内容一无所知。@Chud37如果需要,请尝试JobScheduler.getPendingJob(int-jobID)。如果已经安排好了,那么将返回非空。谢谢,如果您想发布替代答案,我会将其标记为正确。我现在无法删除此线程!抱歉搞混了!嗯,很有趣!!你的回答让我觉得我的问题措辞不正确。我不想知道它是否在运行,只是它是否已经被安排在未来运行,比如,“我已经安排好了这项服务吗?”@Chud37好的,是的,这是一个完全不同的问题。但是您发布的代码示例也不会这样做,它还会查看当前正在运行的代码。ActivityManager.getRunningServices()对将来计划的内容一无所知。@Chud37如果需要,请尝试JobScheduler.getPendingJob(int-jobID)。如果已经安排好了,那么将返回非空。谢谢,如果您想发布替代答案,我会将其标记为正确。我现在无法删除此线程!抱歉搞混了!