除了系统通过诸如onStartCommand(Intent, int, int)
之类的标志重新启动服务之外,传递给START_STICKY
的Intent是否还有其他原因?
此外,当系统重新启动服务时,Intent.getAction()
方法有时会返回NULL。仅getAction()
我也问了here,但还没有收到答案。
更新:与Mark Murphy聊天后,他建议我在我的服务START_REDELIVER_INTENT
回调中返回onStartCommand()
而不是START_STICKY
,以便整个意图在重启后发送。
我最初没有这样做,因为我担心如果服务试图做某事,那么在服务重新启动的那个中间......它会认识到它开始做那件事吗?我想这是我需要负责的逻辑:)
答案 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_INTENT
。 START_REDELIVER_INTENT
是预期的行为。