使用显式意图 NullPointerException 启动 Android IntentService

Starting Android IntentService with explicit intent NullPointerException

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

来自点击回调:

    this.commute = new Commute();

    locationService = new LocationService();
    locationService.setCommute(commute);
    // com.orm.SugarApp@8b2e18f is this.getApplicationContext() ...
    Context context = this.getBaseContext();
    System.out.println("!!!!!!!!!!!!!!!!!!!!!");
    System.out.println(context);
    Intent intent = new Intent(context, LocationService.class);
    System.out.println(locationService);
    System.out.println(intent);
    locationService.startService(intent);  // <---- OFFENDING LINE
    System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@");

    chronometer.setBase(SystemClock.elapsedRealtime());
    chronometer.start();
    commute.start();

logcat 在回溯之前,none 个对象是 null...:[=​​19=]

01-27 09:53:44.465    2718-2718/org.skyl.commutetracker I/System.out﹕ !!!!!!!!!!!!!!!!!!!!!
01-27 09:53:44.466    2718-2718/org.skyl.commutetracker I/System.out﹕ android.app.ContextImpl@8b2e18f
01-27 09:53:44.466    2718-2718/org.skyl.commutetracker I/System.out﹕ org.skyl.commutetracker.services.LocationService@387dcc1c
01-27 09:53:44.466    2718-2718/org.skyl.commutetracker I/System.out﹕ Intent { cmp=org.skyl.commutetracker/.services.LocationService }
01-27 09:53:44.466    2718-2718/org.skyl.commutetracker D/AndroidRuntime﹕ Shutting down VM
01-27 09:53:44.481    2718-2718/org.skyl.commutetracker E/AndroidRuntime﹕ FATAL EXCEPTION: main

这会导致以下追溯:

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
            at android.content.ContextWrapper.startService(ContextWrapper.java:515)
            at org.skyl.commutetracker.MainActivity.startCommute(MainActivity.java:86)
            at org.skyl.commutetracker.MainActivity.toggleClick(MainActivity.java:67)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)

您无需创建服务对象来启动它您只需使用 context 来启动它

Intent intent = new Intent(context, LocationService.class);
context.startService(intent);

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

您可能希望使用以下其中一项:

context.bindService(intent, serviceConnection, boolean);

context.startService(intent);

对于您的 IntentService,您可能希望使用 startService。绑定服务不同于意图服务。

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

intent.putExtra(String key, Parcelable item)

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

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