我知道这个问题之前已经被问过,但是我看过所有能找到的答案,仍然无法解决这个问题。
问题在于当广播接收器启动IntentService时,onHandleIntent()方法没有被调用。奇怪的是构造函数确实运行了(我可以通过日志输出看到)。这是我的代码:
NoLiSeA.class (这个类包含启动我的服务的广播接收器)
public void toProcess(StatusBarNotification sbn) {
LocalBroadcastManager.getInstance(this).registerReceiver(notificationForwarder, new IntentFilter("to_forward"));
Intent intent = new Intent("to_forward");
intent.putExtra("sbn", sbn);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
Log.i("NoLiSe.TAG", "toProcess");
}
private BroadcastReceiver notificationForwarder = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("NoLiSe.TAG", "BroadCastReceiver.onReceive");
Intent i = new Intent(context, CoreTwoA.class);
i.putExtras(intent);
startService(i);
}
}
};
CoreTwoA.class (这是IntentService。由于控制台中没有日志文本,我无法看到onHandleIntent()被调用。)
public class CoreTwoA extends IntentService {
private TextToSpeech mtts;
public CoreTwoA() {
super("TheCoreWorker");
Log.d("source", "exception", new Exception());
Log.i("CoreTwoA.TAG", "Constructor");
}
@Override
protected void onHandleIntent(Intent intent) {
Log.i("CoreTwoA.TAG", "onHandleIntent");
}
}
AndroidManifest.xml
<service
android:name=".CoreTwoA"
android:label="@string/service_name"
android:exported="false">
</service>
更新
根据下面的讨论,我能够将问题缩小到BroadCastReceiver中以下代码行:
i.putExtra("sbn", sbn)
如果我不添加额外内容到意图中,也就是移除它,那么我的IntentService中的onHandleIntent()方法会运行。如果包含它,则onHandleIntent()不会运行,并且我的IntentService构造函数中的Log.d()会将以下内容写入logcat。
06-10 19:40:35.355 25094-25094/com.dezainapps.myapp D/source: exception
java.lang.Exception
at com.dezainapps.myapp.CoreTwoA.<init>(CoreTwoA.java:20)
at java.lang.Class.newInstance(Native Method)
at android.app.ActivityThread.handleCreateService(ActivityThread.java:2859)
at android.app.ActivityThread.-wrap4(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1427)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
06-10 19:40:35.355 25094-25094/com.dezainapps.myapp I/CoreTwoA.TAG: Constructor
有什么想法,为什么通过Intent传递实现Parcelable接口的StatusBarNotification对象到IntentService不起作用? 有趣的是,通过意图从我的toProcess()方法广播相同的StatusBarNotfication sbn对象(请参见代码)确实有效。
notificationForwarder
实际运行?也许您忘记注册接收器了。当onStartCommand
没有执行或反之亦然时,该服务不会启动。您还可以尝试在构造函数中执行Log.d("source", "", new Exception())
以找出是什么创建了它。 - zaplnew Exception()
,然后查看当前堆栈跟踪。 - zaplStatusBarNotification
的编组/解组失败了。您应该在logcat中看到相关信息。 - David Wasser