java My app在正面全屏应用程序后冻结
我正在努力解决在后台运行MQTT ServiceConnection的Android应用程序的持久问题。当我切换到另一个具有全屏界面的应用程序(游戏、全屏上的youtube等)时,当我再次尝试将其置于前端时,该应用程序会完全冻结。如果从抽屉关闭,它甚至拒绝重新启动。除非完全关闭,否则应用程序不会重新打开。奇怪的是,如果我通过调试器运行应用程序,它会工作得很好。这使这个问题很难处理。在每个生命周期方法的开始,甚至在调用超级类方法之前,我就已经打印了。当应用程序挂起时,它们都不会被打印出来,这暗示着它在系统级的某些地方挂起。 现在,如果我调用stopService-at-onStop方法,它可以正常工作,但无法实现在后台提供持久服务的目的。我也在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服务正在接收消息,并且没有产生错误。即使应用程序被挂起,也会继续收到消息,以便后台服务处于活动状态并运行。 内联服务连接类如下所示:
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()上做的事情,以便在前面有了全屏应用程序之后能够恢复应用程序
共 (0) 个答案