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

Posted

技术标签:

【中文标题】如何检查 JobService 是不是在 android 中运行?【英文标题】:How to check JobService is running or not in android?如何检查 JobService 是否在 android 中运行? 【发布时间】:2018-03-14 14:17:44 【问题描述】:

我在我的项目中使用 JobService。它运作良好。但有时服务停止。它不会再次重新启动。因此,如果未运行,我将尝试对 JobService 进行分层。但我不知道如何检查 JobService 是否已经运行。请让我知道如何检查 JobService 是否正在运行。

我的工作服务类:

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public class JobService extends android.app.job.JobService 
    @Override
    public boolean onStartJob(JobParameters params) 
        if (NetworkHandler.getInstance().isNetworkAvailable()) 
            TaskHandler.getInstance().getTaskListFromServer(PreferenceManagerForPlannedRoute.getInstance().getLastSyncTime(), PreferenceManagerForPlannedRoute.getInstance().getInProgressMoveTask());
            NotificationUtils.getInstance().CreateNotification();
            Logger.d("Scheduler", "Working!!");
         else 
            Logger.d("Network", "not available");
        
        return false;
    


    @Override
    public boolean onStopJob(JobParameters params) 
        Logger.d("onStopJob", "Stopped");
        return true;
    

我的实用类:

public class JobSchedulerUtils 

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public static void scheduleJob(Context context) 
        ComponentName serviceComponent = new ComponentName(context, JobService.class);
        JobInfo.Builder builder = new JobInfo.Builder(0, serviceComponent);
        builder.setRequiresDeviceIdle(false);
        builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);
        builder.setPeriodic(5000);
        builder.setPersisted(true);           
        JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
        jobScheduler.schedule(builder.build());
    

开始:

synchronized public void startAlarmManager() 
        if(Build.VERSION.SDK_INT>=21) 
            JobSchedulerUtils.scheduleJob(Application.getInstance().getApplicationContext());
        else 
            Intent myIntent = new Intent(Application.getInstance(), AlarmManagerForPlannedRoute.class);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(Application.getInstance(), 0, myIntent, 0);
            AlarmManager alarmManager = (AlarmManager) Application.getInstance().getSystemService(Context.ALARM_SERVICE);
            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis(), Constants.TIME_DELAY_FOR_TASK_LIST_SERVICE_CALL_IN_SECONDS * 1000, pendingIntent);
        
    

停止:

 synchronized private void stopAlarmManager(Activity activity) 
        if(Build.VERSION.SDK_INT>=21)
            JobScheduler jobScheduler = (JobScheduler) Application.getInstance().getApplicationContext().getSystemService(Context.JOB_SCHEDULER_SERVICE);
            jobScheduler.cancelAll();
        else 
            Intent myIntent = new Intent(activity, AlarmManagerForPlannedRoute.class);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(activity, 0, myIntent, 0);
            AlarmManager alarmManager = (AlarmManager) activity.getSystemService(Context.ALARM_SERVICE);
            alarmManager.cancel(pendingIntent);
        
    

【问题讨论】:

***.com/questions/600207/… @sparkss.. 我试过这个。它总是显示作业没有运行,即使作业运行成功.. 【参考方案1】:

我得到了解决方案。

public static boolean isJobServiceOn( Context context ) 
    JobScheduler scheduler = (JobScheduler) context.getSystemService( Context.JOB_SCHEDULER_SERVICE ) ;

    boolean hasBeenScheduled = false ;

    for ( JobInfo jobInfo : scheduler.getAllPendingJobs() ) 
        if ( jobInfo.getId() == JOB_ID ) 
            hasBeenScheduled = true ;
            break ;
        
    

    return hasBeenScheduled ;

使用这个方法我们可以检查jobService是否在运行。

【讨论】:

@Alex.F 那么如何检查作业是否正在运行?请让我知道以改进我的代码和答案。 从 API 24 (Nougat) 你可以使用简单的scheduler.getPendingJob(JOB_ID) != null @sosite.. 我想我使用的是相同的。对吧?? 有什么方法可以检查 JobDispatcher 是否正在运行? 答案不正确!问题是关于跑步与否。作业可能已安排,但未运行。

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

JobScheduler 和 JobService

如何将房间实例传递给 JobService?

如何防止 JobService 使用的 AsyncTask 中的上下文泄漏

如何从扩展 JobService 的类中调用将视图作为参数的 MainActivity 方法?

Android--使用JobService实现进程保活

当应用程序从后台删除时,如何停止 JobService Scheduled?