我正在努力解决在后台运行MQTT ServiceConnection的Android应用程序的持续性问题。当我切换到具有全屏表面的其他应用程序(游戏,全屏幕上的youtube等)时,应用程序在尝试再次将其置于前面时完全冻结。如果从抽屉关闭,它甚至拒绝重新启动。该应用程序除非完全被杀,否则不会重新打开。奇怪的是,如果我通过调试器运行应用程序,它可以很好地工作。这使问题难以处理。我在每个生命周期方法的开头都进行了打印,甚至在调用超类方法之前。当应用程序挂起时,它们都不会打印出来,这暗示它会在系统级别挂起一些位置。 现在,如果我在onStop方法上调用stopService,它可以正常工作,但是在背景上无法实现持久服务。我也在onStop上调用了unbindService,但它没有帮助。所有其他应用程序一切正常,即使你没有在全屏使用管。 对MQTT库的依赖是
compile 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.0.2'
这是我的onStop()方法
@Override
protected void onStop() {
FirebaseUserActions.getInstance().end(getIndexApiAction0());
if(mBoundToService) {
try {
unbindService(serviceConnection);
mBoundToService = false;
}
catch (Exception e)
{
e.printStackTrace();
}
}
super.onStop();
}
onStart()方法就是这样:
@Override
protected void onStart() {
Log.d(TAG, "onStart has been called");
super.onStart();
if(!mBoundToService) {
bindService(mqttIntent, serviceConnection, Context.BIND_AUTO_CREATE);
}
FirebaseUserActions.getInstance().start(getIndexApiAction());
}
但这永远不会被召唤。从日志中我可以看到MQTT服务正在接收消息并且不会产生错误。即使应用程序被挂起,也会继续收到消息,因此后台服务处于活动状态并且正在运行。 内联的Service连接类如下所示:
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder binder)
{
mqttService = ((MQTTService.MyBinder) binder).getService();
mBoundToService = true;
Log.d(TAG,"MQTT service has been bound");
Handler handler = getHandler();
//NOTIFY THE LOGIN ACTIVITY THAT THE DATA HAS BEEN ACQUIRED
Message msg = handler.obtainMessage(Utils.HANDLE_MQTT_SERVICE_CONNECTED);
Bundle bundle = new Bundle();
bundle.putString(Utils.KEY_MQTT_SERVICE_BOUND,"Everything is complete");
msg.setData(bundle);
handler.sendMessage(msg);
}
@Override
public void onServiceDisconnected(ComponentName name) {
mBoundToService = false;
Log.d(TAG, "MQTT service has been UNbound");
}
};
MQTT服务从onCreate()开始:
mqttIntent = new Intent(getApplicationContext(), MQTTService.class);
if(!mBoundToService){
Log.d(TAG,"Starting MQTT Intent");
startService(mqttIntent);
Log.d(TAG,"Binding MQTT Service");
bindService(mqttIntent, serviceConnection, Context.BIND_AUTO_CREATE);
}
我是否遗漏了一些我应该在onStop()上做的事情,以便能够在前面全屏应用后恢复应用程序?