我的问题可能是对服务及其使用的公然误解,或者与其他应用程序的冲突。当我开始一个特定的活动时,我启动两个后台服务 - 位置跟踪以给出行驶距离,以及经过的计时器,这两个服务都通过BroadcastReceiver
。我用一个启动每项服务Long
通过Intent
我主要的对象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;
}
在某些设备上,这似乎工作得很好 - 该服务在后台运行,允许我使用应用程序中的其他活动,也可以进出应用程序,当我下次打开我的特定活动时,距离和距离时间已更新且正确。
但是,我收到了大量崩溃报告,并且来自用户的轶事证据表明,这是在退出我的应用程序后使用相机的(我尚未确定我的应用程序中的崩溃是否发生在使用其他应用程序时,或者何时发生)他们重新进入我的应用程序):
Fatal Exception: java.lang.RuntimeException: Unable to start service edu.cornell.birds.ebird.services.TrackService@3f77db78 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)
在我看来,由于某种原因,服务正在停止,并且重新启动时无法从意图访问数据(我理解什么是 NullPointer 错误)。这是因为我要回来吗START_STICKY
重启时返回空数据?
有谁知道该服务应该停止的任何原因?我怎样才能防止这种情况发生?
我无法使用自己的设备(Moto G4、Android 7.0)重新创建,但它按我希望的方式工作。