This是一个已知的令人讨厌的2年Android漏洞。
我的问题是除了修改Android源代码并再次编译之外,有没有人知道这个问题的解决方法?
这是我的代码,为了完成:
提升NPE的My Service子类方法:
/** Shows notification of started service */
private void doStartForeground() {
// Prepare notification
final NotificationHelper nh = doNotification("Service started");
// Start foreground
startForeground(nh.getNotificationId(), nh.getNotification());
}
从onCreate()
方法覆盖调用此方法。
和JUnit测试方法:
public void test1() throws InterruptedException {
assertTrue(context != null);
final Intent service = new Intent();
service.setComponent(new ComponentName(CoreService.PACKAGE_NAME,
CoreService.SERVICE_FULL_NAME));
IBinder binder = bindService(service);
assertTrue(binder != null);
}
堆栈跟踪:
java.lang.NullPointerException
at android.app.Service.startForeground(Service.java:631)
at com.blablabla.android.core.CoreService.doStartForeground(CoreService.java:82)
at com.blablabla.android.core.CoreService.onCreate(CoreService.java:149)
at android.test.ServiceTestCase.bindService(ServiceTestCase.java:234)
at com.blablabla.android.core.test.MainTest.test1(MainTest.java:37)
at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:537)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1551)
服务正常启动,并且在未通过Android的JUnit运行时工作正常。
答案 0 :(得分:6)
我最终在我的服务中添加了一个新的静态字段:
/** JUNIT - this is for testing purposes only */
public static boolean isJUnit = false;
并使用onCreate()
方法检查:
// Start the service as foreground (Android should not kill this
// service)
if (!isJUnit) {
doStartForeground();
}
然后我从JUnit的setUp()
:
@Override
protected void setUp() throws Exception {
super.setUp();
// More setup
MyServiceClass.isJUnit = true;
}
不是最优雅的解决方案,但让我摆脱封锁。