以显式意图启动 Android IntentService NullPointerException

Sky*_*and 3 java android android-intent android-service

我正在尝试IntentService从我的主要活动中的点击处理程序开始。我现在正在学习Intents,但还不太明白。我不确定我应该如何在这里实例化我的意图并将其传递给startService. 我不知道为什么我必须做这样的事情,Intent据我所知,这不会在我的服务中使用。我不知道如何调试这个问题。

\n\n

来自点击回调:

\n\n
    this.commute = new Commute();\n\n    locationService = new LocationService();\n    locationService.setCommute(commute);\n    // com.orm.SugarApp@8b2e18f is this.getApplicationContext() ...\n    Context context = this.getBaseContext();\n    System.out.println("!!!!!!!!!!!!!!!!!!!!!");\n    System.out.println(context);\n    Intent intent = new Intent(context, LocationService.class);\n    System.out.println(locationService);\n    System.out.println(intent);\n    locationService.startService(intent);  // <---- OFFENDING LINE\n    System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@");\n\n    chronometer.setBase(SystemClock.elapsedRealtime());\n    chronometer.start();\n    commute.start();\n
Run Code Online (Sandbox Code Playgroud)\n\n

logcat 在回溯之前,没有任何对象是null...:

\n\n
01-27 09:53:44.465    2718-2718/org.skyl.commutetracker I/System.out\xef\xb9\x95 !!!!!!!!!!!!!!!!!!!!!\n01-27 09:53:44.466    2718-2718/org.skyl.commutetracker I/System.out\xef\xb9\x95 android.app.ContextImpl@8b2e18f\n01-27 09:53:44.466    2718-2718/org.skyl.commutetracker I/System.out\xef\xb9\x95 org.skyl.commutetracker.services.LocationService@387dcc1c\n01-27 09:53:44.466    2718-2718/org.skyl.commutetracker I/System.out\xef\xb9\x95 Intent { cmp=org.skyl.commutetracker/.services.LocationService }\n01-27 09:53:44.466    2718-2718/org.skyl.commutetracker D/AndroidRuntime\xef\xb9\x95 Shutting down VM\n01-27 09:53:44.481    2718-2718/org.skyl.commutetracker E/AndroidRuntime\xef\xb9\x95 FATAL EXCEPTION: main\n
Run Code Online (Sandbox Code Playgroud)\n\n

这会导致以下回溯:

\n\n
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method \'android.content.ComponentName android.content.Context.startService(android.content.Intent)\' on a null object reference\n            at android.content.ContextWrapper.startService(ContextWrapper.java:515)\n            at org.skyl.commutetracker.MainActivity.startCommute(MainActivity.java:86)\n            at org.skyl.commutetracker.MainActivity.toggleClick(MainActivity.java:67)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0at java.lang.reflect.Method.invoke(Native Method)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0at java.lang.reflect.Method.invoke(Method.java:372)\n
Run Code Online (Sandbox Code Playgroud)\n

sch*_*ibk 5

您不想在第二行实例化 LocationService。

您可能需要使用以下其中一项:

context.bindService(intent, serviceConnection, boolean);
Run Code Online (Sandbox Code Playgroud)

或者

context.startService(intent);
Run Code Online (Sandbox Code Playgroud)

对于您的 IntentService,您需要使用 startService。绑定服务与意图服务不同。

另外,如果您想将通勤传递到意图服务中,您可能希望将其作为额外的传递到意图中。

intent.putExtra(String key, Parcelable item)
Run Code Online (Sandbox Code Playgroud)

putExtra 已重载,因此只要 Commute 对象实现所需的接口之一,它就应该可以正常工作。有关 Intent 对象的更多信息可以在http://developer.android.com/reference/android/content/Intent.html找到

您可以在此处找到有关服务的更多信息http://developer.android.com/guide/components/services.html