【问题标题】:FirebaseJobDispatcher onStopJob not triggeringFirebaseJobDispatcher onStopJob 未触发
【发布时间】: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 在传入和传出时间我只启动一项服务,但还有一些其他服务执行其他任务
  • 请给我一点时间

标签: android


【解决方案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 发布这个课程吗?
  • 我在这里创建了一个新问题stackoverflow.com/questions/51780753/…你能评论一下吗?
猜你喜欢
  • 1970-01-01
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-26
  • 2020-11-26
相关资源
最近更新 更多