FirebaseJobDispatcher onStopJob 未触发

Posted

技术标签:

【中文标题】FirebaseJobDispatcher onStopJob 未触发【英文标题】:FirebaseJobDispatcher onStopJob not triggering 【发布时间】:2019-01-09 18:47:51 【问题描述】:

当拨出电话或来电发生时,我正在开始工作

 Bundle bundle = new Bundle();
    bundle.putString("MobileNumber", number);
    bundle.putString("CallStatus", "OUT");
    FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(ctx));
    Job myJob = dispatcher.newJobBuilder()
            .setService(FirebaseRecordingService.class) // the JobService that will be called
            .setTag("my-unique-tag1")        // uniquely identifies the job
            .setExtras(bundle)
            .build();

    dispatcher.mustSchedule(myJob);

这次 onStartJob 执行了 现在我在通话结束后停止工作

 FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(ctx));
        dispatcher.cancel("my-unique-tag1");

但这一次 onStopJob 没有执行。 谁能告诉我哪里做错了。

【问题讨论】:

您是否尝试过使用作业 ID 来启动和停止它? @quicklearner 我如何在 FirebaseJobDispatcher 中使用作业 ID???? 您是一次只启动一项服务还是另一种服务? @quicklearner 在传入和传出时间我只启动一项服务,但还有一些其他服务执行其他任务 请给我一点时间 【参考方案1】:

试试这个解决方案来解决你的问题

当您开始作业时,只需使用此方法检查FirebaseRecordingService.Class 服务类是否正在运行

 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;
    

你的代码看起来像这样

if (isMyServiceRunning(context_here)) 
                                    System.out.println("service already started stopping now");
                                    stopService(new Intent(context_here, FirebaseRecordingService.class));
                                
Bundle bundle = new Bundle();
    bundle.putString("MobileNumber", number);
    bundle.putString("CallStatus", "OUT");
    FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(ctx));
    Job myJob = dispatcher.newJobBuilder()
            .setService(FirebaseRecordingService.class) // the JobService that will be called
            .setTag("my-unique-tag1")        // uniquely identifies the job
            .setExtras(bundle)
            .build();
    dispatcher.mustSchedule(myJob);

然后到何时执行工作以停止作为firebase作业的服务

这样做

if (isMyServiceRunning(context_here)) 
    System.out.println("service already started stopping now");
        stopService(new Intent(context_here,FirebaseRecordingService.class));
                                

不要这样称呼

FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(ctx));

它将创建 FirebaseJobDispatcher 类的另一个对象使用 用于启动作业服务的声明对象

dispatcher.cancel("my-unique-tag1");

或者,如果一次只运行一项服务,您可以调用

dispatcher.cancelAll();

【讨论】:

我怎样才能获得以前的 firebasejobdispatcher 对象,因为如果应用程序被杀死,它将为空。我应该使用 dispatcher.cancel() 来停止服务还是 stopService()? 对于这种情况你应该停止而不是调用 dispatcher.cancel() ,最好停止服务而不是取消调度程序 我尝试使用 stopService() 来停止,但它不起作用。即使在 stopService() 方法之后,isMyServiceRunning(context_here) 方法也总是返回 true 你能在 FirebaseRecordingService.class 发布这个课程吗? 我在这里创建了一个新问题***.com/questions/51780753/…你能评论一下吗?

以上是关于FirebaseJobDispatcher onStopJob 未触发的主要内容,如果未能解决你的问题,请参考以下文章

从 FirebaseJobDispatcher 迁移到 AndroidX Workmanager 时:如何在 startWork 中返回 ListenableFuture? [复制]

如何使用 Firebase JobDispatcher

为啥 Firebase JobDispatcher 运行 JobService 2 次?

Firebase Jobdispatcher - 现在开始并重复

Firebase jobdispatcher 未在指定窗口内触发

如何在 Firebase 作业调度程序中检测网络断开连接?