onStartCommand中传递的Intent为NULL的原因


100

onStartCommand(Intent, int, int)除了系统通过诸如这样的标志重新启动服务之外,传递给Intent的其他任何原因还有START_STICKY吗?

同样,当服务由系统重新启动时,该Intent.getAction()方法有时会返回NULL...。意图不是NULLgetAction()

我也问过这里,但是还没有收到答案。

UPDATE:马克·墨菲聊天后,他建议我返回START_REDELIVER_INTENTonStartCommand()回调在我的服务,而不是START_STICKY使整个意图在重新启动发送。

最初我没有这样做是因为我担心如果服务正在尝试执行某项操作,那么在此过程中,服务会重新启动...它会认识到它开始执行该操作吗?我想这是我需要负责的逻辑:)


16
请添加答案并接受,而不是用答案来编辑您的问题,这样您的问题将不会出现在未回答的问题集中-谢谢。
戴尔·威尔逊

2
只是给有类似问题的人的笔记。我发现,通常当我得到错误intentnullonStartCommand(),它是由一些其他错误是可见的logcat此之前造成的。我不知道为什么,但这是我观察到的,很容易忽略它。
Piotr Chojnacki

2
@DaleWilson我会的,但这个问题并未得到真正解决。直到收到关于为什么Intent为null或如何避免不使用null意图而不求助于使用START_REDELIVER_INTENT的明确答案(我后来了解到,这不是我所需要的,但仍然可以解决某些人的问题,因此我离开了编辑)我不能接受答案。
rf43 2013年

@Mosquito您是否恰巧注意到发生了什么错误?
rf43 2013年

1
@DDoSAttack并不重要。以我为例NullPointerException,它位于“活动”之一中的某个位置。后来又是其他错误。但是在两种情况下,我的堆栈跟踪都表明我的服务(在发生此错误时正在运行intentnull与您的情况相同。当我决定向上滚动堆栈跟踪并且似乎在顶部某个地方出现了我的真正错误时,我一直在思考什么地方出了问题。解决这一问题后,也null intent消失了。
Piotr Chojnacki

Answers:


50

我很惊讶没有讨论传入的标志。我将使用以下内容在日志中进行监视:

if (null == intent || null == intent.getAction ()) {
        String source = null == intent ? "intent" : "action";
        Log.e (TAG, source + " was null, flags=" + flags + " bits=" + Integer.toBinaryString (flags));
        return START_STICKY;
}

更新:标志为0,所以没有可操作的地方。我将null检查留在了那里,而没有任何功能损失。

编辑:好的,我在所有地方的START_STICKY文档中找到了它!“如果没有任何待处理的启动命令要传递给服务,则将使用空意图对象调用该命令,因此您必须注意进行检查。”

http://developer.android.com/reference/android/app/Service.html


6
在Kotlin中,该意图被标记为非空,并且使该应用程序崩溃override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {}
Muhammad Naderi'Aug

@MuhammadNaderi,您可以发声Intent?。为我工作。但是,当然,您需要正确处理空意图。
Patrick Boos

@PatrickBoos But then of course you need to correctly handle null intent; 你什么意思?!怎么样?谢谢。
Dr.jacky

我的意思是只在您的代码中使其onStartCommand(intent: Intent?, ...)起作用。然后只是不做intent!!而要正确检查intent是否为null。
Patrick Boos
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.