Android中onHandleIntent和onStartCommand的区别

16

我目前正在编写一个需要使用 IntentService 的安卓程序。但当我将代码放在 onHandleIntent 函数中时,代码不会运行,但在 MainActivity 中没有出现错误。但是当我将代码复制到 onStartCommand 中时,它能够正常运行。

问题在于我想知道 onHandleIntentonStartCommand 之间的区别。谢谢。

代码:

onHandleIntent 中的代码:

System.out.println("SERVICE STARTED! ! !");
//System.out.println(intent.getBooleanExtra("once", Boolean.FALSE));
if (intent.getBooleanExtra("once", Boolean.FALSE)) {
    Check();
}
mHandler.postDelayed(mRunnable, 3000);
3个回答

42

根据文档IntentService执行以下操作:

  • 创建一个默认的工作线程,该线程独立于您应用程序的主线程,执行传递给onStartCommand()的所有意图。
  • 创建一个工作队列,将每个意图按顺序传递到您的onHandleIntent()实现中,因此您永远不必担心多线程问题。
  • 在处理所有启动请求后停止服务,因此您永远不必调用stopSelf()
  • 提供了一个默认的onBind()实现,返回null
  • 提供了一个默认的onStartCommand()实现,将意图发送到工作队列,然后再发送到您的onHandleIntent()实现中。

还有:

所有这些都意味着,您只需要实现onHandleIntent()方法即可完成客户端提供的工作。(不过,您还需要为服务提供一个小构造函数。)

因此,IntentService是一个具有这些特殊属性的“自定义”Service。因此,除非您使用常规的Service类,否则根本不需要重写onStartCommand(),实际上不应该这样做

IntentService的一些用法示例:

Activity.java

Intent it = new Intent(getApplicationContext(), YourIntentService.class);
it.putExtra("Key", "Value");
startService(it);

YourIntentService.java

public YourIntentService() {
    super("YourIntentService");
}

@Override
protected void onHandleIntent(Intent intent) {

    if (intent != null) {
        String str = intent.getStringExtra("key");
        // Do whatever you need to do here.
    }
    //...
}
您也可以查看这个教程这个教程了解有关ServiceIntentService的更多信息。
此外,请查看文档

3
哇,这篇回答非常详尽,好棒啊! - AdamMc331
我已经学习了这些教程,它们非常棒!但问题是我没有重写onStartCommandonHandleIntent方法吗? - Chromium
你在问题中说过你重写了onStartCommand,但是在IntentService中不应该这样做。应该使用onHandleIntent代替,它会自动调用。 - Mauker
不,我没有覆盖它们两个。所以解决方案是将我的代码放在onHandleIntent()函数中,覆盖它,并且只在onStartCommand()函数中留下return Service.START_STICKY;而不覆盖它。这样正确吗? - Chromium
1
实际上,如果您正在使用IntentService,则根本不需要编写onStartCommand方法。将逻辑放在onHandleIntent中即可。 - Mauker

5

onStartCommand() 方法是用于 Service 的。而在使用 IntentService 时应该使用 onHandleIntent() 方法。 IntentService 继承自 Service。根据文档的说明:

"你不应该覆盖 IntentService 的此方法(onStartCommand)。相反,应该覆盖 onHandleIntent(Intent) 方法,在 IntentService 接收到启动请求时系统会调用此方法。"

如果已经覆盖了 onStartCommand() 方法,那么可能就无法调用你的 onHandleIntent() 方法。


3
如жһњењЁдҢүз”ЁIntentService时覆盖дғ†onStartCommand()ж–№жі•пәЊй™¤йқһдҢ ењЁиҮӨж–№жі•зљ„жњЂеђҺдёЂиҰЊеЉ е…Өreturn super.OnStartCommand(intent, flags, startId)иҮ­еЏӨпәЊеђ¦е€™е°†дёҚдәљи°ѓз”ЁonHandleIntent()ж–№жі•гЂ‚иҮ·жіЁж„ЏпәЊж­¤зү»иҮ‘жњҒеЊ…еђ«и§Әй‡Љж€–е…¶д»–е†…е®№гЂ‚ - GeertVc

2

你不应该覆盖 IntentServiceonStartCommand() 方法。

如果你这样做了,请确保要 return super.onStartCommand(); ,因为这会将 Intent 发送到工作队列,然后再发送到你的 onHandleIntent() 实现中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接