首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从intentservcie回调到jobservice

从intentservcie回调到jobservice
EN

Stack Overflow用户
提问于 2016-07-29 06:25:39
回答 2查看 2.8K关注 0票数 6

我有一个作业调度程序,可以触发作业服务的onStartjob。在onStartJob中,我启动了一个intentservice来完成这项工作。工作完成后,我想让intentservice回调jobservice,这样就可以调用onjobfinished了。如何回调JobService?

EN

回答 2

Stack Overflow用户

发布于 2016-07-29 12:11:12

您可以使用一些动作常量(例如ACTION_DOWNLOAD_FINISHED)在onStartJob()方法的Jobservice中创建BroadcastReceiver并注册它。此接收器将把所有工作委托给onJobFinished()方法:

代码语言:javascript
运行
复制
public static final String ACTION_DOWLOAD_FINISHED = "actionDownloadFinished";

private BroadcastReceiver downloadFinishedReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) { 
        context.unregisterReceiver(this); //Unregister receiver to avoid receiver leaks exception
        onJobFinished();
    }
};

public void onStartJob() {
    IntentFilter filter = new IntentFilter(ACTION_DOWNLOAD_FINISHED);        
    //Use LocalBroadcastManager to catch the intents only from your app
    LocalBroadcastManager.getInstance(this).registerReceiver(downloadFinishedReceiver , filter);

    //other job starting stuff...
}

然后,在意图服务结束它的工作后,您可以从它发送带有ACTION_DOWNLOAD_FINISHED操作的广播意图:

代码语言:javascript
运行
复制
// ...downloading stuff
Intent downloadFinishedIntent = new Intent(Jobservice.ACTION_DOWNLOAD_FINISHED);
//Use LocalBroadcastManager to broadcast intent only within your app
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);

当意图服务的任务完成时,它发送由在Jobservice中注册的接收器捕获的广播意图。接收器然后调用onJobFinished()方法。

您可以在以下位置找到详细信息:https://developer.android.com/training/run-background-service/report-status.html

票数 3
EN

Stack Overflow用户

发布于 2016-09-05 01:35:58

我正在做同样的事情(启动IntentService的JobService),下面是我所做的:

简单地说,我使用了一个带有Handler.Callback的处理程序,我可以将它作为信使传递给我的IntentService,这样IntentService就可以向Handler.Callback发送一条消息来完成这项工作。Handler.Callback可以看到我的JobService,所以它可以调用finishJob(...)。

代码语言:javascript
运行
复制
public class MyJobService extends JobService implements Handler.Callback {

  private Handler mHandler = new Handler(this);

  public static final String BNDL_MESSENGER = "messenger";
  public static final String BNDL_PARAMS    = "params";

  public static final int FINISH_JOB_MESSAGE     = 100;
  public static final int NEEDS_RESCHEDULE_TRUE  = 0;
  public static final int NEEDS_RESCHEDULE_FALSE = 1;

  public boolean handleMessage(Message msg) {
    int msgType = msg.what;

    if (msgType == FINISH_JOB_MESSAGE) {
      int           jobId           = msg.arg1;
      JobParameters params          = (JobParameters)msg.obj;
      boolean       needsReschedule = (msg.arg2 == NEEDS_RESCHEDULE_TRUE);

      Log.i(TAG, "Finishing Job ID: " + jobId);
      jobFinished(params, needsReschedule);
    } else {
      Log.e(TAG, "Message type not supported: " + msgType);
    }    
  }

  @Override
  public boolean onStartJob(JobParameters params) {

    Intent intent = new Intent(this, MyIntentService.class);
    intent.putExtra(BNDL_MESSENGER, new Messenger(mHandler));
    intent.putExtra(BNDL_PARAMS, params);

    startService(intent);                      
  }
}

然后你的IntentService会发回一条消息:

代码语言:javascript
运行
复制
public class MyIntentService extends IntentService {
  @Override
  public void onHandleIntent(Intent intent) {
    Messenger messenger = (Messenger)intent.getParcelableExtra(MyJobService.BNDL_MESSENGER);
    JobParameters params = (JobParameters)intent.getParcelableExtra(MyJobService.BNDL_PARAMS);

    if (messenger != null) {
      Message msg = Message.obtain();
      msg.what = MyJobService.FINISH_JOB_MESSAGE;
      msg.arg1 = params.getJobId();
      msg.arg2 = MyJobService.NEEDS_RESCHEDULE_TRUE;
      msg.obj  = params;

      try {
        messenger.send(msg);
      } catch (RemoteException re) {
        Log.e(TAG, "Couldn't send message to finish job!", re);
      }
    }
  }
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38647733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档