Android 检查服务是否已在运行
我在android应用程序中的应用程序类中启动了一项服务 这项服务每小时运行一次,我不希望它在每次打开应用程序时都启动,这似乎就是它现在所做的。我想检查它是否正在运行,如果没有,则运行它 在另一个我认为可行的答案中,但如果我运行两次应用程序,我仍然会从以下代码中收到消息“服务未运行,作业已安排”:Android 检查服务是否已在运行,android,Android,我在android应用程序中的应用程序类中启动了一项服务 这项服务每小时运行一次,我不希望它在每次打开应用程序时都启动,这似乎就是它现在所做的。我想检查它是否正在运行,如果没有,则运行它 在另一个我认为可行的答案中,但如果我运行两次应用程序,我仍然会从以下代码中收到消息“服务未运行,作业已安排”: public class App extends Application { public static final String TAG = "Application"; publ
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)。如果已经安排好了,那么将返回非空。谢谢,如果您想发布替代答案,我会将其标记为正确。我现在无法删除此线程!抱歉搞混了!