在onStartCommand中传递的Intent为NULL的原因

时间:2011-12-07 19:38:29

标签: android android-intent android-service

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

此外,当系统重新启动服务时,Intent.getAction()方法有时会返回NULL。仅getAction()

意图不是NULL

我也问了here,但还没有收到答案。

更新:与Mark Murphy聊天后,他建议我在我的服务START_REDELIVER_INTENT回调中返回onStartCommand()而不是START_STICKY,以便整个意图在重启后发送。

我最初没有这样做,因为我担心如果服务试图做某事,那么在服务重新启动的那个中间......它会认识到它开始做那件事吗?我想这是我需要负责的逻辑:)

2 个答案:

答案 0 :(得分:45)

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

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所以那里没有任何可操作的东西。我已经将空检查留在那里而没有丢失功能。

编辑:好的,我在所有地方的START_STICKY文档中找到了它! “如果没有任何挂起的启动命令要传递给服务,它将使用空的intent对象调用,因此您必须注意检查这一点。”

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

答案 1 :(得分:0)

在回调中返回 START_REDELIVER_INTENT

    public int onStartCommand(Intent intent, int flags, int startId) {

        // your service code here

        return android.app.Service.START_REDELIVER_INTENT; // make sure restart delivers the intent
    }

这是一个意外的默认值,大多数情况下您不需要 START_STICKY 而是 START_REDELIVER_INTENTSTART_REDELIVER_INTENT 是预期的行为。