我想我一点都不清楚,我确实希望服务能够持续存在,即使主要活动是通过用户操作销毁的,或者android系统也会这样做,它做得很好,但是当应用程序在某些时候重新打开时,我会想检查是否存在bg活动,并提前使用操作按钮THX停止它。
我启动后台服务,在我的MainActivity
我可以停止它并重新运行它,当应用程序从正在运行的应用程序列表中关闭时服务仍然存在,问题是当我重新启动已关闭的应用程序时尝试使用按钮停止服务我有应用程序崩溃,因为它显然试图停止一个不再有引用的服务。
private void startBg(){
if (!hasPermissions() || mScanning) {
return;
}
clearLogs();
BgServiceIntent = new Intent(MainActivity.this, BgScanService.class);
startService(BgServiceIntent);
}
private void stopBg(){
stopService(BgServiceIntent);
}
重新打开应用后调用stopBg()
失败,因为BgServiceIntent
不再指向此服务,因此我明白了:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: mobile.link.imbera.apsys.imberalink, PID: 20104
java.lang.NullPointerException
at android.app.ContextImpl.validateServiceIntent(ContextImpl.java:1568)
at android.app.ContextImpl.stopServiceCommon(ContextImpl.java:1628)
at android.app.ContextImpl.stopService(ContextImpl.java:1589)
at android.content.ContextWrapper.stopService(ContextWrapper.java:499)
at mobile.link.imbera.apsys.imberalink.MainActivity.stopBg(MainActivity.java:180)
at mobile.link.imbera.apsys.imberalink.MainActivity.lambda$onCreate$1$MainActivity(MainActivity.java:124)
at mobile.link.imbera.apsys.imberalink.MainActivity$$Lambda$1.onClick(Unknown Source)
at android.view.View.performClick(View.java:4463)
at android.view.View$PerformClick.run(View.java:18770)
at android.os.Handler.handleCallback(Handler.java:808)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:5333)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
at dalvik.system.NativeStart.main(Native Method)
答案 0 :(得分:1)
如果服务已在后台运行,则需要在该服务的同一实例上调用 stopSelf()。 现在按照服务生命周期 onCreate()仅在服务的生命周期内调用一次。 每次使用新意图调用startService()时,都会调用 onStartCommand 。所以你可以做的就是通过一个标志来阻止它。
Intent BgServiceIntent = new Intent(MainActivity.this, BgScanService.class);
BgServiceIntent.putExtra("close",true);
startService(BgServiceIntent);
并在服务中。
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
boolean shouldClose=intent.getBooleanExtra("close",false);
if(shouldClose){
stopSelf();
} else {
// Continue to action here
}
return START_STICKY;
}
答案 1 :(得分:0)
也许您需要做的就是在尝试停止它之前检查它是否为null
:
private void stopBg(){
if(BgServiceIntent != null)
stopService(BgServiceIntent);
}
答案 2 :(得分:0)
首先在 START_NOT_STICKY 中启动服务。
在服务中覆盖此方法
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_NOT_STICKY;
}
并将其添加到您的MainActivity.class
中@override
private onDestroy() {
stopService(YourActiveService);
finishAffinity();
super.onDestroy()
}