我的问题可能是服务的误解和我对它们的使用,或者与其他应用程序的位置冲突。当我开始一个特定的活动时,我开始了两个后台服务 - 定位跟踪以提供距离,以及已经过的计时器,这两个服务都通过BroadcastReceiver
传递给活动。我开始通过Intent
对象与Long
每个服务从我小学Activity
:导致崩溃的后台服务
if (!Utils.isServiceRunning(this, TrackService.class)) {
Intent i = new Intent(this, TrackService.class);
i.putExtra("SUB_ID", submissionID);
startService(i);
}
而且我用下面的代码来检测,如果该服务已在运行:
public static boolean isServiceRunning(Activity activity, Class<?> serviceClass) {
ActivityManager manager = (ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if (serviceClass.getName().equals(service.service.getClassName())) {
return true;
}
}
return false;
}
的onStartCommand
的例子如下:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
submissionID = intent.getLongExtra("SUB_ID", 0L);
// I then use this submissionID to get other data
super.onStartCommand(intent, flags, startId);
return START_STICKY;
}
在某些设备上,这似乎完美工作 - 服务(S)工作ks在后台,允许我在应用程序中使用其他活动&也可以进出应用程序,当我下次打开我的特定活动时,距离和时间会更新并更正。
但是,我收到很多崩溃报告,并且用户的传闻证据表明它在甩掉我的应用程序以使用相机之后(我尚未确定在使用其他应用程序时是否发生了崩溃应用程序,或者当他们重新进入我的应用程序):
Fatal Exception: java.lang.RuntimeException: Unable to start service [email protected] with null: java.lang.NullPointerException: Attempt to invoke virtual method 'long android.content.Intent.getLongExtra(java.lang.String, long)' on a null object reference
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3149)
at android.app.ActivityThread.access$2500(ActivityThread.java:165)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1515)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5669)
at java.lang.reflect.Method.invoke(Method.java)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
Caused by java.lang.NullPointerException: Attempt to invoke virtual method 'long android.content.Intent.getLongExtra(java.lang.String, long)' on a null object reference
at edu.cornell.birds.ebird.services.TrackService.onStartCommand(TrackService.java:102)
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3112)
at android.app.ActivityThread.access$2500(ActivityThread.java:165)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1515)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5669)
at java.lang.reflect.Method.invoke(Method.java)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
在我看来,由于某种原因该服务被停止和重新启动不能从目的访问数据时(我的理解一个空指针错误是什么)。这是因为我返回START_STICKY
它在重新启动时返回空数据?
有谁知道服务应该停止的任何原因吗?我怎样才能防止这种情况发生?
我无法重新使用我自己的设备(Moto G4,Android 7.0),它的工作原理与我所希望的一样。
你的'TrackService'类中有一个NullPointer在行号** 102 ** – SripadRaj
可能重复[什么是NullPointerException,我该如何解决它?](https://stackoverflow.com/questions/218384)/what-is-a-nullpointerexception-and-how-do-i-fix-it) – SripadRaj
我的主要问题是“为什么服务应该停止”,这导致了NullPointer(我知道它是什么)。 – iaindownie