Java 该应用程序在模拟器上运行良好,但在手机上经常崩溃

Java 该应用程序在模拟器上运行良好,但在手机上经常崩溃,java,android,service,android-emulator,Java,Android,Service,Android Emulator,我在两者上都使用棉花糖,所以我不明白为什么我的应用程序在模拟器上是稳定的,但在手机上却不稳定。它可以工作,但很快就会崩溃。这是logcat: Process: com.madhatter.nat.test, PID: 28210 java.lang.RuntimeException: Unable to start service com.madhatter.nat.test.OverlayService@89014f1 with null: java.lang.NullPointerExcep

我在两者上都使用棉花糖,所以我不明白为什么我的应用程序在模拟器上是稳定的,但在手机上却不稳定。它可以工作,但很快就会崩溃。这是logcat:

Process: com.madhatter.nat.test, PID: 28210
java.lang.RuntimeException: Unable to start service com.madhatter.nat.test.OverlayService@89014f1 with null: java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Bundle android.content.Intent.getExtras()' on a null object reference
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3045)
at android.app.ActivityThread.-wrap17(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1452)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5443)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Bundle android.content.Intent.getExtras()' on a null object reference
at com.madhatter.nat.test.OverlayService.onStartCommand(OverlayService.java:45)
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3028)
at android.app.ActivityThread.-wrap17(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1452) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5443) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
以及OverlyService中的onStart命令:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    item = intent.getExtras().getParcelable(DataItemAdapter.ITEM_KEY);
    if (item == null) {
        throw new AssertionError("Null data item received!");
    } else {
        getImageDrawable();
    }
    return START_STICKY;
}
第45行以“项目”开头。 如果能给我一些建议,我将不胜感激。如果需要,我可以发布更多代码。谢谢

编辑:使用开始\重新提交\意图的Logcat

01-10 09:18:09.144 1840-7536/? I/WindowState: WIN DEATH: Window{6594f29 u0 com.madhatter.nat.test/com.madhatter.nat.test.MainActivity}
01-10 09:18:09.147 1840-7538/? I/WindowState: WIN DEATH: Window{cee56ff u0 com.madhatter.nat.test}
01-10 09:18:09.151 1840-6620/? I/WindowState: WIN DEATH: Window{26fc259 u0 com.madhatter.nat.test}
01-10 09:18:09.154 1840-7539/? I/ActivityManager: Process com.madhatter.nat.test (pid 29128) has died
01-10 09:18:09.154 1840-7539/? W/ActivityManager: Scheduling restart of crashed service com.madhatter.nat.test/.OverlayService in 32668ms
01-10 09:18:09.157 1840-3383/? W/InputDispatcher: channel '7370c7b com.madhatter.nat.test/com.madhatter.nat.test.SelectionPage (server)' ~ Consumer closed input channel or an error occurred.  events=0x9
01-10 09:18:09.157 1840-3383/? E/InputDispatcher: channel '7370c7b com.madhatter.nat.test/com.madhatter.nat.test.SelectionPage (server)' ~ Channel is unrecoverably broken and will be disposed!
01-10 09:18:09.157 1840-3383/? W/InputDispatcher: channel 'dc69e50 com.madhatter.nat.test/com.madhatter.nat.test.LauncherPage (server)' ~ Consumer closed input channel or an error occurred.  events=0x9
01-10 09:18:09.157 1840-3383/? E/InputDispatcher: channel 'dc69e50 com.madhatter.nat.test/com.madhatter.nat.test.LauncherPage (server)' ~ Channel is unrecoverably broken and will be disposed!
01-10 09:18:09.159 1840-4579/? I/WindowState: WIN DEATH: Window{dc69e50 u0 com.madhatter.nat.test/com.madhatter.nat.test.LauncherPage}
01-10 09:18:09.159 1840-4579/? W/InputDispatcher: Attempted to unregister already unregistered input channel 'dc69e50 com.madhatter.nat.test/com.madhatter.nat.test.LauncherPage (server)'
01-10 09:18:09.162 1840-1851/? I/WindowState: WIN DEATH: Window{7370c7b u0 com.madhatter.nat.test/com.madhatter.nat.test.SelectionPage}
01-10 09:18:09.162 1840-1851/? W/InputDispatcher: Attempted to unregister already unregistered input channel '7370c7b com.madhatter.nat.test/com.madhatter.nat.test.SelectionPage (server)'
01-10 09:18:41.843 1840-1854/? I/ActivityManager: Start proc 32159:com.madhatter.nat.test/u0a125 for service com.madhatter.nat.test/.OverlayService
01-10 09:18:41.906 32159-32159/? W/System: ClassLoader referenced unknown path: /data/app/com.madhatter.nat.test-2/lib/arm

我建议您首先检查您的意图是否为空,然后执行相关操作,如

if(intent != null){
    item = intent.getExtras().getParcelable(DataItemAdapter.ITEM_KEY);
    if (item == null) {
       throw new AssertionError("Null data item received!");
    } else {
       getImageDrawable();
    } 
}

有一段时间,只要系统自身被破坏,系统就会重新启动粘性服务,因此可能意图为空。以下是从
onStartCommand()
返回
START\u STICKY
时发生的情况:

如果此服务的进程在启动时(从onStartCommand(Intent,int,int)返回后)被终止,则将其保持在已启动状态,但不保留此已交付的意图。稍后,系统将尝试重新创建服务。因为它处于started状态,它将保证在创建新的服务实例后调用onStartCommand(Intent,int,int);如果没有任何挂起的start命令要传递给服务,则将使用null intent对象调用它,因此您必须注意检查是否存在此问题

这正是在您的情况下发生的情况,您会得到
intent
参数的
null
。您应该检查
null
,或者返回
START\u REDELIVER\u INTENT
,其行为如下:

如果此服务的进程在启动时(从onStartCommand(Intent,int,int)返回后)被终止,则将计划重新启动该服务,并通过onStartCommand(Intent,int,int)再次将上次传递的意图传递给它


可能是重复的,谢谢。检查null没有帮助。然而,返回START\u REDELIVER\u意图需要注意一点:有一个初始崩溃。然后,服务会在一段时间后再次启动,并且不会再次崩溃。有什么想法吗?:)看起来,一开始,我们不需要在第一次调用onStartCommand时成功返回START\u REDELIVER\u意图。所以是第一次崩溃。该服务在我的设备上而不是在我的模拟器上崩溃的原因是该服务被终止,以便为其他应用程序提供可用内存。解决方案是作为前台启动服务。我使用的doc非常感谢你们的帮助,因为它为我指明了正确的方向。不是每个服务都应该作为前台服务运行,我更愿意称之为解决方法,而不是解决方案。你是说你第一次启动服务的目的是想让它崩溃吗?这没有多大意义,通常在第一次跑步时应该有一个意图。好的,我会把你的答案标记为正确的,因为它很清楚。我会检查我的代码,我相信我会找出不正确的地方。